共计 5704 个字符,预计需要花费 15 分钟才能阅读完成。
Foxnic-SQL (8) —— DAO 个性 : 数据查问
概述
Foxnic-SQL 的 DAO 对象蕴含了十分丰盛的查问性能,能够查问记录、数据实体 (Po 对象)、单值。针对不同的数据库 DAO 对象曾经实现了默认的分页性能。DAO 中所有的查询方法都反对 SQL 字符串查问、SQL 对象查问。上面咱们来具体看一下这些性能。
本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 我的项目中找到。
查问记录集
默认状况下,JDBC 查问返回的是 ResultSet(游标),因为关上的 ResultSet 会占用资源,所以 DAO 会先把数据转存至 RcdSet。RcdSet 就是记录集,在没有 Po 模型时,间接应用 RcdSet 是十分不便的。本节并不对 RcdSet 进行开展,咱们前面的章节会独自解说 RcdSet 的应用办法。
记录集查问蕴含分页和不分页两种查问的模式,咱们先来看看惯例的不分页的查问模式:
/** | |
* 1、查问不分页记录集 | |
* */ | |
public static void queryRcdSetNoPage() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
Date date= DateUtil.addDays(new Date(),-1000); | |
DAO dao= DBInstance.DEFAULT.dao(); | |
// 执行查问 | |
RcdSet rs=dao.query("select * from sys_role where create_time>?",date); | |
int i=0; | |
// 遍历数据 | |
for (Rcd r : rs) {System.out.println(i+"-"+r.toJSONObject()); | |
i++; | |
} | |
// DAO 创立查问语句进行查问 | |
rs=dao.select().from("sys_role").where("create_time>?",date).top().query(); | |
i=0; | |
// 遍历数据 | |
for (Rcd r : rs) {System.out.println(i+"-"+r.toJSONObject()); | |
i++; | |
} | |
} |
上面的例子是分页查问记录集:
/** | |
* 2、查问分页记录集 | |
* */ | |
public static void queryRcdSetPaginated() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
Date date= DateUtil.addDays(new Date(),-1000); | |
DAO dao= DBInstance.DEFAULT.dao(); | |
// 指定分页大小 | |
Integer pageSize=10; | |
// 模仿翻页动作:惯例形式查问 | |
for (int pageIndex = 0; pageIndex < 10; pageIndex++) { | |
// 执行分页查问 | |
RcdSet rs=dao.queryPage("select * from sys_resourze where create_time>?",pageSize,pageIndex,date); | |
int i=0; | |
// 遍历数据 | |
for (Rcd r : rs) {System.out.println("page"+pageIndex+"."+i+"-"+r.toJSONObject()); | |
i++; | |
} | |
// 输入分页信息 | |
System.out.println("total rows ="+rs.getTotalRowCount()+"; total pages ="+rs.getPageCount()+"; pageIndex ="+rs.getPageIndex()+"; pageSize ="+rs.getPageSize()); | |
} | |
// 模仿翻页动作,QueryableSQL 形式查问 | |
for (int pageIndex = 0; pageIndex < 10; pageIndex++) { | |
// 执行分页查问,QueryableSQL 形式 | |
RcdSet rs=dao.expr("select * from sys_resourze where create_time>?",date).queryPage(pageSize,pageIndex); | |
int i=0; | |
// 遍历数据 | |
for (Rcd r : rs) {System.out.println("page"+pageIndex+"."+i+"-"+r.toJSONObject()); | |
i++; | |
} | |
// 输入分页信息 | |
System.out.println("total rows ="+rs.getTotalRowCount()+"; total pages ="+rs.getPageCount()+"; pageIndex ="+rs.getPageIndex()+"; pageSize ="+rs.getPageSize()); | |
} | |
} |
下面的两个例子中都是用了 QueryableSQL 形式查问,QueryableSQL 是一个可查问的 SQL 对象接口,所有实现 QueryableSQL 接口的类,均可执行与查问相干的办法。
查问单记录
很多场合下,咱们须要查问单个记录,例如按 ID 查问。DAO 对象在查问单个记录时,如果 SQL 语句返回多行,则默认第一行返回。示例如下:
/** | |
* 3、查问单个记录 | |
* */ | |
public static void querySingleRcd() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
DAO dao= DBInstance.DEFAULT.dao(); | |
String roleId="631081950060216320"; | |
// 惯例形式查问 | |
Rcd r=dao.queryRecord("select * from sys_role where id=?",roleId); | |
System.out.println("role-1 ="+r.toJSONObject()); | |
// QueryableSQL 形式查问 | |
r=dao.select().from("sys_role").where("id=?",roleId).top().queryRecord(); | |
System.out.println("role-2 ="+r.toJSONObject()); | |
} |
查问繁多值
除了返回单个记录,有些时候咱们也心愿返回单个值,例如 count 统计等。DAO 对象在查问单个值时,如果 SQL 语句返回多行多列,则默认第一行第一列的值。示例如下:
/** | |
* 4、查问单个值 | |
* */ | |
public static void querySingleValue() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
DAO dao= DBInstance.DEFAULT.dao(); | |
String roleId="631081950060216320"; | |
// 惯例形式查问 | |
Integer count=dao.queryInteger("select count(1) from sys_role where id=?",roleId); | |
System.out.println("count-1 ="+count); | |
// QueryableSQL 形式查问 | |
count=dao.select().select("count(1)").from("sys_role").where("id=?",roleId).top().queryInteger(); | |
System.out.println("count-2 ="+count); | |
} |
查问实体集
如果,我的项目里曾经创立了 Po 对象 (手动或主动均可),那么就间接通过 DAO 查问 Po 会显得更加不便和易于应用。当然 Po 对象和记录比各有劣势,Po 是固化的模型,利于编程,记录则次要体现它的动态性,适宜一些配置简单的场景,大家可按理论场景抉择。
实体查问同样反对分页和不分页,咱们先来看看不分页的查问:
/** | |
* 5、查问不分页实体集 | |
* */ | |
public static void queryPoListNoPage() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
Date date= DateUtil.addDays(new Date(),-1000); | |
DAO dao= DBInstance.DEFAULT.dao(); | |
// 执行查问 | |
List<Address> list=dao.queryEntities(Address.class,"select * from example_address where create_time>?",date); | |
int i=0; | |
// 遍历数据 | |
for (Address address : list) {System.out.println(i+"-"+ JSON.toJSONString(address)); | |
i++; | |
} | |
// DAO 创立查问语句进行查问 | |
list=dao.select().from("example_address").where("create_time>?",date).top().queryEntities(Address.class); | |
i=0; | |
// 遍历数据 | |
for (Address address : list) {System.out.println(i+"-"+ JSON.toJSONString(address)); | |
i++; | |
} | |
} |
上面的例子是分页查问实体集:
/** | |
* 6、查问分页实体集 | |
* */ | |
public static void queryPoListPaginated() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
Date date= DateUtil.addDays(new Date(),-1000); | |
DAO dao= DBInstance.DEFAULT.dao(); | |
// 指定分页大小 | |
Integer pageSize=10; | |
// 模仿翻页动作:惯例形式查问 | |
for (int pageIndex = 0; pageIndex < 10; pageIndex++) { | |
// 执行分页查问 | |
PagedList<Address> list=dao.queryPagedEntities(Address.class,pageSize,pageIndex,"select * from sys_resourze where create_time>?",date); | |
int i=0; | |
// 遍历数据 | |
for (Address address : list) {System.out.println(i+"-"+ JSON.toJSONString(address)); | |
i++; | |
} | |
// 输入分页信息 | |
System.out.println("total rows ="+list.getTotalRowCount()+"; total pages ="+list.getPageCount()+"; pageIndex ="+list.getPageIndex()+"; pageSize ="+list.getPageSize()); | |
} | |
// 模仿翻页动作,QueryableSQL 形式查问 | |
for (int pageIndex = 0; pageIndex < 10; pageIndex++) { | |
// 执行分页查问,QueryableSQL 形式 | |
IPagedList<Address> list=dao.expr("select * from sys_resourze where create_time>?",date).queryPagedEntities(Address.class,pageSize,pageIndex); | |
int i=0; | |
// 遍历数据 | |
for (Address address : list) {System.out.println(i+"-"+ JSON.toJSONString(address)); | |
i++; | |
} | |
// 输入分页信息 | |
System.out.println("total rows ="+list.getTotalRowCount()+"; total pages ="+list.getPageCount()+"; pageIndex ="+list.getPageIndex()+"; pageSize ="+list.getPageSize()); | |
} | |
} |
查问单实体
单实体查问和单记录查问类似,间接上代码:
/** | |
* 7、查问单个实体 | |
* */ | |
public static void querySinglePo() { | |
// 通过 DBInstance 拿到 DAO 对象 | |
DAO dao= DBInstance.DEFAULT.dao(); | |
String addressId="651345265952817152"; | |
// 惯例形式查问 | |
Address address=dao.queryEntityById(Address.class,addressId); | |
System.out.println("address-1 ="+JSON.toJSONString(address)); | |
// QueryableSQL 形式查问 | |
address=dao.select().from("sys_role").where("id=?",addressId).top().queryEntity(Address.class); | |
System.out.println("address-2 ="+JSON.toJSONString(address)); | |
// Sample 形式查问 | |
address=new Address(); | |
address.setId(addressId); | |
address=dao.queryEntity(address); | |
System.out.println("address-3 ="+JSON.toJSONString(address)); | |
} |
小结
本节次要介绍了 Foxnic-SQL 中应用 DAO 对象查问记录、实体、繁多值的办法。同时,DAO 已适配不同数据库的分页查问。记录集 (RcdSet) 是 DAO 查问最后的数据载体,对于 RcdSet 更多个性,将在后续章节进行介绍。
相干我的项目
https://gitee.com/LeeFJ/foxnic
https://gitee.com/LeeFJ/foxnic-web
https://gitee.com/lank/eam
https://gitee.com/LeeFJ/foxnic-samples