Foxnic-SQL (6) —— DAO 特性 : 基本信息与元数据

LeeFJ
• 阅读 426

Foxnic-SQL (6) —— DAO 特性 : 基本信息与元数据

基本信息

  DAO 对象创建后就可以使用DAO对象了,DAO 最基本的特性就是获取数据库的一些基础信息,这些信息有利于开发者在某些场景下做出正确的判断。
  本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到。
  示例代码如下:

/**
* DAO 打印基本信息
* */
public static void demo_1() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao=DBInstance.DEFAULT.dao();
    // 当前连接的 Schema
    System.out.println("schema = "+dao.getSchema());
    // 当前连接字符串
    System.out.println("url = "+dao.getUrl());
    // 当前登录的账户
    System.out.println("userName = "+dao.getUserName());
    // 输出数据库类型
    System.out.println("dbType = "+dao.getDBType());
    // 数据库 SQL 方言
    System.out.println("dialect = "+dao.getSQLDialect());
    // 数据库时间
    System.out.println("now = "+dao.getDateTime());
    // 连接标识
    System.out.println("dbId = "+dao.getDBConnectionIdentity());
    // 数据库标识
    System.out.println("dbId = "+dao.getDbIdentity());
    // 最后执行的 SQL 语句
    System.out.println("lastSQL = "+dao.getLatestSQL());
    // 最后执行的 SQL 语句
    System.out.println("lastSQLStr = "+dao.getLatestSQLString());
    // 最大查询数量限制
    System.out.println("queryLimit = "+dao.getQueryLimit());
    // 逻辑值
    System.out.println("true value in db is "+dao.getDBTreatyLogicValue(true));
    System.out.println("false value in db is "+dao.getDBTreatyLogicValue(false));
}

查询量限制

  从系统性能考虑,若要对单次查询的行数做出限制,这个限制可以通过 dao.setQueryLimit() 方法实现。如下代码所示:

// 设置最大的单次查询数量
dao.setQueryLimit(200);

  执行查询时,若返回的行数超过指定的值,程序将给出异常:

/**
* 校验单次查询数量,需要 dao.setQueryLimit() 方法设置
* */
public static void demo_3() {
    RcdSet rs=DBInstance.DEFAULT.dao().query("select * from sys_menu limit 100");
    // 异常:查询结果行数超过 queryLimit 限制,当前限制为 20
    System.out.println(rs.size());
}

元数据

  通过 DAO 可以查询到当前连接的数据库相关的元数据,如数据库中所有的表的清单、每个表的字段信息、索引信息等。

public static void demo_1() {
    // 创建DAO
    DAO dao=DBInstance.DEFAULT.dao();
    // 获得所有表名
    String[] tableNames=dao.getTableNames();
    // 遍历表名
    for (String tableName : tableNames) {
        System.out.println(tableName);
    }
    // 获得指定表的元数据
    DBTableMeta tm=dao.getTableMeta("sys_user");
    // 遍历列
    for (DBColumnMeta column : tm.getColumns()) {
        System.out.println(column.getColumn()+"\t"+column.getLabel());
    }
    // 构建索引元数据
    DBMetaData.buildIndex(dao, tm.getTableName(),tm);
    // 获得与遍历索引信息
    for (DBIndexMeta index : tm.getIndexs()) {
        System.out.println("index : "+index.getName()+",unique="+index.isUnique()+",columns="+ StringUtil.join(index.getFields()));
    }
    // 刷新特定表的元数据缓存
    dao.refreshMeta("sys_user");
    // 刷新元数据缓存
    dao.refreshMeta();
}

SQL 日志

  Foxnic-SQL 的日志输出比较细化,包括输出绑定变量未带入的SQL语句,绑定变量已代入的SQL语句,执行耗时与执行结果,调用栈等,以下是日志输出的基本样式:

┏━━━━━ SQL [ select * from sys_dict where deleted = :PARAM_1 and code = :PARAM_2 ] ━━━━━ ┣ 语句:select * from sys_dict where deleted = ? and code = ? ┣ 参数:{"PARAM_1":0,"PARAM_2":"sex"} ┣ 执行:select * from sys_dict where deleted = 0 and code = 'sex' ┣ 结果: ┣━ 耗时:28ms , start = 1670562886144 ┣━ 返回:RcdSet,size=1 ┣ 调用栈: com.leefj.foxnic.sql.demo.dao.DAO_MetaDemo.demo_4(DAO_MetaDemo.java:82) com.leefj.foxnic.sql.demo.dao.DAO_MetaDemo.main(DAO_MetaDemo.java:21) ┣ TID:null ┗━━━━━ SQL [ select * from sys_dict where deleted = :PARAM_1 and code = :PARAM_2 ] ━━━━━

  DAO 对象在初始化时可以指定是否打印SQL以及SQL打印的样式:

// 设置SQL打印
dao.setPrintSQL(true);
// 是否以简化模式打印SQL
dao.setPrintSQLSimple(true);
// 是否打印调用栈
dao.setPrintSQLCallstack(true);

  在代码执行过程中,也可以动态暂停与恢复SQL打印:

/**
* SQL 日志打印控制
* */
public static void demo_4() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao=DBInstance.DEFAULT.dao();
    // 输出日志
    dao.query("select * from sys_dict where deleted = ? and code =? ",0,"sex");
    // 在线程内暂停日志打印
    dao.pausePrintThreadSQL();
    // 无日志输出
    dao.query("select 2");
    // 继续打印日志i
    dao.resumePrintThreadSQL();
    // 输出日志
    dao.query("select 3");
}

小结

  本节主要了解了获得 DAO 对象基本信息的方法、获得元数据的方法、取数控制约束的方法以及SQL日志的相关设置与控制。

相关项目

  https://gitee.com/LeeFJ/foxnic
  https://gitee.com/LeeFJ/foxnic-web
  https://gitee.com/lank/eam
  https://gitee.com/LeeFJ/foxnic-samples

官方文档

  http://foxnicweb.com/docs/doc.html

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java中的VO DTO DAO
VO是跟数据库里表的映射,一个表对应一个VODAO是用VO来访问真实的表,对数据库的操作都在DAO中完成BO是业务层,做逻辑处理的VO,PO,BO,QO,DAO,POJOO/RMapping是ObjectRelationalMapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示
Wesley13 Wesley13
3年前
Java 全能高效 MVC & RESTful 开发框架 Portal
PortalBasic是一套功能完备的高性能FullStackWeb应用开发框架,内置可扩展的MVCWeb基础架构和DAO数据库访问组件(内部已提供了Hibernate、MyBatis与JDBCDAO组件),集成了Action拦截、Form/Dao/SpringBean装配、国际化、文件上传下载和页面静态化
Stella981 Stella981
3年前
Spring 对 DAO 的支持
一、Spring的DAO理念DAO(DataAccessObject)是用于访问数据的对象,虽然在大多数情况下将数据保存在数据库中,但这并不是唯一的选择,也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。早期,JDBC是访问数据库的主流选择。近几年,数据持久化技术获
Stella981 Stella981
3年前
Mybatis中如何将POJO作为参数传入sql
今天在工作时,需要将获取的用户的注册信息插入数据库,开始的做法是将所有的model的属性作为DAO接口的参数,后来想想不对劲,要是有100个属性,那我这个接口岂不是要有100个参数传进来?于是我就考虑将整个Model或者DTO作为DAO接口的参数,向SQL传参,具体的实现如下:  (1)定义DAO接口:1@Repository
Stella981 Stella981
3年前
Servlet里面一调用Dao里的某个方法
背景:这几天,由于项目集成的需要,我要在doFilter里调用dao层里的某些方法,可是总之报空指针,只要调用那个dao方法,就报错误。很是纳闷,网上查找了各种原因,终于让我给突破了,看来还是Java基础掌握的不够呀!代码:在servlet中加入私有变量UserDao,然后在servlet的init()方法中初始化一下即可用。
Wesley13 Wesley13
3年前
DAO 四个包的建立
一、DAO四个包的建立,降低代码之间的耦合性?  之前写代码,都是在一个包下。代码耦合性较高,不利于后期的维护。  dao(代码分层?)有利于后期的维护代码,修改方便。com.aaa.dao存放dao相关的类型处理数据库的链接存取数据。com.aaa.servlet存放serv
LeeFJ LeeFJ
1年前
Foxnic-SQL (5) —— 创建与初始化DAO
DAO对象是FoxnicSQL执行语句并返回结果的核心对象。它包含了众多方法,包括语句的执行、查询、序列、存储过程,元数据等。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。
LeeFJ LeeFJ
1年前
Foxnic-SQL (8) —— DAO 特性 : 数据查询
FoxnicSQL的DAO对象包含了非常丰富的查询功能,可以查询记录、数据实体(Po对象)、单值。针对不同的数据库DAO对象已经实现了默认的分页功能。DAO中所有的查询方法都支持SQL字符串查询、SQL对象查询。下面我们来具体看一下这些功能。
LeeFJ LeeFJ
1年前
Foxnic-SQL (11) —— DAO 特性 : 事务管理
事务管理是任何一个数据层工具所必须的,FoxnicSQL既然是基于SpringJDBC的自然默认就支持@Transactional注解,另外FoxnicSQL的DAO对象还支持手动事务。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。手动事务手动事务通过DAO对象的beginTransaction()方法、commit()方法、rollback()方法完成,下面是一个手动事务的例子:
LeeFJ LeeFJ
1年前
Foxnic-SQL (15) —— 使用记录集导入或导出Excel
很多时候,我们需要将外部Excel表中的数据导入到数据库,或是需要将某个查询结果导出到Excel文件中,对于这种简单的操作,FoxnicSQL已经内置了ExcelReader和ExcelWriter用于处理Excel数据。本文中的示例代码均可在https://gitee.com/LeeFJ/foxnicsamples项目中找到。读取Excel到RcdSetFoxnicSQL使用ExcelReader类读取Excel中某个sheet的数据,这些数据将被读取到RcdSet,通过RcdSet可以完成数据库保存等操作。在读取Excel前需要定义Excel结构,将Excel列映射到数据库字段,如下代码所示。一旦Excel数据转换成RcdSet,开发人员就可以去做其它更多额外的数据处理。