Foxnic-SQL(八)——DAO特性:数据查询概述Foxnic-SQL的DAO对象包含非常丰富的查询功能,可以查询记录和数据实体(宝对象),单值。已为不同的数据库DAO对象实现默认分页功能。DAO中的所有查询方法都支持SQL字符串查询和SQL对象查询。让我们仔细看看这些函数。本文中的示例代码都可以在https://gitee.com/LeeFJ/foxnic-samples项目中找到。QueryRecordSetJDBC查询默认返回ResultSet(游标)。由于打开的ResultSet会占用资源,DAO会先将数据dump到RcdSet中。RcdSet是一个记录集。没有Po模型的时候直接使用RcdSet很方便。本节不对RcdSet进行展开,我们将在后面的章节中单独讲解如何使用RcdSet。记录集查询包括两种查询方式:分页和非分页。我们来看看常规的非分页查询方式:/***1.查询非分页记录集**/publicstaticvoidqueryRcdSetNoPage(){//通过DBInstance获取DAO对象Datedate=DateUtil.addDays(newDate(),-1000);DAOdao=DBInstance.DEFAULT.dao();//执行查询RcdSetrs=dao.query("select*fromsys_rolewherecreate_time>?",date);诠释我=0;//遍历数据for(Rcdr:rs){System.out.println(i+"-"+r.toJSONObject());我++;}//DAO创建查询语句rs=dao.select().from("sys_role").where("create_time>?",date).top().query();我=0;//遍历数据for(Rcdr:rs){System.out.println(i+"-"+r.toJSONObject());我++;}}下例为分页查询记录集:/***2.查询分页记录集**/publicstaticvoidqueryRcdSetPaginated(){//通过DBInstance获取DAO对象Datedate=DateUtil.addDays(newDate(),-1000);DAOdao=DBInstance.DEFAULT.dao();//指定页面大小IntegerpageSize=10;//模拟翻页动作:普通查询for(intpageIndex=0;pageIndex<10;pageIndex++){//执行分页查询RcdSetrs=dao.queryPage("select*fromsys_resourzewherecreate_time>?",pageSize,pageIndex,date);诠释我=0;//遍历数据for(Rcdr:rs){System.out.println("page"+pageIndex+"."+i+"-"+r.toJSONObject());我++;}//输出分页信息System.out.println("总行数="+rs.getTotalRowCount()+";总页数="+rs.getPageCount()+";pageIndex="+rs.getPageIndex()+";pageSize="+rs.getPageSize());}//模拟翻页,QueryableSQLqueryfor(intpageIndex=0;pageIndex<10;pageIndex++){//执行分页查询,QueryableSQLRcdSetrs=dao.expr("select*fromsys_resourzewherecreate_time>?",date).queryPage(pageSize,pageIndex);诠释我=0;//遍历数据for(Rcdr:rs){System.out.println("页面"+pageIndex+"."+i+"-"+r.toJSONObject());我++;}//输出分页信息System.out.println("totalrows="+rs.getTotalRowCount()+";totalpages="+rs.getPageCount()+";pageIndex="+rs.getPageIndex()+";pageSize="+rs.getPageSize());}}上面两个例子中使用了QueryableSQL查询,QueryableSQL是一个可查询的SQL对象接口。所有实现了QueryableSQL接口的类都可以执行查询相关的方法来查询单条记录很多时候,我们需要查询单条记录,比如通过ID查询。当DAO对象查询单条记录时,如果SQL语句返回多行,默认返回第一行。示例如下:/***3.查询单条记录**/publicstaticvoidquerySingleRcd(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();字符串roleId="631081950060216320";//常规方式查询Rcdr=dao.queryRecord("select*fromsys_rolewhereid=?",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());}查询单值除了返回单条记录,有时候我们也想返回单值,比如计数统计等。当DAO对象查询单个值,如果SQL语句返回多行多列,则默认第一行第一列的值。示例如下:/***4.查询单个值**/publicstaticvoidquerySingleValue(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();字符串roleId="631081950060216320";//正则查询Integercount=dao.queryInteger("selectcount(1)fromsys_rolewhereid=?",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对象(手动或自动),那么查询Po会更加方便易用直接通过DAO。当然,Po对象和记录各有优势。Po是固化模型,有利于编程,而records主要体现动态,适用于一些配置复杂的场景。大家可以根据实际场景选择。实体查询也支持分页和非分页,先来看看非分页查询:/***5.查询非分页实体集**/publicstaticvoidqueryPoListNoPage(){//获取DAO对象Date日期通过DBInstance=DateUtil.addDays(newDate(),-1000);DAOdao=DBInstance.DEFAULT.dao();//执行查询List
list=dao.queryEntities(Address.class,"select*fromexample_addresswherecreate_time>?",date);诠释我=0;//遍历数据for(Addressaddress:list){System.out.println(i+"-"+JSON.toJSONString(address));我++;}//DAO创建查询语句查询list=dao.select().from("example_address").where("create_time>?",date).top().queryEntities(Address.class);我=0;//遍历数据for(Addressaddress:list){System.out.println(i+"-"+JSON.toJSONString(address));我++;}}下例为分页查询实体集:/***6.查询分页实体集**/publicstaticvoidqueryPoListPaginated(){//通过DBInstance获取DAO对象Datedate=DateUtil.addDays(newDate(),-1000);DAOdao=DBInstance.DEFAULT.dao();//指定页面大小IntegerpageSize=10;//模拟翻页动作:常规方式查询for(intpageIndex=0;pageIndex<10;pageIndex++){//执行分页查询PagedListlist=dao.queryPagedEntities(Address.class,pageSize,pageIndex,"select*来自sys_resourzewherecreate_time>?",date);诠释我=0;//遍历数据for(Addressaddress:list){System.out.println(i+"-"+JSON.toJSONString(address));我++;}//输出分页信息System.out.println("totalrows="+list.getTotalRowCount()+";totalpages="+list.getPageCount()+";pageIndex="+list.getPageIndex()+";pageSize="+list.getPageSize());}//模拟翻页动作,QueryableSQLqueryfor(intpageIndex=0;pageIndex<10;pageIndex++){//执行分页查询,QueryableSQL方法IPagedListlist=dao.expr("select*fromsys_resourzewherecreate_time>?",date).queryPagedEntities(Address.class,pageSize,pageIndex);inti=0;//遍历数据for(Addressaddress:list){System.out.println(i+"-"+JSON.toJSONString(address));i++;}//输出分页信息System.out.println("totalrows="+list.getTotalRowCount()+";totalpages="+list.getPageCount()+";pageIndex="+list.getPageIndex()+";pageSize="+list.getPageSize());}}查询单个实体单个实体查询类似于单条记录查询,直接输入代码:/***7.查询单个实体**/publicstaticvoidquerySinglePo(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();StringaddressId="651345265952817152";//正常查询地址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));//示例查询address=newAddress();地址.setId(addressId);地址=dao.queryEntity(地址);System.out.println("address-3="+JSON.toJSONString(address));}总结本节主要介绍DAO在Foxnic-SQLObjects中的使用查询记录、实体、单值。同时DAO已经适配了不同数据库的分页查询。记录集(RcdSet)是DAO查询的初始数据载体。RcdSet的更多特性将在后续章节中介绍。相关项目https://gitee.com/LeeFJ/foxnichttps://gitee.com/LeeFJ/foxnic-webhttps://gitee.com/lank/eamhttps://gitee.com/LeeFJ/foxnic-samples