持久层实现分页功能
分页功能在很多场合都会使用,比如如果有很多的资料,不分页的话网页效率将会堪忧, 用户体验也不好,分页功能有效缓解大数据的压力,这里所讲分页功能,主要是对数据库中的结构化数据而言的。
持久层框架我用过两种:Hibernate 和 Mybatis 。 这里将两种框架的分页功能进行实现。
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条件里筛选行编号即可。