bboss持久层分页接口使用示例

ぐ巨炮叔叔 提交于 2019-12-02 07:08:34
bboss持久层分页接口比较有特色,提供了四种Style的分页接口: 
第一种Style 根据sql语句直接分页,这种风格是bboss 3.6.0及之前版本一直沿用的接口 
第二种Style 根据sql语句和外部传入的总记录数进行分页,这是bboss 3.6.1及之后版本提供的接口 
第三种Style 根据sql语句和外部传入的总记录数sql语句进行分页,这是bboss 3.6.1及之后版本提供的接口 
第四种Style 使用数据库row_number() over()分析函数结合排序条件实现数据库物理分页 

前三种style的支持oracle,mysql,maradb,sqlite,postgres四个主流数据库的高效物理分页,其他数据采用游标机制实现分页(效率相对较低);第4种风格支持oracle,mysql,maradb,sqlite,postgres,derby,ms sql server 2008,db2数据库的高效物理分页(其他类型数据库请采用前面三种风格进行分页) 

我们根据查询参数的传入方式,分别下面举例介绍四种Style。 
1.准备工作-编写一个sql语句配置文件,用来演示四种Style 
queryMaterialList为分页sql 
queryCountMaterialList为查总记录数sql 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <properties>  
  3.     <property name="queryMaterialList">  
  4.     <![CDATA[ 
  5.         select * from td_app_bom where id=#[id] 
  6.         ]]>  
  7.     </property>  
  8.       
  9.     <property name="queryCountMaterialList">  
  10.     <![CDATA[ 
  11.         select count(1) from td_app_bom where id=#[id] 
  12.         ]]>  
  13.     </property>  
  14.       
  15.       
  16.     <property name="queryMaterialListbindParam">  
  17.     <![CDATA[ 
  18.         select * from td_app_bom where id=? 
  19.         ]]>  
  20.     </property>  
  21.       
  22.     <property name="queryCountMaterialListbindParam">  
  23.     <![CDATA[ 
  24.         select count(1) from td_app_bom where id=? 
  25.         ]]>  
  26.     </property>  
  27.   
  28.   
  29.     <property name="testsqlinfo"><![CDATA[select * from TD_APP_BOM]]></property>  
  30.   
  31.     <property name="ROW_NUMBERquery"><![CDATA[select * from TD_APP_BOM where 1=1  
  32.             #if($bm && !$bm.equals("")) 
  33.                 and bm = #[bm] 
  34.             #end 
  35.             #if($app_name_en && !$app_name_en.equals("")) 
  36.                 and app_name_en like #[app_name_en] 
  37.             #end 
  38.             #if($app_name && !$app_name.equals("")) 
  39.                 and app_name like #[app_name] 
  40.             #end 
  41.             #if($soft_level && !$soft_level.equals("")) 
  42.                 and soft_level=#[soft_level] 
  43.             #end 
  44.             #if($state && !$state.equals("")) 
  45.                 and state=#[state] 
  46.             #end 
  47.             #if($rd_type && !$rd_type.equals("")) 
  48.                 and rd_type=#[rd_type] 
  49.             #end ]]></property>  
  50.   
  51.     <property name="ROW_NUMBERquery_orderby"><![CDATA[ 
  52.             #if($sortKey && !$sortKey.equals("")) 
  53.                 order by $sortKey  
  54.                 #if($sortDESC ) 
  55.                     desc 
  56.                 #else 
  57.                     asc 
  58.                 #end     
  59.             #else 
  60.                 order by bm  
  61.             #end]]></property>  
  62. </properties>  


2.分页查询方法示例代码 
Java代码   收藏代码
  1. public class ApplyService {  
  2.   
  3.     private com.frameworkset.common.poolman.ConfigSQLExecutor executor = new ConfigSQLExecutor("com/frameworkset/sqlexecutor/purchaseApply.xml");  
  4.       
  5.     /*******************************以bean方式传递查询条件开始*******************************/  
  6.     public ListInfo queryMaterailListInfoFirstStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception {  
  7.           
  8.         //执行分页查询,queryMaterialList对应分页查询语句,  
  9.         //根据sql语句在分页方法内部执行总记录数查询操作,这种风格使用简单,效率相对较低  
  10.         //condition参数保存了查询条件  
  11.         return executor.queryListInfoBean(HashMap.class"queryMaterialList", offset, pagesize,condition);  
  12.     }  
  13.       
  14.     public ListInfo queryMaterailListInfoSecondStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception {  
  15.         //执行总记录查询并存入totalSize变量中,queryCountMaterialList对应一个优化后的总记录查询语句  
  16.         //condition参数保存了查询条件  
  17.         long totalSize = executor.queryObjectBean(long.class"queryCountMaterialList", condition);  
  18.         //执行总记分页查询,queryMaterialList对应分页查询语句,通过totalsize参数从外部传入总记录数,  
  19.         //这样在分页方法内部无需执行总记录数查询操作,以便提升系统性能,这种风格使用简单,效率相对第一种风格较高,但是要额外配置总记录数查询sql  
  20.         //condition参数保存了查询条件  
  21.         return executor.queryListInfoBean(HashMap.class"queryMaterialList", offset, pagesize,totalSize ,condition);  
  22.     }  
  23.       
  24.       
  25.     public ListInfo queryMaterailListInfoThirdStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception {  
  26.         //根据sql语句和外部传入的总记录数sql语句进行分页,这种风格使用简单,效率最高,但是要额外配置总记录数查询sql  
  27.         ListInfo list = executor.queryListInfoBeanWithDBName(HashMap.class"bspf","queryMaterialList"010,"queryCountMaterialList" ,condition);  
  28.         return list;  
  29.     }  
  30.     /*******************************以bean方式传递查询条件结束*******************************/  
  31.       
  32.     /*******************************以传统绑定变量方式传递查询条件开始*******************************/  
  33.     public ListInfo queryMaterailListInfoFirstStyle(int offset, int pagesize ,String id) throws Exception {  
  34.           
  35.         //执行分页查询,queryMaterialList对应分页查询语句,  
  36.         //根据sql语句在分页方法内部执行总记录数查询操作,这种风格使用简单,效率相对较低  
  37.         //id参数保存了查询条件  
  38.         return executor.queryListInfo(HashMap.class"queryMaterialListbindParam", offset, pagesize,id);  
  39.     }  
  40.       
  41.     public ListInfo queryMaterailListInfoSecondStyle(int offset, int pagesize ,String id) throws Exception {  
  42.         //执行总记录查询并存入totalSize变量中,queryCountMaterialList对应一个优化后的总记录查询语句  
  43.         //id参数保存了查询条件  
  44.         long totalSize = executor.queryObject(long.class"queryCountMaterialListbindParam",id);  
  45.         //执行总记分页查询,queryMaterialList对应分页查询语句,通过totalsize参数从外部传入总记录数,  
  46.         //这样在分页方法内部无需执行总记录数查询操作,以便提升系统性能,这种风格使用简单,效率相对第一种风格较高,但是要额外配置总记录数查询sql  
  47.         //id参数保存了查询条件  
  48.         return executor.queryListInfoWithTotalsize(HashMap.class"queryMaterialListbindParam", offset, pagesize,totalSize,id );  
  49.     }  
  50.       
  51.       
  52.     public ListInfo queryMaterailListInfoThirdStyle(int offset, int pagesize ,String id) throws Exception {  
  53.         //根据sql语句和外部传入的总记录数sql语句进行分页,这种风格使用简单,效率最高,但是要额外配置总记录数查询sql,id参数保存了查询条件  
  54.         ListInfo list = executor.queryListInfoWithDBName2ndTotalsizesql(HashMap.class"bspf","queryMaterialListbindParam"010,"queryCountMaterialListbindParam",id );  
  55.         return list;  
  56.     }  
  57.     /*******************************以传统绑定变量方式传递查询条件结束*******************************/  
  58.   
  59.        /********************************第四种风格测试用例开始******/  
  60. public @Test  void testoraclerownumoverorderby() throws Exception {  
  61.         testsqlinfoorderby("oracle");  
  62.     }  
  63.     public @Test  void testmysqlrownumoverorderby() throws Exception {  
  64.         testsqlinfoorderby("mysql");  
  65.     }  
  66.     public @Test  void testderbyrownumoverorderby() throws Exception {  
  67.         testsqlinfoorderby("derby");  
  68.     }  
  69.     public @Test  void testsqliterownumoverorderby() throws Exception {  
  70.         testsqliteorderby("sqlite");  
  71.     }  
  72.       
  73.     public @Test  void testdb2rownumoverorderby() throws Exception {  
  74.         testsqlinfoorderby("db2");  
  75.     }  
  76.     public @Test void testpostgresrownumoverorderby() throws Exception {  
  77.         testsqlinfoorderby("postgres");  
  78.     }  
  79.     public @Test void testmssqlrownumoverorderby() throws Exception {  
  80.         testsqlinfoorderby("mssql");  
  81.     }  
  82.     public void testsqlinfoorderby(String dbname) throws Exception {  
  83.         //读取配置文件中的原生sql(select * from TD_APP_BOM where bm like ?),通过PlainPagineOrderby(原生排序条件封装对象)对象构造函数传入分页排序条件order by bm,分页pageisize=10参数和PlainPagineOrderby之间的是其他绑定变量参数条件  
  84.         ListInfo list = executor.queryListInfoWithDBName (HashMap.class, dbname,"testsqlinfo"010,'%c%',new PlainPagineOrderby("order by bm"));  
  85.         Map params = new HashMap();  
  86.         params.put("app_name_en""%C%");  
  87. //读取配置文件中的模板sql,通过PlainPagineOrderby(原生排序条件封装对象)对象传入分页排序条件order by bm和其他模板变量参数条件对象  
  88.         list = executor.queryListInfoBeanWithDBName (HashMap.class, dbname,"ROW_NUMBERquery"010,new PlainPagineOrderby("order by bm",params));  
  89.         StringBuilder orderby = new StringBuilder();  
  90.         orderby.append(" #if($sortKey && !$sortKey.equals(\"\"))")  
  91.         .append(" order by $sortKey ")  
  92.         .append(" #if($sortDESC )")  
  93.         .append("   desc ")  
  94.         .append(" #else")  
  95.         .append("   asc")  
  96.         .append(" #end")  
  97.         .append(" #else")  
  98.         .append(" order by bm ")  
  99.         .append(" #end");  
  100. //读取配置文件中的模板sql,通过PagineOrderby(模板动态排序条件封装对象)对象传入分页动态排序条件和其他模板变量参数条件对象  
  101.         list = executor.queryListInfoBeanWithDBName (HashMap.class, dbname,"ROW_NUMBERquery"010,new PagineOrderby(orderby.toString(),params));  
  102.         params.put("sortKey""id");  
  103.         params.put("sortDESC"true);  
  104. //调整排序字段为id,设置排序顺序为降序,读取配置文件中的模板sql,通过ConfigPagineOrderby(模板动态排序条件封装对象,但是只是指定了一个排序条件的名称,实际是从配置文件读取的)对象传入分页动态排序条件和其他模板变量参数条件对象  
  105.         list = executor.queryListInfoBeanWithDBName (HashMap.class, dbname,"ROW_NUMBERquery"010,new ConfigPagineOrderby("ROW_NUMBERquery_orderby",params));  
  106.         //三个SQLExecutor排序分页接口使用用法,除了没有ConfigPagineOrderby分页封装方式外,使用方法与ConfigSQLExecutor使用方法一致  
  107.         //SQLExecutor直接操作原生sql(select * from TD_APP_BOM where bm like ?)做分页查询,通过PlainPagineOrderby(原生排序条件封装对象)对象构造函数传入分页排序条件order by bm,分页pageisize=10参数和PlainPagineOrderby之间的是其他绑定变量参数条件,  
  108.         list = SQLExecutor.queryListInfoWithDBName (HashMap.class, dbname,"select * from TD_APP_BOM"010,new PlainPagineOrderby("order by bm"));  
  109.         StringBuilder testsqlinfoorderby = new StringBuilder();  
  110.         testsqlinfoorderby.append("select * from TD_APP_BOM where 1=1")  
  111.                 .append("   #if($bm && !$bm.equals(\"\"))")  
  112.                 .append("   and bm = #[bm]")  
  113.                 .append("   #end")  
  114.                 .append("   #if($app_name_en && !$app_name_en.equals(\"\"))")  
  115.                 .append("       and app_name_en like #[app_name_en]")  
  116.                 .append("   #end")  
  117.                 .append("   #if($app_name && !$app_name.equals(\"\"))")  
  118.                 .append("       and app_name like #[app_name]")  
  119.                 .append(" #end")  
  120.                 .append("       #if($soft_level && !$soft_level.equals(\"\"))")  
  121.                 .append("       and soft_level=#[soft_level]")  
  122.                 .append("   #end")  
  123.                 .append("   #if($state && !$state.equals(\"\"))")  
  124.                 .append("       and state=#[state]")  
  125.                 .append("       #end")  
  126.                 .append("           #if($rd_type && !$rd_type.equals(\"\"))")  
  127.                 .append("   and rd_type=#[rd_type]")  
  128.                 .append("   #end");  
  129.            
  130.         list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 010,new PlainPagineOrderby("order by bm",params));  
  131.           
  132.         list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 010,new PagineOrderby(orderby.toString(),params));  
  133.        
  134.           
  135.         return ;  
  136.     }  
  137.       
  138.     public void testsqliteorderby(String dbname) throws Exception {  
  139.         //根据sql语句和外部传入的总记录数sql语句进行分页,这种风格使用简单,效率最高,但是要额外配置总记录数查询sql  
  140.         ListInfo list = null;  
  141.         Map params = new HashMap();  
  142.         params.put("moudleName""%t%");  
  143.            
  144.         StringBuilder orderby = new StringBuilder();  
  145.         orderby.append(" #if($sortKey && !$sortKey.equals(\"\"))")  
  146.         .append(" order by $sortKey ")  
  147.         .append(" #if($sortDESC )")  
  148.         .append("   desc ")  
  149.         .append(" #else")  
  150.         .append("   asc")  
  151.         .append(" #end")  
  152.         .append(" #else")  
  153.         .append(" order by moudleName ")  
  154.         .append(" #end");  
  155.        
  156.           
  157.           
  158.         list = SQLExecutor.queryListInfoWithDBName (HashMap.class, dbname,"select * from BBOSS_GENCODE"03,new PlainPagineOrderby("order by moudleName"));  
  159.         StringBuilder testsqlinfoorderby = new StringBuilder();  
  160.         testsqlinfoorderby.append("select * from BBOSS_GENCODE where 1=1")  
  161.                 .append("   #if($DBNAME && !$DBNAME.equals(\"\"))")  
  162.                 .append("   and DBNAME = #[DBNAME]")  
  163.                 .append("   #end")  
  164.                 .append("   #if($moudleName && !$moudleName.equals(\"\"))")  
  165.                 .append("       and moudleName like #[moudleName]")  
  166.                 .append("   #end")  
  167.                 ;  
  168.            
  169.         list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 03,new PlainPagineOrderby("order by moudleName",params));  
  170.         params.put("sortKey""id");  
  171.         params.put("sortDESC"true);  
  172.         list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class, dbname,testsqlinfoorderby.toString(), 03,new PagineOrderby(orderby.toString(),params));  
  173.        
  174.           
  175.         return ;  
  176.     }  
  177.        /********************************第四种风格测试用例结束******/  
  178. }  


举例完毕,如有疑问,请留言进一步探讨。 
补充说明一下:ListInfo对象包含当页记录集和总记录数以及每页最多纪录数,如果是more分页查询,还包含了more分页标识
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!