ibatis 分页查询只需写一条sql的方法

原创 2013年12月03日 15:19:13

这里是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(*)属性。


使用ibatis实现动态分页查询

一.实现分页之前可以做的:优化SQL本来的查询语句为下面的,可以进行多种优化SELECT o.*, r.nameFROM PLACED_ORDER o, RESTAURANT rWHERE o.RES...
  • ProjectArchitect
  • ProjectArchitect
  • 2008年11月18日 16:01
  • 25607

ibatis 里查询select语句写法带分页

startDate  endDate  传如为日期类型                Select * From (               Select * From (...
  • IBelieveKDM
  • IBelieveKDM
  • 2012年06月04日 17:37
  • 3907

ibatis实现分页查询

类PageQuery interface IPageQuery package com.coship.sdp.rights.model.page; import com.coship.dhm.com...
  • okkeqin
  • okkeqin
  • 2015年05月08日 16:20
  • 2390

ibatis分页(以mysql为例)

Users.xml java.util.Map" resultClass="Student">       select * from student                 ...
  • woshixuye
  • woshixuye
  • 2012年05月25日 08:08
  • 5846

ibatis 分页的简单实现

ibatis pagination
  • cheungmine
  • cheungmine
  • 2013年08月27日 00:00
  • 7384

Ibatis的分页机制的缺陷

我们知道,Ibatis为我们提供了可以直接实现分页的方法 queryForList(String statementName, Object parameterObject, int skipRes...
  • hai_cheng001
  • hai_cheng001
  • 2013年12月15日 23:21
  • 4647

IBatis分页拦截器

IBatis分页拦截器
  • hardworking0323
  • hardworking0323
  • 2016年08月18日 19:32
  • 1173

ibatis基于拦截器的分页实现

ibatis基于拦截器的分页实现
  • ZWLJavaWeb
  • ZWLJavaWeb
  • 2016年07月23日 17:41
  • 550

myBatis学习笔记(10)——使用拦截器实现分页查询

1. Pagepackage com.sm.model;import java.util.List;public class Page { public static final int DEF...
  • u010837612
  • u010837612
  • 2015年08月21日 16:41
  • 3890

mybatis常用分页插件,快速分页处理

在未分享整个查询分页的执行代码之前,先了解一下执行流程。 1.总体上是利用mybatis的插件拦截器,在sql执行之前拦截,为查询语句加上limit X X 2.用一个Page对象,贯穿整个执行流程,...
  • u014001866
  • u014001866
  • 2016年10月13日 17:03
  • 7267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ibatis 分页查询只需写一条sql的方法
举报原因:
原因补充:

(最多只允许输入30个字)