1. 程式人生 > >ibatis 分頁查詢只需寫一條sql的方法

ibatis 分頁查詢只需寫一條sql的方法

這裡是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(*)屬性。