博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis四种分页方式
阅读量:7030 次
发布时间:2019-06-28

本文共 9940 字,大约阅读时间需要 33 分钟。

数组分页

查询出全部数据,然后再list中截取需要的部分。

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中截取 }

controller

@ResponseBody    @RequestMapping("/student/array/{currPage}/{pageSize}")    public List
getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) { List
student = StuServiceIml.queryStudentsByArray(currPage, pageSize); return student; }

sql分页

mybatis接口

List
queryStudentsBySql(Map
data);

xml文件

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); }

拦截器分页

创建拦截器,拦截mybatis接口方法id以ByPage结束的语句

package com.autumn.interceptor;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.parameter.ParameterHandler;import org.apache.ibatis.executor.resultset.ResultSetHandler;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.Map;import java.util.Properties;/** * @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);        }        //获取连接对象        //Connection connection = (Connection) invocation.getArgs()[0];        //object.getValue("delegate");  获取StatementHandler的实现类        //获取查询接口映射的相关信息        MappedStatement mappedStatement = (MappedStatement) MetaObjectHandler.getValue("delegate.mappedStatement");        String mapId = mappedStatement.getId();        //statementHandler.getBoundSql().getParameterObject();        //拦截以.ByPage结尾的请求,分页功能的统一实现        if (mapId.matches(".+ByPage$")) {            //获取进行数据库操作时管理参数的handler            ParameterHandler parameterHandler = (ParameterHandler) MetaObjectHandler.getValue("delegate.parameterHandler");            //获取请求时的参数            Map
paraObject = (Map
) parameterHandler.getParameterObject(); //也可以这样获取 //paraObject = (Map
) statementHandler.getBoundSql().getParameterObject(); //参数名称和在service中设置到map中的名称一致 currPage = (int) paraObject.get("currPage"); pageSize = (int) paraObject.get("pageSize"); String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql"); //也可以通过statementHandler直接获取 //sql = statementHandler.getBoundSql().getSql(); //构建分页功能的sql语句 String limitSql; sql = sql.trim(); limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize; //将构建完成的分页sql语句赋值个体'delegate.boundSql.sql',偷天换日 MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql); } //调用原对象的方法,进入责任链的下一级 return invocation.proceed(); } //获取代理对象 @Override public Object plugin(Object o) { //生成object对象的动态代理对象 return Plugin.wrap(o, this); } //设置代理对象的参数 @Override public void setProperties(Properties properties) { //如果项目中分页的pageSize是统一的,也可以在这里统一配置和获取,这样就不用每次请求都传递pageSize参数了。参数是在配置拦截器时配置的。 String limit1 = properties.getProperty("limit", "10"); this.pageSize = Integer.valueOf(limit1); this.dbType = properties.getProperty("dbType", "mysql"); }}

 配置文件SqlMapConfig.xml

mybatis配置

List
getAllBookByPage(@Param("currPage")Integer pageNo,@Param("pageSize")Integer pageSize);
acc.id, acc.cateCode, cate_name, user_id,u.name as user_name, money, remark, time

service

public List
getAllBookByPage(String pageNo,String pageSize) { return accountMapper.getAllBookByPage(Integer.parseInt(pageNo),Integer.parseInt(pageSize)); }

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; }

Page实体类

package com.autumn.pojo;import java.util.List;/** * Created by Autumn on 2018/6/21. */public class Page {    private String pageNo = null;    private String pageSize = null;    private String total = null;    private List rows = null;    public String getTotal() {        return total;    }    public void setTotal(String total) {        this.total = total;    }    public List getRows() {        return rows;    }    public void setRows(List rows) {        this.rows = rows;    }    public String getPageNo() {        return pageNo;    }    public void setPageNo(String pageNo) {        this.pageNo = pageNo;    }    public String getPageSize() {        return pageSize;    }    public void setPageSize(String pageSize) {        this.pageSize = pageSize;    }}

前端

bootstrap-table接受数据格式

{  "total": 3,  "rows": [    {      "id": 0,      "name": "Item 0",      "price": "$0"    },    {      "id": 1,      "name": "Item 1",      "price": "$1"    }  ]}

boostrap-table用法

var $table = $('#table');        $table.bootstrapTable({        url: "/${appName}/manager/bookController/getAllBook",        method: 'post',        contentType: "application/x-www-form-urlencoded",        dataType: "json",        pagination: true, //分页        sidePagination: "server", //服务端处理分页        pageList: [5, 10, 25],        pageSize: 5,        pageNumber:1,        //toolbar:"#tb",        singleSelect: false,        queryParamsType : "limit",        queryParams: function queryParams(params) {   //设置查询参数          var param = {            pageNo: params.offset/params.limit+1,  //offset为数据开始索引,转换为显示当前页            pageSize: params.limit  //页面大小          };          console.info(params);   //查看参数是什么          console.info(param);   //查看自定义的参数          return param;        },        cache: false,        //data-locale: "zh-CN", //表格汉化        //search: true, //显示搜索框        columns: [                {                    checkbox: true                },                {                    title: '消费类型',                    field: 'cate_name',                    valign: 'middle'                },                {                    title: '消费金额',                    field: 'money',                    valign: 'middle',                    formatter:function(value,row,index){                        if(!isNaN(value)){   //是数字                            return value/100;                        }                    }                },                {                    title: '备注',                    field: 'remark',                    valign: 'middle'                },                {                    title: '消费时间',                    field: 'time',                    valign: 'middle'                },                {                    title: '操作',                    field: '',                    formatter:function(value,row,index){                        var f = '删除 ';                        return f;                       }                }            ]          });      });

RowBounds分页

数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。

mybatis接口加入RowBounds参数

public List<UserBean> queryUsersByPage(String userName, RowBounds rowBounds);

service

@Override    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)    public List
queryRolesByPage(String roleName, int start, int limit) { return roleDao.queryRolesByPage(roleName, new RowBounds(start, limit)); }

转载于:https://www.cnblogs.com/aeolian/p/9229149.html

你可能感兴趣的文章
深入理解Java虚拟机(类加载机制)
查看>>
在500jsp错误页面获取错误信息
查看>>
iOS-CALayer遮罩效果
查看>>
为什么需要版本管理
查看>>
五、Dart 关键字
查看>>
React Native学习笔记(一)附视频教学
查看>>
记Promise得一些API
查看>>
javascript事件之调整大小(resize)事件
查看>>
20145234黄斐《Java程序设计》第六周学习总结
查看>>
【CLRS】《算法导论》读书笔记(四):栈(Stack)、队列(Queue)和链表(Linked List)...
查看>>
hibernate 和 mybatis区别
查看>>
互联网广告综述之点击率特征工程
查看>>
HDU3421 Max Sum II【序列处理】
查看>>
POJ NOI MATH-7653 地球人口承载力估计
查看>>
iOS UI高级之网络编程(HTTP协议)
查看>>
使用cocoaPods import导入时没有提示的解决办法
查看>>
iOS数据持久化存储之归档NSKeyedArchiver
查看>>
JavaScript面向对象
查看>>
Intellij修改模板代码
查看>>
2.页面布局示例笔记
查看>>