ibatis 分頁查詢只需寫一條sql的方法
阿新 • • 發佈:2018-11-17
這裡是ORALCE。
mysql也可以參考。思路是一樣的。
sqlmap
<select id="selectAccType" resultClass="java.util.HashMap" parameterClass="com.xx.acctype.dto.AccTypeQueryDTO" remapResults="true"> <include refid="Commons.prefixSql" /> select T2.ACC_TYPE_ID as "accTypeId", T2.ACC_TYPE_NAME as "accTypeName", DECODE(T2.ISSUER_ID,0,T3.ISSUER_GROUP_NAME,T1.ISSUER_NAME) as "issuerName" from TB_ENT_ISSUER T1, TB_ENT_ACCTYPE T2, TB_ENT_ISSUER_GROUP T3 where T1.ISSUER_ID(+)=T2.ISSUER_ID and T3.ISSUER_GROUP_ID(+)=T2.ISSUER_GROUP_ID and T2.DATA_STATE = 1 <dynamic> <isNotEmpty prepend="and" property="accTypeId"> ACC_TYPE_ID = #accTypeId:DECIMAL# </isNotEmpty> </dynamic> <include refid="Commons.suffixSql" /> </select>
這裡的AccTypeQueryDTO繼承PageQueryDTO,包含pageNo等屬性。
其中的Commons.xml是這樣的,裡面有一個prefixSql和suffixSql。用來做分頁和查出count
<sql id="prefixSql"> <dynamic> <isEqual property="doCount" compareValue="true"> select count(*) as $COUNT_ALL_NAME$ from ( </isEqual> <isEqual property="doCount" compareValue="false"> <isEqual property="queryAll" compareValue="false"> SELECT * FROM (select row_.*, rownum start_rownum_ from ( </isEqual> <isNotEmpty property="sort"> SELECT * FROM ( </isNotEmpty> </isEqual> </dynamic> </sql> <sql id="suffixSql"> <dynamic> <isEqual property="doCount" compareValue="true"> ) </isEqual> <isEqual property="doCount" compareValue="false"> <isEqual property="sort" compareValue="asc"> ) order_by_ ORDER BY order_by_."$sortFieldName$" asc </isEqual> <isEqual property="sort" compareValue="desc"> ) order_by_ ORDER BY order_by_."$sortFieldName$" desc </isEqual> <isEqual property="queryAll" compareValue="false"> <![CDATA[ ) row_ WHERE rownum <= #lastCursorPosition# ) page_ WHERE start_rownum_ >= #firstCursorPosition# ]]> </isEqual> </isEqual> </dynamic> </sql>
這裡的關鍵就是doCount。來看DAO
public PageDataDTO query(String statement, PageQueryDTO parameter, boolean count) { PageQueryDTO pageQuery = parameter; if (pageQuery == null) { pageQuery = new PageQueryDTO(); pageQuery.setQueryAll(true); } PageDataDTO pageDataDTO = new PageDataDTO(); int totalRecord = 0; if (!pageQuery.isQueryAll() && count) { parameter.setDoCount(true); Map result = (Map) getSqlMapClientTemplate().queryForObject(statement, pageQuery); Number value = (Number) result.get(PageQueryDTO.COUNT_ALL_NAME); totalRecord = value.intValue(); } pageQuery.setDoCount(false); DefaultRowHandler defaultRowHandler = new DefaultRowHandler(); getSqlMapClientTemplate().queryWithRowHandler(statement, pageQuery, defaultRowHandler); pageDataDTO.setData(defaultRowHandler.getList()); if (pageQuery.isQueryAll()) totalRecord = defaultRowHandler.getList().size(); pageDataDTO.setTotalRecord(totalRecord); return pageDataDTO; }
Service
PageDataDTO dto = pageQueryDAO.query("ACCTYPE.selectAccTypetest", accTypeQueryDTO);
在DAO裡面,先設定doCount為true,查出count,然後設定為false,查出分頁資料。
對於mysql。試了一下
SELECT
COUNT(*)
FROM
(SELECT
*
FROM
nwd_member t1) t2
發現慢了幾十倍。繼續研究研究。
--------------------------------------------------------------------------
mysql也許可以這麼做:
在select 與 from 之間加isEqual,queryCount=true時,選擇count(*),否則為具體欄位。resultClass包含count(*)屬性。