LIMIT关键字
- mapper代码
<select id="selectByPageInfo" resultMap="BaseResult">
select * from tb_user limit #{pageNo}, #{pageSize}
</select>
- 业务层直接调用
public List<User> findByPageInfo(PageInfo info) {
return userMapper.selectByPageInfo(info);
}
3,优点
灵活性高,可优化空间大mysql分页语句优化
4,缺点
实现复杂。
RowBounds实现分页
Mybatis提供RowBounds类来实现逻辑分页。RowBounds中有2个字段offset和limit。这种方式获取所有的ResultSet,从ResultSet中的offset位置开始获取limit个记录。但这并不意味着JDBC驱动器会将所有的ResultSet存放在内存,实际上只加载小部分数据到内存,如果需要,再加载部分数据到内存。
- mapper代码
<select id="selectPage" resultType="com.example.demo.mapper.one.User">
select * from user
</select>
- dao代码
List<User> selectPage(RowBounds rowBounds);
- 分页查询
List<User> users = userMapper.selectPage(new RowBounds(5, 10));
log.info("users:{}",users);
查询结果:
users:[User(id=6, username=柳云璇, grade=小三(5)班, age=25, phone=17358053274, sex=女), User(id=7, username=酆雨寒, grade=高一(5)班, age=19, phone=15394214112, sex=女), User(id=8, username=郑春阳, grade=小三(7)班, age=24, phone=15004202411, sex=男)]
- 优点
使用起来比直接limit简单。
5,缺点
DB压力比较大,因为将结果暂存在db了。
Interceptor实现
- 自定义Interceptor
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {
Connection.class, Integer.class})})
public class DefinedPageInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
//获取StatementHandler,默认的是RoutingStatementHandler
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
//获取StatementHandler的包装类
MetaObject metaObject = SystemMetaObject.forObject(statementHandler);