Hibernate和Mybatis的分页功能实现

持久层实现分页功能

分页功能在很多场合都会使用,比如如果有很多的资料,不分页的话网页效率将会堪忧, 用户体验也不好,分页功能有效缓解大数据的压力,这里所讲分页功能,主要是对数据库中的结构化数据而言的。

持久层框架我用过两种:HibernateMybatis 。 这里将两种框架的分页功能进行实现。

Hibernate分页

Hiberntae 分页比较简单,因为Hibernate自带了分页功能,直接进行配置即可:

@Override
public ChannelTalkItem[] findByPage(final String channelID, final int startPos,
        final int pageCount) {
    List<ChannelTalkItem> itemList = this.getHibernateTemplate().execute(new HibernateCallback<List<ChannelTalkItem>>(){

        @Override
        public List<ChannelTalkItem> doInHibernate(Session session)
                throws HibernateException, SQLException {
            Query query = session.createQuery("from ChannelTalkItem c where c.channelID =:channelId order by c.talkTime asc");
            query.setString( "channelId", channelID);
            query.setFirstResult(startPos);
            query.setMaxResults(pageCount);
            return query.list();
        }

    });
    ChannelTalkItem[] rets = new ChannelTalkItem[itemList.size()];
    itemList.toArray(rets);
    return rets;
}

只要设置一下第一条记录的位置,以及取出多少条数据即可。分别对应设置

query.setFirstResult(startPos);
query.setMaxResults(pageCount);

Mybatis实现分页功能

由于Mybatis不像Hibernate自带分页功能,所以必须进行sql分页,对于sql分页有很多种方式,比如用top , 我这里是使用数据库自带的ROW_NUMBER方法实现的:
mybatis的Mapper.xml部分如下:

 <select id="findByUser" resultMap="ChannelTalkItemResultMap">
<!--
  WARNING - @mbggenerated
  This element is automatically generated by MyBatis Generator, do not modify.
  This element was generated on Tue Mar 17 19:27:41 CST 2015.
-->
select * from (
   select *,ROW_NUMBER() OVER (order by TalkTime asc) as rank from ChannelTalkItem 
   where ChannelID = #{0} 
        and TalkerID = #{1} 
)  as c where c.rank between #{2} and #{3} 
  </select>

原理就是在取出结果的时候,插入一列行序号,在进行编号的时候可以定义按表的哪一列进行排序,这里是按照 TaskTime升序进行编号,然后在where条件里筛选行编号即可。

本站总访问量