Code Bye

mybatis的分页如何实现的

以前用的是hibernate来对数据库进行处理,现在换了架构了,改用mybatis,我感觉用起来还是挺顺手的,现在正在理解他的实现过程,现在遇到分页这个难题了,就大神帮忙解释下
接口中的方法是这样的

 List<T> selectByExampleWithBLOBs(FilterExample example);

    List<T> selectByExampleWithRowbounds(FilterExample example, RowBounds rowBounds);

xml中的代码是这样的

  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.excenergy.edba.filter.FilterExample" >
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed May 21 13:11:55 CST 2014.
    -->
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from LOGIN_LOG
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>
  <select resultMap="BaseResultMap" parameterType="com.excenergy.edba.filter.FilterExample" id="selectByExampleWithRowbounds" >
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed May 21 13:11:55 CST 2014.
    -->
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from LOGIN_LOG
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>
<sql id="Example_Where_Clause" >
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed May 21 13:11:55 CST 2014.
    -->
    <where >
      <foreach collection="oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

这两段xml代码感觉没什么区别啊,为什么后者能实现分页功能

这xml配置没有分页的功能,会不会有专门的拦截器处理分页了,仔细看一下整个工程的代码。
xml里面并没有使用分页的sql,只是后者所调用的List<T> selectByExampleWithRowbounds(FilterExample example, RowBounds rowBounds);这里面的RowBounds启了作用,这个RowBounds在内部的实现其实是用jdbc的ResultSet的游标分页,效率不高,也就是当RowBounds的offset和limit有赋值时,mybatis内部在得到jdbc的ResultSet的对象rs时用rs的游标定位到offset的位置,只处理limit条记录。并没有在sql中的语句中进行分页,也就是说其实他查询的还是符合条件的全部数据,只是利用游标进行定位了,这样的方式不建议使用,一旦数据量大的时候,使用游标分页是极费性能的。最好的还是在xml里面的sql中使用分页关键字来进行分页
limit #{start}, #{stop}
引用 2 楼 suciver 的回复:

xml里面并没有使用分页的sql,只是后者所调用的List<T> selectByExampleWithRowbounds(FilterExample example, RowBounds rowBounds);这里面的RowBounds启了作用,这个RowBounds在内部的实现其实是用jdbc的ResultSet的游标分页,效率不高,也就是当RowBounds的offset和limit有赋值时,mybatis内部在得到jdbc的ResultSet的对象rs时用rs的游标定位到offset的位置,只处理limit条记录。并没有在sql中的语句中进行分页,也就是说其实他查询的还是符合条件的全部数据,只是利用游标进行定位了,这样的方式不建议使用,一旦数据量大的时候,使用游标分页是极费性能的。最好的还是在xml里面的sql中使用分页关键字来进行分页

大神,那照目前运行来看,是不是说在接口参数中设置了RowBounds属性,xml代码就会自动进行分页操作,还是需要在配置文件中进行配置?


40分
引用 4 楼 abc395015721 的回复:
Quote: 引用 2 楼 suciver 的回复:

xml里面并没有使用分页的sql,只是后者所调用的List<T> selectByExampleWithRowbounds(FilterExample example, RowBounds rowBounds);这里面的RowBounds启了作用,这个RowBounds在内部的实现其实是用jdbc的ResultSet的游标分页,效率不高,也就是当RowBounds的offset和limit有赋值时,mybatis内部在得到jdbc的ResultSet的对象rs时用rs的游标定位到offset的位置,只处理limit条记录。并没有在sql中的语句中进行分页,也就是说其实他查询的还是符合条件的全部数据,只是利用游标进行定位了,这样的方式不建议使用,一旦数据量大的时候,使用游标分页是极费性能的。最好的还是在xml里面的sql中使用分页关键字来进行分页

大神,那照目前运行来看,是不是说在接口参数中设置了RowBounds属性,xml代码就会自动进行分页操作,还是需要在配置文件中进行配置?

我上面已经说了RowBounds可以实现分页,他用的是游标分页,数据量大的时候效率低,如果楼主没多大的数据量可以用RowBounds。如果数据量大了还是在xml里面的sql语句上用分页关键字去做


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mybatis的分页如何实现的