• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java使用MyBatis框架分页的5种方式

java 搞代码 4年前 (2022-01-09) 22次浏览 已收录 0个评论

本文为大家分享了Java使用MyBatis框架分页的五种方式,供大家参考,具体内容如下

初始准备

1.创建分页对象类,方便模块间传值

//PageInfo.java
import lombok.Data;

@Data
public class PageInfo {

  private int pageNo;

  private int pageSize;

}

2.定义DAO层接口

import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserMapper {

  User selectByUser(User user);
  List<User> selectAll();
  List<User> selectByPageInfo(PageInfo info);
  List<User> selectByInterceptor(PageInfo info);

  List<User> selectByRowBounds(RowBounds rowBounds);

}

3.mapper中定义结果集合BaseResult

<resultMap id="BaseResult" type="cn.edu.yau.pojo.User">
    <id property="id" column="id" jdbcType="INTEGER"></id>
    <result property="username" column="username" jdbcType="VARCHAR"></result>
    <result property="password" column="password" jdbcType="VARCHAR"></result>
 </resultMap>

一、原始切分:最原始方法,不建议使用

1.mapper代码:查询所有数据

<select id="selectAll" resultMap="BaseResult">
  select * from tb_user
</select>

2.业务层代码:利用List的subList()方法对数据进行切片

public List<User> findByAll(PageInfo info) {
    List<User> users = userMapper.selectAll();
    return users.subList(info.getPageNo(), info.getPageSize());
  }

3.控制层代码

@RequestMapping(value = "/userlist_1", method = RequestMethod.GET)
@ResponseBody
  public Result findUserBySubList(PageInfo info) {
    List<User> users = userService.findByAll(info);
    if(users.size() == 0) {
      return ResultGenerator.genFailResult("未查找到用户");
    }
    return ResultGenerator.genSuccessResult(users);
  }

二、LIMIT关键字

1.mapper代码:利用limit关键字实现分页

<select id="selectByPageInfo" resultMap="BaseResult">
    select * from tb_user limit #{pageNo}, #{pageSize}
</select>

2.业务层直接调用

public List<User> findByPageInfo(Pa<div style="color:transparent">本文来源gaodai.ma#com搞##代!^码@网*</div>geInfo info) {
    return userMapper.selectByPageInfo(info);
  }

3.控制层直接调用

三、RowBounds实现分页

1.在DAO层定义好所要传输的分页信息,类型为RowBounds

2.mapper层:查询所有数据

3.业务层:将PageInfo信息封装成RowBounds,调用DAO层方法

public List<User> findByRowBounds(PageInfo info) {
    return userMapper.selectByRowBounds(new RowBounds(info.getPageNo(), info.getPageSize()));
  }

4.控制层直接调用

四、MyBatis的Interceptor实现:实现复杂,需要明白MyBatis的实现

1.创建Interceptor

import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

import java.sql.Connection;
import java.util.Properties;

/**
 * 利用MyBatis拦截器进行分页
 *
 * @Intercepts 说明是一个拦截器
 * @Signature 拦截器的签名
 * type 拦截的类型 四大对象之一( Executor,ResultSetHandler,ParameterHandler,StatementHandler)
 * method 拦截的方法
 * args 参数,高版本需要加个Integer.class参数,不然会报错
 *
 */
@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);
    //分隔代理对象
    while (metaObject.hasGetter("h")) {
      Object obj = metaObject.getValue("h");
      metaObject = SystemMetaObject.forObject(obj);
    }
    while (metaObject.hasGetter("target")) {
      Object obj = metaObject.getValue("target");
      metaObject = SystemMetaObject.forObject(obj);
    }
    //获取查看接口映射的相关信息
    MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
    String mapId = mappedStatement.getId();
    //拦截以ByInterceptor结尾的请求,统一实现分页
    if (mapId.matches(".+ByInterceptor$")) {
      System.out.println("LOG:已触发分页拦截器");
      //获取进行数据库操作时管理参数的Handler
      ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");
      //获取请求时的参数
      PageInfo info = (PageInfo) parameterHandler.getParameterObject();
      //获取原始SQL语句
      String originalSql = (String) metaObject.getValue("delegate.boundSql.sql");
      //构建分页功能的SQL语句
      String sql = originalSql.trim() + " limit " + info.getPageNo() + ", " + info.getPageSize();
      metaObject.setValue("delegate.boundSql.sql", sql);
    }
    //调用原对象方法,进入责任链下一级
    return invocation.proceed();
  }

  @Override
  public Object plugin(Object target) {
    //生成Object对象的动态代理对象
    return Plugin.wrap(target, this);
  }

  @Override
  public void setProperties(Properties properties) {
    //如果分页每页数量是统一的,可以在这里进行统一配置,也就无需再传入PageInfo信息了
  }
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java使用MyBatis框架分页的5种方式

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址