前言

关于Mybatis的知识点总结了一个思维导图分享给大家

数组分页

查询出全部数据,然后再list中截取需要的部分。2021面试题整理。

mybatis接口

List<Student> queryStudentsByArray();

xml配置文件

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

service

接口
List<Student> queryStudentsByArray(int currPage, int pageSize);
实现接口@Overridepublic 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中截取}

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<Student> queryStudentsBySql(Map<String,Object> data);

xml文件

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

拦截器分页

创建拦截器,拦截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;@Overridepublic Object intercept(Invocation invocation) throws Throwable {//获取StatementHandler,默认是RoutingStatementHandlerStatementHandler 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$")) {//获取进行数据库操作时管理参数的handlerParameterHandler parameterHandler = (ParameterHandler) MetaObjectHandler.getValue("delegate.parameterHandler");//获取请求时的参数Map<String, Object> paraObject = (Map<String, Object>) parameterHandler.getParameterObject();//也可以这样获取//paraObject = (Map<String, Object>) 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();}//获取代理对象@Overridepublic Object plugin(Object o) {//生成object对象的动态代理对象return Plugin.wrap(o, this);}//设置代理对象的参数@Overridepublic 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

<configuration><plugins><plugin interceptor="com.autumn.interceptor.MyPageInterceptor"><property name="limit" value="10"/><property name="dbType" value="mysql"/></plugin></plugins></configuration>

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>

service

javapublic List<AccountExt> 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<AccountExt> 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 = '<a href="#" class="btn btn-gmtx-define1" οnclick="delBook(\''+ row.id +'\')">删除</a> ';return f;}}]});});

RowBounds分页

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

mybatis接口加入RowBounds参数

public List queryUsersByPage(String userName, RowBounds rowBounds);

service

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

最后

我这边整理了一份:Mybatis相关面试资料、Mybatis框架资料文档,Java的系统化资料,(包括Java核心知识点、面试专题和20年最新的互联网真题、电子书等)有需要的朋友可以关注公众号【程序媛小琬】即可获取。

Mybatis分页如何实现?四种常用分页方式你Get到没!相关推荐

  1. 后台CS代码中创建四种常用的SL动画效果

    http://www.cnblogs.com/chengxingliang/archive/2011/03/07/1974436.html后台CS代码中创建四种常用的动画效果[附带源码实例] 转载于: ...

  2. [转载] java实现四种常用排序算法

    参考链接: 用Java排序 四种常用排序算法 ##注:从小到大排 ##冒泡排序## 特点:效率低,实现简单 思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有 ...

  3. htt【RiPro网盘链接检测插件】目前支持四种常用网盘

    介绍: 目前支持百度网盘.蓝奏云.天翼云盘.坚果云盘,后续将支持更多网盘,如果你也想自己常用的网盘加入评论或联系站长告知,谢谢! 另外如使用过程中发现有链接状态已检测结果不匹配,请带上链接找站长修复! ...

  4. (42)FPGA四种常用逻辑门(同或门)

    (42)FPGA四种常用逻辑门(同或门) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA四种常用逻辑门(同或门) 5)技术交流 6)参考资料 2 FPGA入 ...

  5. (41)FPGA四种常用逻辑门(异或门)

    (41)FPGA四种常用逻辑门(异或门) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA四种常用逻辑门(异或门) 5)技术交流 6)参考资料 2 FPGA入 ...

  6. (40)FPGA四种常用逻辑门(或非门)

    (40)FPGA四种常用逻辑门(或非门) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA四种常用逻辑门(或非门) 5)技术交流 6)参考资料 2 FPGA入 ...

  7. (39)FPGA四种常用逻辑门(与非门)

    (39)FPGA四种常用逻辑门(与非门) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA四种常用逻辑门(与非门) 5)技术交流 6)参考资料 2 FPGA入 ...

  8. java regex match 替换_java正则表达式四种常用的处理方式(匹配、分割、替代、获取)...

    java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下 package test; import java.util.regex.Matcher; import ja ...

  9. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式

    IT外包服务主要分为IT运维外包和软件开发外包,对于软件开发外包主要偏于研发类型,在本文中主要讨论IT运维外包. 上海蓝盟认为,IT运维外包主要包含IT服务外包.IT采购.弱电工程.系统集成和云服务等 ...

最新文章

  1. linux严谨的telnet搭建并用防火墙开通与禁行
  2. c语言编程:输入一个数看它是不是素数
  3. Making Your Own iPhone Frameworks. In Xcode
  4. 当AI渗透到财务管理 未来人机协作机器人有望“独当一面”
  5. python引用传递产生的问题_理解Python中传递值和引用时出现问题
  6. shell总结(0基础入门)
  7. 你知道Java的四种引用类型吗
  8. oracle查询cpu占用率高,解决oracle进程CPU占用过高问题
  9. ps4pro服务器维护,PS4 | PS4 Pro 常见问题 | PlayStation
  10. Pytorch基础(一) 初始tensor
  11. 什么是pom文件_什么是POM?
  12. mysql 计算15位身份证_15位身份证补全为18位身份证算法
  13. 2021年阿里云服务器租用价格表(最新更新)
  14. 如何用EasyRecovery恢复U盘内损坏的数据
  15. OC_AddressBook_通讯录
  16. lintcode 输出赛程表
  17. 拼多多 标题 html,拼多多的创意图和创意标题怎么测试?为什么要测试?怎样测试呢?...
  18. 缔元信:用户画像技术助推大数据落地
  19. 韩松 EIE: Efficient Inference Engine on Compressed Deep Neural Network论文详解
  20. 第一天送宇轩去幼儿园

热门文章

  1. 使用IDEA打包程序到jar包
  2. 一些常用APP包名汇总
  3. PADS Layout软件如何建立元器件PCB封装
  4. 2022-5-4 Leetcode 110.平衡二叉树
  5. oracle rac 火星舱_火星舱说明手册(增加CDP版).doc
  6. python中单线程重复利用
  7. 「OrthoFinder2」直系同源基因的寻找以及Orthogroup构建
  8. 从一道笔试题谈算法优化(下)
  9. 单片机工程师轻松实现触摸屏人机界面的界面编程
  10. android ExpandableList的自动收起