<a name="imPZx"></a>
Foxnic-SQL (6) —— DAO 特性 : 基本信息与元数据
<a name="j8HIo"></a>
基本信息
DAO 对象创建后就可以使用DAO对象了,DAO 最基本的特性就是获取数据库的一些基础信息,这些信息有利于开发者在某些场景下做出正确的判断。<br /> 本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到。<br /> 示例代码如下:
1/** 2* DAO 打印基本信息 3* */ 4public static void demo_1() { 5 // 通过 DBInstance 拿到 DAO 对象 6 DAO dao=DBInstance.DEFAULT.dao(); 7 // 当前连接的 Schema 8 System.out.println("schema = "+dao.getSchema()); 9 // 当前连接字符串 10 System.out.println("url = "+dao.getUrl()); 11 // 当前登录的账户 12 System.out.println("userName = "+dao.getUserName()); 13 // 输出数据库类型 14 System.out.println("dbType = "+dao.getDBType()); 15 // 数据库 SQL 方言 16 System.out.println("dialect = "+dao.getSQLDialect()); 17 // 数据库时间 18 System.out.println("now = "+dao.getDateTime()); 19 // 连接标识 20 System.out.println("dbId = "+dao.getDBConnectionIdentity()); 21 // 数据库标识 22 System.out.println("dbId = "+dao.getDbIdentity()); 23 // 最后执行的 SQL 语句 24 System.out.println("lastSQL = "+dao.getLatestSQL()); 25 // 最后执行的 SQL 语句 26 System.out.println("lastSQLStr = "+dao.getLatestSQLString()); 27 // 最大查询数量限制 28 System.out.println("queryLimit = "+dao.getQueryLimit()); 29 // 逻辑值 30 System.out.println("true value in db is "+dao.getDBTreatyLogicValue(true)); 31 System.out.println("false value in db is "+dao.getDBTreatyLogicValue(false)); 32}
<a name="vidkp"></a>
查询量限制
从系统性能考虑,若要对单次查询的行数做出限制,这个限制可以通过 dao.setQueryLimit() 方法实现。如下代码所示:
1// 设置最大的单次查询数量 2dao.setQueryLimit(200);
执行查询时,若返回的行数超过指定的值,程序将给出异常:
1/** 2* 校验单次查询数量,需要 dao.setQueryLimit() 方法设置 3* */ 4public static void demo_3() { 5 RcdSet rs=DBInstance.DEFAULT.dao().query("select * from sys_menu limit 100"); 6 // 异常:查询结果行数超过 queryLimit 限制,当前限制为 20 7 System.out.println(rs.size()); 8}
<a name="pMvKy"></a>
元数据
通过 DAO 可以查询到当前连接的数据库相关的元数据,如数据库中所有的表的清单、每个表的字段信息、索引信息等。
1public static void demo_1() { 2 // 创建DAO 3 DAO dao=DBInstance.DEFAULT.dao(); 4 // 获得所有表名 5 String[] tableNames=dao.getTableNames(); 6 // 遍历表名 7 for (String tableName : tableNames) { 8 System.out.println(tableName); 9 } 10 // 获得指定表的元数据 11 DBTableMeta tm=dao.getTableMeta("sys_user"); 12 // 遍历列 13 for (DBColumnMeta column : tm.getColumns()) { 14 System.out.println(column.getColumn()+"\t"+column.getLabel()); 15 } 16 // 构建索引元数据 17 DBMetaData.buildIndex(dao, tm.getTableName(),tm); 18 // 获得与遍历索引信息 19 for (DBIndexMeta index : tm.getIndexs()) { 20 System.out.println("index : "+index.getName()+",unique="+index.isUnique()+",columns="+ StringUtil.join(index.getFields())); 21 } 22 // 刷新特定表的元数据缓存 23 dao.refreshMeta("sys_user"); 24 // 刷新元数据缓存 25 dao.refreshMeta(); 26}
<a name="taq3i"></a>
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打印的样式:
1// 设置SQL打印 2dao.setPrintSQL(true); 3// 是否以简化模式打印SQL 4dao.setPrintSQLSimple(true); 5// 是否打印调用栈 6dao.setPrintSQLCallstack(true);
在代码执行过程中,也可以动态暂停与恢复SQL打印:
1/** 2* SQL 日志打印控制 3* */ 4public static void demo_4() { 5 // 通过 DBInstance 拿到 DAO 对象 6 DAO dao=DBInstance.DEFAULT.dao(); 7 // 输出日志 8 dao.query("select * from sys_dict where deleted = ? and code =? ",0,"sex"); 9 // 在线程内暂停日志打印 10 dao.pausePrintThreadSQL(); 11 // 无日志输出 12 dao.query("select 2"); 13 // 继续打印日志i 14 dao.resumePrintThreadSQL(); 15 // 输出日志 16 dao.query("select 3"); 17}
<a name="rxnTm"></a>
小结
本节主要了解了获得 DAO 对象基本信息的方法、获得元数据的方法、取数控制约束的方法以及SQL日志的相关设置与控制。 <a name="VZBg5"></a>
相关项目
https://gitee.com/LeeFJ/foxnic<br /> https://gitee.com/LeeFJ/foxnic-web<br /> https://gitee.com/lank/eam<br /> https://gitee.com/LeeFJ/foxnic-samples
