Mybatis四种分页方式

拼搏现实的明天。 2024-04-18 17:20 155阅读 0赞

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

mybatis的4种分页方式: https://blog.csdn.net/u010667011/article/details/83819277

mybatis-plus分页查询: https://www.jianshu.com/p/43bfe6fe8d89

MyBatis 分页插件 PageHelper: https://pagehelper.github.io/

数组分页

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

mybatis接口

  1. List<Student> queryStudentsByArray();

xml配置文件

  1. <select id="queryStudentsByArray" resultMap="studentmapper">
  2. select * from student
  3. </select>

service

复制代码

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

复制代码

controller

复制代码

  1. @ResponseBody
  2. @RequestMapping("/student/array/{currPage}/{pageSize}")
  3. public List<Student> getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) {
  4. List<Student> student = StuServiceIml.queryStudentsByArray(currPage, pageSize);
  5. return student;
  6. }

复制代码

sql分页

mybatis接口

  1. List<Student> queryStudentsBySql(Map<String,Object> data);

xml文件

  1. <select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">
  2. select * from student limit #{currIndex} , #{pageSize}
  3. </select>

service

复制代码

  1. 接口
  2. List<Student> queryStudentsBySql(int currPage, int pageSize);
  3. 实现类
  4. public List<Student> queryStudentsBySql(int currPage, int pageSize) {
  5. Map<String, Object> data = new HashedMap();
  6. data.put("currIndex", (currPage-1)*pageSize);
  7. data.put("pageSize", pageSize);
  8. return studentMapper.queryStudentsBySql(data);
  9. }

复制代码

springjdbctemplete写分页语句

拦截器分页

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

复制代码

  1. package com.autumn.interceptor;
  2. import org.apache.ibatis.executor.Executor;
  3. import org.apache.ibatis.executor.parameter.ParameterHandler;
  4. import org.apache.ibatis.executor.resultset.ResultSetHandler;
  5. import org.apache.ibatis.executor.statement.StatementHandler;
  6. import org.apache.ibatis.mapping.MappedStatement;
  7. import org.apache.ibatis.plugin.*;
  8. import org.apache.ibatis.reflection.MetaObject;
  9. import org.apache.ibatis.reflection.SystemMetaObject;
  10. import java.sql.Connection;
  11. import java.util.Map;
  12. import java.util.Properties;
  13. /**
  14. * @Intercepts 说明是一个拦截器
  15. * @Signature 拦截器的签名
  16. * type 拦截的类型 四大对象之一( Executor,ResultSetHandler,ParameterHandler,StatementHandler)
  17. * method 拦截的方法
  18. * args 参数,高版本需要加个Integer.class参数,不然会报错
  19. */
  20. @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})
  21. public class MyPageInterceptor implements Interceptor {
  22. //每页显示的条目数
  23. private int pageSize;
  24. //当前现实的页数
  25. private int currPage;
  26. //数据库类型
  27. private String dbType;
  28. @Override
  29. public Object intercept(Invocation invocation) throws Throwable {
  30. //获取StatementHandler,默认是RoutingStatementHandler
  31. StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
  32. //获取statementHandler包装类
  33. MetaObject MetaObjectHandler = SystemMetaObject.forObject(statementHandler);
  34. //分离代理对象链
  35. while (MetaObjectHandler.hasGetter("h")) {
  36. Object obj = MetaObjectHandler.getValue("h");
  37. MetaObjectHandler = SystemMetaObject.forObject(obj);
  38. }
  39. while (MetaObjectHandler.hasGetter("target")) {
  40. Object obj = MetaObjectHandler.getValue("target");
  41. MetaObjectHandler = SystemMetaObject.forObject(obj);
  42. }
  43. //获取连接对象
  44. //Connection connection = (Connection) invocation.getArgs()[0];
  45. //object.getValue("delegate"); 获取StatementHandler的实现类
  46. //获取查询接口映射的相关信息
  47. MappedStatement mappedStatement = (MappedStatement) MetaObjectHandler.getValue("delegate.mappedStatement");
  48. String mapId = mappedStatement.getId();
  49. //statementHandler.getBoundSql().getParameterObject();
  50. //拦截以.ByPage结尾的请求,分页功能的统一实现
  51. if (mapId.matches(".+ByPage$")) {
  52. //获取进行数据库操作时管理参数的handler
  53. ParameterHandler parameterHandler = (ParameterHandler) MetaObjectHandler.getValue("delegate.parameterHandler");
  54. //获取请求时的参数
  55. Map<String, Object> paraObject = (Map<String, Object>) parameterHandler.getParameterObject();
  56. //也可以这样获取
  57. //paraObject = (Map<String, Object>) statementHandler.getBoundSql().getParameterObject();
  58. //参数名称和在service中设置到map中的名称一致
  59. currPage = (int) paraObject.get("currPage");
  60. pageSize = (int) paraObject.get("pageSize");
  61. String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");
  62. //也可以通过statementHandler直接获取
  63. //sql = statementHandler.getBoundSql().getSql();
  64. //构建分页功能的sql语句
  65. String limitSql;
  66. sql = sql.trim();
  67. limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;
  68. //将构建完成的分页sql语句赋值个体'delegate.boundSql.sql',偷天换日
  69. MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);
  70. }
  71. //调用原对象的方法,进入责任链的下一级
  72. return invocation.proceed();
  73. }
  74. //获取代理对象
  75. @Override
  76. public Object plugin(Object o) {
  77. //生成object对象的动态代理对象
  78. return Plugin.wrap(o, this);
  79. }
  80. //设置代理对象的参数
  81. @Override
  82. public void setProperties(Properties properties) {
  83. //如果项目中分页的pageSize是统一的,也可以在这里统一配置和获取,这样就不用每次请求都传递pageSize参数了。参数是在配置拦截器时配置的。
  84. String limit1 = properties.getProperty("limit", "10");
  85. this.pageSize = Integer.valueOf(limit1);
  86. this.dbType = properties.getProperty("dbType", "mysql");
  87. }
  88. }

复制代码

配置文件SqlMapConfig.xml

复制代码

  1. <configuration>
  2. <plugins>
  3. <plugin interceptor="com.autumn.interceptor.MyPageInterceptor">
  4. <property name="limit" value="10"/>
  5. <property name="dbType" value="mysql"/>
  6. </plugin>
  7. </plugins>
  8. </configuration>

复制代码

mybatis配置

复制代码

  1. <!--接口-->
  2. List<AccountExt> getAllBookByPage(@Param("currPage")Integer pageNo,@Param("pageSize")Integer pageSize);
  3. <!--xml配置文件-->
  4. <sql id="getAllBooksql" >
  5. acc.id, acc.cateCode, cate_name, user_id,u.name as user_name, money, remark, time
  6. </sql>
  7. <select id="getAllBook" resultType="com.autumn.pojo.AccountExt" >
  8. select
  9. <include refid="getAllBooksql" />
  10. from account as acc
  11. </select>

复制代码

service

  1. public List<AccountExt> getAllBookByPage(String pageNo,String pageSize) {
  2. return accountMapper.getAllBookByPage(Integer.parseInt(pageNo),Integer.parseInt(pageSize));
  3. }

controller

复制代码

  1. @RequestMapping("/getAllBook")
  2. @ResponseBody
  3. public Page getAllBook(String pageNo,String pageSize,HttpServletRequest request,HttpServletResponse response){
  4. pageNo=pageNo==null?"1":pageNo; //当前页码
  5. pageSize=pageSize==null?"5":pageSize; //页面大小
  6. //获取当前页数据
  7. List<AccountExt> list = bookService.getAllBookByPage(pageNo,pageSize);
  8. //获取总数据大小
  9. int totals = bookService.getAllBook();
  10. //封装返回结果
  11. Page page = new Page();
  12. page.setTotal(totals+"");
  13. page.setRows(list);
  14. return page;
  15. }

复制代码

Page实体类

复制代码

  1. package com.autumn.pojo;
  2. import java.util.List;
  3. /**
  4. * Created by Autumn on 2018/6/21.
  5. */
  6. public class Page {
  7. private String pageNo = null;
  8. private String pageSize = null;
  9. private String total = null;
  10. private List rows = null;
  11. public String getTotal() {
  12. return total;
  13. }
  14. public void setTotal(String total) {
  15. this.total = total;
  16. }
  17. public List getRows() {
  18. return rows;
  19. }
  20. public void setRows(List rows) {
  21. this.rows = rows;
  22. }
  23. public String getPageNo() {
  24. return pageNo;
  25. }
  26. public void setPageNo(String pageNo) {
  27. this.pageNo = pageNo;
  28. }
  29. public String getPageSize() {
  30. return pageSize;
  31. }
  32. public void setPageSize(String pageSize) {
  33. this.pageSize = pageSize;
  34. }
  35. }

复制代码

前端

bootstrap-table接受数据格式

复制代码

  1. {
  2. "total": 3,
  3. "rows": [
  4. {
  5. "id": 0,
  6. "name": "Item 0",
  7. "price": "$0"
  8. },
  9. {
  10. "id": 1,
  11. "name": "Item 1",
  12. "price": "$1"
  13. }
  14. ]
  15. }

复制代码

boostrap-table用法

复制代码

  1. var $table = $('#table');
  2. $table.bootstrapTable({
  3. url: "/${appName}/manager/bookController/getAllBook",
  4. method: 'post',
  5. contentType: "application/x-www-form-urlencoded",
  6. dataType: "json",
  7. pagination: true, //分页
  8. sidePagination: "server", //服务端处理分页
  9. pageList: [5, 10, 25],
  10. pageSize: 5,
  11. pageNumber:1,
  12. //toolbar:"#tb",
  13. singleSelect: false,
  14. queryParamsType : "limit",
  15. queryParams: function queryParams(params) { //设置查询参数
  16. var param = {
  17. pageNo: params.offset/params.limit+1, //offset为数据开始索引,转换为显示当前页
  18. pageSize: params.limit //页面大小
  19. };
  20. console.info(params); //查看参数是什么
  21. console.info(param); //查看自定义的参数
  22. return param;
  23. },
  24. cache: false,
  25. //data-locale: "zh-CN", //表格汉化
  26. //search: true, //显示搜索框
  27. columns: [
  28. {
  29. checkbox: true
  30. },
  31. {
  32. title: '消费类型',
  33. field: 'cate_name',
  34. valign: 'middle'
  35. },
  36. {
  37. title: '消费金额',
  38. field: 'money',
  39. valign: 'middle',
  40. formatter:function(value,row,index){
  41. if(!isNaN(value)){ //是数字
  42. return value/100;
  43. }
  44. }
  45. },
  46. {
  47. title: '备注',
  48. field: 'remark',
  49. valign: 'middle'
  50. },
  51. {
  52. title: '消费时间',
  53. field: 'time',
  54. valign: 'middle'
  55. },
  56. {
  57. title: '操作',
  58. field: '',
  59. formatter:function(value,row,index){
  60. var f = '<a href="#" class="btn btn-gmtx-define1" οnclick="delBook(\''+ row.id +'\')">删除</a> ';
  61. return f;
  62. }
  63. }
  64. ]
  65. });
  66. });

复制代码

RowBounds分页

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

mybatis接口加入RowBounds参数

public List queryUsersByPage(String userName, RowBounds rowBounds);

service

  1. @Override
  2. @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)
  3. public List<RoleBean> queryRolesByPage(String roleName, int start, int limit) {
  4. return roleDao.queryRolesByPage(roleName, new RowBounds(start, limit));
  5. }

面朝大海,春暖花开~

发表评论

表情:
评论列表 (有 0 条评论,155人围观)

还没有评论,来说两句吧...

相关阅读