bboss持久層分頁接口使用示例

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分頁標識
相關文章
相關標籤/搜索