• mybatis分页


    mybatis的四种分页方式:

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

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

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

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

    数组分页

    mybatis接口:List<Student> queryStudentsByArray();

    xml配置文件:

     <select id="queryStudentsByArray"  resultMap="studentmapper">
            select * from student
     </select>

    service:

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

    sql分页:

    mybatis接口:List<Student> queryStudentsBySql(Map<String,Object> data);

    xml配置文件:

    //currIndex:查询起始条    pageSize:返回的条数
    <select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper"> select * from student limit #{currIndex} , #{pageSize} </select>

    service:

    接口
    List<Student> queryStudentsBySql(int currPage, int pageSize);
    实现类
    public List<Student> queryStudentsBySql(int currPage, int pageSize) {
            Map<String, Object> 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:

    <configuration>
        <plugins>
            <plugin interceptor="com.autumn.interceptor.MyPageInterceptor">
                <property name="limit" value="10"/>
                <property name="dbType" value="mysql"/>
            </plugin>
        </plugins>
    </configuration>
    /**
     * @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);
    <!--xml配置文件--> <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<AccountExt> 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<Book> selectBookByName(Map<String, Object> map, RowBounds rowBounds);
    mapper层:
    List<Book> list = bookMapper.selectBookByName(map, new RowBounds(0, 5));
    // new RowBounds(0, 5),即第一页,每页取5条数据
  • 相关阅读:
    用SQL实现统计报表中的“小计”和“合计”
    GROUPPING和ROLLUP的基本知识
    DECODE函数
    C#调用Python,报错No module named os
    Database differential backup差异备份和还原
    C#多线程和线程同步总结
    TF30042: The database is full. Contact your Team Foundation Server administrator.
    C#算法面试题
    sql分区文件删不的可能解决方法
    word建立统一的表格样式
  • 原文地址:https://www.cnblogs.com/lgg20/p/12023246.html
Copyright © 2020-2023  润新知