為了更好地提高資料庫分頁查詢的效率,bboss持久層在ConfigSQLExecutor和SQLExecutor兩個元件中分别提供了一組實用的more分頁查詢接口。本文着重介紹more分頁查詢api的使用以及more分頁查詢和分頁标簽庫結合的一些特殊特性。
1.概述
到目前為止bboss持久層分别提供了以下三種分頁查詢API:
第一種
普通分頁查詢操API這組API自動根據查詢sql語句執行總記錄數擷取和目前頁記錄集擷取兩個操作,對應于ConfigSQLExecutor和SQLExecutor中以queryListInfo開頭的方法。這組API中傳回的ListInfo對象中包含總記錄數和當頁記錄數兩個資訊,除非沒有查詢到資料,否則一定有一頁資料傳回,也就是說當分頁起始位置超過總記錄數時,就自動傳回最後一頁資料;當起始位置為0或者小于零時将傳回第一頁資料。
第二種 帶總記錄數或者傳入總記錄數查詢sql語句的API
這組API根據傳入是總記錄數還是總記錄數查詢sql所做的操作不一樣:如果傳入的是總記錄數,那麼這組API将隻做目前頁記錄查詢操作,不做總記錄數查詢操作;如果傳入的是總記錄數查詢sql,那麼除了要做目前頁記錄查詢操作外,還要通過總記錄數查詢sql擷取總記錄數,也就是說對應的API要執行兩次db操作,這種情況相對于普通分頁查詢API,傳入的總記錄數查詢SQL比普通分頁查詢API中自動生成的總記錄數查詢sql效率要高很多。這組api同樣對應于ConfigSQLExecutor和SQLExecutor中以queryListInfo開頭的方法,隻是其中多了totalsize或者totalsizesql參數。這組API中傳回的ListInfo對象中包含總記錄數和當頁記錄數兩個資訊,除非沒有查詢到資料,否則一定有一頁資料傳回,也就是說當分頁起始位置超過總記錄數時,就自動傳回最後一頁資料;當起始位置為0或者小于零時将傳回第一頁資料。
第三種 More分頁查詢API
More分頁查詢API也就是本文要介紹的功能,這組API隻根據傳入的目前頁記錄起始位置和每頁最大記錄數擷取目前頁的資料集,不會做總記錄數查詢,也就是說隻做一次db操作,是以more分頁查詢的效率最好,但是無法提供總記錄資料資訊,隻要在總記錄數不是很重要的情況下就可以使用more分頁查詢方法。如果對應的起始位置沒有查詢到資料集将不傳回任何資料,如果有資料則傳回帶當頁資料的ListInfo對象,并且listInfo對象中沒有總記錄數資訊,也就是調用listInfo.getTotalSize()方法始終傳回0。那麼More分頁接口傳回資料時,我們怎麼判斷已經到了最後一頁或者是沒有資料呢,首先如果擷取資料起始位置為0,當調用listInfo.getResultSize()方法傳回0時表示沒有資料;如果擷取資料起始位置大于0,當調用listInfo.getResultSize()方法傳回值為0或者傳回值小于每頁需擷取記錄數時表示已經到達記錄的最後一頁。
普通分頁查詢操API和帶總記錄數或者傳入總記錄數查詢sql語句API的使用方法請參考博文
《bboss持久層分頁接口使用示例》,本文着重介紹more分頁查詢api的使用以及more分頁查詢和分頁标簽庫結合的一些特殊特性。
2.More分頁查詢api
下面列出more分頁的對應ConfigSQLExecutor元件中所有api:
public ListInfo moreListInfoWithDBNameByRowHandler(RowHandler rowhandler,Class<?> beanType,String dbname, String sqlname, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoWithDBNameByNullRowHandler(NullRowHandler rowhandler,String dbname, String sqlname, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoWithDBName(Class<?> beanType,String dbname, String sqlname, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoByRowHandler(RowHandler rowhandler,Class<?> beanType, String sqlname, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoByNullRowHandler(NullRowHandler rowhandler, String sqlname, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoBeanWithDBNameByRowHandler(RowHandler rowhandler,Class<?> beanType,String dbname, String sqlname, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanWithDBNameByNullRowHandler(NullRowHandler rowhandler,String dbname, String sqlname, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanWithDBName(Class<?> beanType,String dbname, String sqlname, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanByRowHandler(RowHandler rowhandler,Class<?> beanType, String sqlname, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanByNullRowHandler(NullRowHandler rowhandler, String sqlname, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBean(Class<?> beanType, String sqlname, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfo(Class<?> beanType, String sqlname, long offset,int pagesize,Object... fields) throws SQLException
Class<?> beanType參數對應要傳回的記錄對應的對象類型,sqlname參數對應ConfigSQLExecutor加載的xml sql配置檔案中的sql配置名稱,Object... fields對應原生sql的可變長參數數組;,Object bean參數得屬性對應承載了sqlname參數對應的sql語句需要的所有參數值和控制變量值,offset對應分頁資料起始位置,pagesize參數指定了當頁需要擷取的記錄數。NullRowHandler 和 RowHandler 類型參數對應了使用者自定義處理記錄的行處理器。
下面列出more分頁的對應SQLExecutor元件中所有api:
public ListInfo moreListInfoWithDBNameByRowHandler(RowHandler rowhandler,Class<?> beanType,String dbname, String sql, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoWithDBNameByNullRowHandler(NullRowHandler rowhandler,String dbname, String sql, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoWithDBName(Class<?> beanType,String dbname, String sql, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoByRowHandler(RowHandler rowhandler,Class<?> beanType, String sql, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoByNullRowHandler(NullRowHandler rowhandler, String sql, long offset,int pagesize,Object... fields) throws SQLException
public ListInfo moreListInfoBeanWithDBNameByRowHandler(RowHandler rowhandler,Class<?> beanType,String dbname, String sql, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanWithDBNameByNullRowHandler(NullRowHandler rowhandler,String dbname, String sql, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanWithDBName(Class<?> beanType,String dbname, String sql, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanByRowHandler(RowHandler rowhandler,Class<?> beanType, String sql, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBeanByNullRowHandler(NullRowHandler rowhandler, String sql, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfoBean(Class<?> beanType, String sql, long offset,int pagesize,Object bean) throws SQLException
public ListInfo moreListInfo(Class<?> beanType, String sql, long offset,int pagesize,Object... fields) throws SQLException
Class<?> beanType參數對應要傳回的記錄對應的對象類型,sql參數對應SQLExecutor要執行的sql語句,Object... fields對應原生sql的可變長參數數組;,Object bean參數得屬性對應承載了sql參數對應的sql語句需要的所有參數值和控制變量值,offset對應分頁資料起始位置,pagesize參數指定了當頁需要擷取的記錄數。NullRowHandler和 RowHandler 類型參數對應了使用者自定義處理記錄的行處理器。
3.more查詢分頁api使用示例
ConfigSQLExecutor:
ListInfo datas=executor.moreListInfoBean(AppBom.class,"queryListAppBom", offset, pagesize, appcondition);
SQLExecutor:
ListInfo datas=SQLExecutor.moreListInfoBean(AppBom.class,"select * from td_app_bom where id=#[id] and name like #[name]", offset, pagesize, appcondition);
4.more分頁查詢與分頁标簽庫結合使用
more分頁查詢的使用方法和前面的兩種分頁查詢的方法使用方式是一樣的,唯一的差別是傳回的ListInfo對象執行個體datas被調用listInfo的setMore(true)方法辨別為more查詢傳回的listInfo對象了。這個more狀态辨別将影響分頁标簽的Index分頁導航标簽展示行為,同時分頁标簽中擷取到總記錄數值為0,但是這個辨別不會影響我們分頁标簽的程式設計使用方法,通過以下兩個圖對比就可以看出二者Index導航效果的差別:
more分頁查詢的效果

非more分頁查詢的效果
上面的導航都是通過以下的index标簽用法輸出的:
<pg:index tagnumber="10" sizescope="5,10,20,50,100"/>
為了配合在pager标簽上提供的statement屬性指定的sql直接從資料庫查詢分頁資料時也能使用more分頁查詢,我們在pager标簽上提供了moreQuery屬性,moreQuery為true時将使用more分頁查詢擷取資料,false不使用,預設為false。moreQuery屬性的使用方法如下:
<pg:pager scope="request" statement="select * from td_app_bom" dbname="bspf" moreQuery="true"
desc="false" isList="false" >
<pg:list>
<pg:cell colName="struct_mode" maxlength="8" replace="..."/>
</pg:list>
<pg:index tagnumber="10" sizescope="5,10,20,50,100"/>
</pg:pager>