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代碼
<? xml version ="1.0" encoding ="UTF-8" ?>
< properties >
< property name ="queryMaterialList" >
<![CDATA[
select * from td_app_bom where id=#[id]
]]>
</ property >
< property name ="queryCountMaterialList" >
<![CDATA[
select count(1) from td_app_bom where id=#[id]
]]>
</ property >
< property name ="queryMaterialListbindParam" >
<![CDATA[
select * from td_app_bom where id=?
]]>
</ property >
< property name ="queryCountMaterialListbindParam" >
<![CDATA[
select count(1) from td_app_bom where id=?
]]>
</ property >
< property name ="testsqlinfo" > <![CDATA[select * from TD_APP_BOM]]> </ property >
< property name ="ROW_NUMBERquery" > <![CDATA[select * from TD_APP_BOM where 1=1
#if($bm && !$bm.equals(""))
and bm = #[bm]
#end
#if($app_name_en && !$app_name_en.equals(""))
and app_name_en like #[app_name_en]
#end
#if($app_name && !$app_name.equals(""))
and app_name like #[app_name]
#end
#if($soft_level && !$soft_level.equals(""))
and soft_level=#[soft_level]
#end
#if($state && !$state.equals(""))
and state=#[state]
#end
#if($rd_type && !$rd_type.equals(""))
and rd_type=#[rd_type]
#end ]]> </ property >
< property name ="ROW_NUMBERquery_orderby" > <![CDATA[
#if($sortKey && !$sortKey.equals(""))
order by $sortKey
#if($sortDESC )
desc
#else
asc
#end
#else
order by bm
#end]]> </ property >
</ properties >
2.分頁查詢方法示例代碼
Java代碼
public class ApplyService {
private com.frameworkset.common.poolman.ConfigSQLExecutor executor = new ConfigSQLExecutor("com/frameworkset/sqlexecutor/purchaseApply.xml" );
/*******************************以bean方式傳遞查詢條件開始*******************************/
public ListInfo queryMaterailListInfoFirstStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception {
//執行分頁查詢,queryMaterialList對應分頁查詢語句,
//根據sql語句在分頁方法內部執行總記錄數查詢操做,這種風格使用簡單,效率相對較低
//condition參數保存了查詢條件
return executor.queryListInfoBean(HashMap.class , "queryMaterialList" , offset, pagesize,condition);
}
public ListInfo queryMaterailListInfoSecondStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception {
//執行總記錄查詢並存入totalSize變量中,queryCountMaterialList對應一個優化後的總記錄查詢語句
//condition參數保存了查詢條件
long totalSize = executor.queryObjectBean(long .class , "queryCountMaterialList" , condition);
//執行總記分頁查詢,queryMaterialList對應分頁查詢語句,經過totalsize參數從外部傳入總記錄數,
//這樣在分頁方法內部無需執行總記錄數查詢操做,以便提高系統性能,這種風格使用簡單,效率相對第一種風格較高,可是要額外配置總記錄數查詢sql
//condition參數保存了查詢條件
return executor.queryListInfoBean(HashMap.class , "queryMaterialList" , offset, pagesize,totalSize ,condition);
}
public ListInfo queryMaterailListInfoThirdStyleBean(int offset, int pagesize ,PurchaseApplyCondition condition) throws Exception {
//根據sql語句和外部傳入的總記錄數sql語句進行分頁,這種風格使用簡單,效率最高,可是要額外配置總記錄數查詢sql
ListInfo list = executor.queryListInfoBeanWithDBName(HashMap.class , "bspf" ,"queryMaterialList" , 0 , 10 ,"queryCountMaterialList" ,condition);
return list;
}
/*******************************以bean方式傳遞查詢條件結束*******************************/
/*******************************以傳統綁定變量方式傳遞查詢條件開始*******************************/
public ListInfo queryMaterailListInfoFirstStyle(int offset, int pagesize ,String id) throws Exception {
//執行分頁查詢,queryMaterialList對應分頁查詢語句,
//根據sql語句在分頁方法內部執行總記錄數查詢操做,這種風格使用簡單,效率相對較低
//id參數保存了查詢條件
return executor.queryListInfo(HashMap.class , "queryMaterialListbindParam" , offset, pagesize,id);
}
public ListInfo queryMaterailListInfoSecondStyle(int offset, int pagesize ,String id) throws Exception {
//執行總記錄查詢並存入totalSize變量中,queryCountMaterialList對應一個優化後的總記錄查詢語句
//id參數保存了查詢條件
long totalSize = executor.queryObject(long .class , "queryCountMaterialListbindParam" ,id);
//執行總記分頁查詢,queryMaterialList對應分頁查詢語句,經過totalsize參數從外部傳入總記錄數,
//這樣在分頁方法內部無需執行總記錄數查詢操做,以便提高系統性能,這種風格使用簡單,效率相對第一種風格較高,可是要額外配置總記錄數查詢sql
//id參數保存了查詢條件
return executor.queryListInfoWithTotalsize(HashMap.class , "queryMaterialListbindParam" , offset, pagesize,totalSize,id );
}
public ListInfo queryMaterailListInfoThirdStyle(int offset, int pagesize ,String id) throws Exception {
//根據sql語句和外部傳入的總記錄數sql語句進行分頁,這種風格使用簡單,效率最高,可是要額外配置總記錄數查詢sql,id參數保存了查詢條件
ListInfo list = executor.queryListInfoWithDBName2ndTotalsizesql(HashMap.class , "bspf" ,"queryMaterialListbindParam" , 0 , 10 ,"queryCountMaterialListbindParam" ,id );
return list;
}
/*******************************以傳統綁定變量方式傳遞查詢條件結束*******************************/
/********************************第四種風格測試用例開始******/
public @Test void testoraclerownumoverorderby() throws Exception {
testsqlinfoorderby("oracle" );
}
public @Test void testmysqlrownumoverorderby() throws Exception {
testsqlinfoorderby("mysql" );
}
public @Test void testderbyrownumoverorderby() throws Exception {
testsqlinfoorderby("derby" );
}
public @Test void testsqliterownumoverorderby() throws Exception {
testsqliteorderby("sqlite" );
}
public @Test void testdb2rownumoverorderby() throws Exception {
testsqlinfoorderby("db2" );
}
public @Test void testpostgresrownumoverorderby() throws Exception {
testsqlinfoorderby("postgres" );
}
public @Test void testmssqlrownumoverorderby() throws Exception {
testsqlinfoorderby("mssql" );
}
public void testsqlinfoorderby(String dbname) throws Exception {
//讀取配置文件中的原生sql(select * from TD_APP_BOM where bm like ?),經過PlainPagineOrderby(原生排序條件封裝對象)對象構造函數傳入分頁排序條件order by bm,分頁pageisize=10參數和PlainPagineOrderby之間的是其餘綁定變量參數條件
ListInfo list = executor.queryListInfoWithDBName (HashMap.class , dbname,"testsqlinfo" , 0 , 10 ,'%c%' ,new PlainPagineOrderby("order by bm" ));
Map params = new HashMap();
params.put("app_name_en" , "%C%" );
//讀取配置文件中的模板sql,經過PlainPagineOrderby(原生排序條件封裝對象)對象傳入分頁排序條件order by bm和其餘模板變量參數條件對象
list = executor.queryListInfoBeanWithDBName (HashMap.class , dbname,"ROW_NUMBERquery" , 0 , 10 ,new PlainPagineOrderby("order by bm" ,params));
StringBuilder orderby = new StringBuilder();
orderby.append(" #if($sortKey && !$sortKey.equals(\"\"))" )
.append(" order by $sortKey " )
.append(" #if($sortDESC )" )
.append(" desc " )
.append(" #else" )
.append(" asc" )
.append(" #end" )
.append(" #else" )
.append(" order by bm " )
.append(" #end" );
//讀取配置文件中的模板sql,經過PagineOrderby(模板動態排序條件封裝對象)對象傳入分頁動態排序條件和其餘模板變量參數條件對象
list = executor.queryListInfoBeanWithDBName (HashMap.class , dbname,"ROW_NUMBERquery" , 0 , 10 ,new PagineOrderby(orderby.toString(),params));
params.put("sortKey" , "id" );
params.put("sortDESC" , true );
//調整排序字段爲id,設置排序順序爲降序,讀取配置文件中的模板sql,經過ConfigPagineOrderby(模板動態排序條件封裝對象,可是隻是指定了一個排序條件的名稱,實際是從配置文件讀取的)對象傳入分頁動態排序條件和其餘模板變量參數條件對象
list = executor.queryListInfoBeanWithDBName (HashMap.class , dbname,"ROW_NUMBERquery" , 0 , 10 ,new ConfigPagineOrderby("ROW_NUMBERquery_orderby" ,params));
//三個SQLExecutor排序分頁接口使用用法,除了沒有ConfigPagineOrderby分頁封裝方式外,使用方法與ConfigSQLExecutor使用方法一致
//SQLExecutor直接操做原生sql(select * from TD_APP_BOM where bm like ?)作分頁查詢,經過PlainPagineOrderby(原生排序條件封裝對象)對象構造函數傳入分頁排序條件order by bm,分頁pageisize=10參數和PlainPagineOrderby之間的是其餘綁定變量參數條件,
list = SQLExecutor.queryListInfoWithDBName (HashMap.class , dbname,"select * from TD_APP_BOM" , 0 , 10 ,new PlainPagineOrderby("order by bm" ));
StringBuilder testsqlinfoorderby = new StringBuilder();
testsqlinfoorderby.append("select * from TD_APP_BOM where 1=1" )
.append(" #if($bm && !$bm.equals(\"\"))" )
.append(" and bm = #[bm]" )
.append(" #end" )
.append(" #if($app_name_en && !$app_name_en.equals(\"\"))" )
.append(" and app_name_en like #[app_name_en]" )
.append(" #end" )
.append(" #if($app_name && !$app_name.equals(\"\"))" )
.append(" and app_name like #[app_name]" )
.append(" #end" )
.append(" #if($soft_level && !$soft_level.equals(\"\"))" )
.append(" and soft_level=#[soft_level]" )
.append(" #end" )
.append(" #if($state && !$state.equals(\"\"))" )
.append(" and state=#[state]" )
.append(" #end" )
.append(" #if($rd_type && !$rd_type.equals(\"\"))" )
.append(" and rd_type=#[rd_type]" )
.append(" #end" );
list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class , dbname,testsqlinfoorderby.toString(), 0 , 10 ,new PlainPagineOrderby("order by bm" ,params));
list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class , dbname,testsqlinfoorderby.toString(), 0 , 10 ,new PagineOrderby(orderby.toString(),params));
return ;
}
public void testsqliteorderby(String dbname) throws Exception {
//根據sql語句和外部傳入的總記錄數sql語句進行分頁,這種風格使用簡單,效率最高,可是要額外配置總記錄數查詢sql
ListInfo list = null ;
Map params = new HashMap();
params.put("moudleName" , "%t%" );
StringBuilder orderby = new StringBuilder();
orderby.append(" #if($sortKey && !$sortKey.equals(\"\"))" )
.append(" order by $sortKey " )
.append(" #if($sortDESC )" )
.append(" desc " )
.append(" #else" )
.append(" asc" )
.append(" #end" )
.append(" #else" )
.append(" order by moudleName " )
.append(" #end" );
list = SQLExecutor.queryListInfoWithDBName (HashMap.class , dbname,"select * from BBOSS_GENCODE" , 0 , 3 ,new PlainPagineOrderby("order by moudleName" ));
StringBuilder testsqlinfoorderby = new StringBuilder();
testsqlinfoorderby.append("select * from BBOSS_GENCODE where 1=1" )
.append(" #if($DBNAME && !$DBNAME.equals(\"\"))" )
.append(" and DBNAME = #[DBNAME]" )
.append(" #end" )
.append(" #if($moudleName && !$moudleName.equals(\"\"))" )
.append(" and moudleName like #[moudleName]" )
.append(" #end" )
;
list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class , dbname,testsqlinfoorderby.toString(), 0 , 3 ,new PlainPagineOrderby("order by moudleName" ,params));
params.put("sortKey" , "id" );
params.put("sortDESC" , true );
list = SQLExecutor.queryListInfoBeanWithDBName (HashMap.class , dbname,testsqlinfoorderby.toString(), 0 , 3 ,new PagineOrderby(orderby.toString(),params));
return ;
}
/********************************第四種風格測試用例結束******/
}
舉例完畢,若有疑問,請留言進一步探討。
補充說明一下:ListInfo對象包含當頁記錄集和總記錄數以及每頁最多紀錄數,若是是more分頁查詢,還包含了more分頁標識
歡迎關注本站公眾號,獲取更多信息