mybatis分页

mybatis的四种分页方式:

第一种.数组分页;查询所有数据,放到list里面。调接口取数据的时候通过参数页数,和条数在list里面截取出需要的数据。

第二种.sql分页;通过查询sql的limit限制,limit5,8;从第六条数据开始取出8条数据。

第三种.拦截器分页;实际上是把接口拦截下来,重新组装数据,把需要查询的页数,和条数通过sql查询出来,再返回出去。

第四种.rowbounds分页;使用 RowBounds 分页,非常方便,不需要在 sql 语句中写 limit,mybatis 会自动拼接 sql ,添加 limit。

数组分页

mybatis接口:List queryStudentsByArray();

xml配置文件:

 

service:

接口
List queryStudentsByArray(int currPage, int pageSize);
实现接口
 @Override
    public List queryStudentsByArray(int currPage, int pageSize) {
        //查询全部数据
        List students = studentMapper.queryStudentsByArray();
        //从第几条数据开始
        int firstIndex = (currPage - 1) * pageSize;
        //到第几条数据结束
        int lastIndex = currPage * pageSize;
        return students.subList(firstIndex, lastIndex); //直接在list中截取
    }

sql分页:

mybatis接口:List queryStudentsBySql(Map data);

xml配置文件:

//currIndex:查询起始条    pageSize:返回的条数

service:

接口
List queryStudentsBySql(int currPage, int pageSize);
实现类
public List queryStudentsBySql(int currPage, int pageSize) {
        Map data = new HashedMap();
        data.put("currIndex", (currPage-1)*pageSize);
        data.put("pageSize", pageSize);
        return studentMapper.queryStudentsBySql(data);
    }

拦截器分页:

相关链接:

分页插件:https://segmentfault.com/a/1190000018200373

实现https://www.cnblogs.com/aeolian/p/9229149.html

 配置文件SqlMapConfig.xml:


    
        
            
            
        
    
/**
 * @Intercepts 说明是一个拦截器
 * @Signature 拦截器的签名
 * type 拦截的类型 四大对象之一( Executor,ResultSetHandler,ParameterHandler,StatementHandler)
 * method 拦截的方法
 * args 参数,高版本需要加个Integer.class参数,不然会报错
 */
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})
public class MyPageInterceptor implements Interceptor {

    //每页显示的条目数
    private int pageSize;
    //当前现实的页数
    private int currPage;
    //数据库类型
    private String dbType;


    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //获取StatementHandler,默认是RoutingStatementHandler
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        //获取statementHandler包装类
        MetaObject MetaObjectHandler = SystemMetaObject.forObject(statementHandler);

        //分离代理对象链
        while (MetaObjectHandler.hasGetter("h")) {
            Object obj = MetaObjectHandler.getValue("h");
            MetaObjectHandler = SystemMetaObject.forObject(obj);
        }

        while (MetaObjectHandler.hasGetter("target")) {
            Object obj = MetaObjectHandler.getValue("target");
            MetaObjectHandler = SystemMetaObject.forObject(obj);
        }
..........

mybatis配置:

  
  List<AccountExt> getAllBookByPage(@Param("currPage")Integer pageNo,@Param("pageSize")Integer pageSize);
<sql id="getAllBooksql" > acc.id, acc.cateCode, cate_name, user_id,u.name as user_name, money, remark, time sql> <select id="getAllBook" resultType="com.autumn.pojo.AccountExt" > select <include refid="getAllBooksql" /> from account as acc select>

controller:

 @RequestMapping("/getAllBook")
    @ResponseBody
    public Page getAllBook(String pageNo,String pageSize,HttpServletRequest request,HttpServletResponse response){
        pageNo=pageNo==null?"1":pageNo;   //当前页码
        pageSize=pageSize==null?"5":pageSize;   //页面大小
        //获取当前页数据
        List list = bookService.getAllBookByPage(pageNo,pageSize);
        //获取总数据大小
        int totals = bookService.getAllBook();
        //封装返回结果
        Page page = new Page();
        page.setTotal(totals+"");
        page.setRows(list);
        return page;
    }

Rowbounds分页:

mybatis 中,使用 RowBounds 分页,非常方便,不需要在 sql 语句中写 limit,mybatis 会自动拼接 sql ,添加 limit。

最核心的是在 mapper 接口层,传参时传入 RowBounds(int offset, int limit) 对象,即可完成分页。

接口层:
List selectBookByName(Map map, RowBounds rowBounds);
mapper层:
List list = bookMapper.selectBookByName(map, new RowBounds(0, 5));
// new RowBounds(0, 5),即第一页,每页取5条数据

你可能感兴趣的:(mybatis分页)