【mybatis】mybatis分页拦截器搭配bootstrap-table使用
提前说明:
这一种方式已被我自己pass掉了,已经被新的方式迭代了。但是记录下自己曾经的成果还是有必要的,而且里面的思想还是不变的,另外技术不就是在不断地迭代中升级吗。千万不要想着一步完美,那样会让你止步不前。
业务说明:
前台bootstrap-table插件进行数据展示;后端SSM架子接收参数;
业务分析:
前台传递limit、offset、order、等参数,后台使用Map进行接收。在拦截器中修改原始sql语句,变为分页语句。同时将total总数查询出来。放入从前台接收的map中。在Service层中将mapper查询的list也放入map中然后返回即可。
解决代码:
前台js部分代码:
- queryParams: function(params){
- var temp = {
- limit: params.limit, //页面大小
- offset: params.offset, //页码
- order:params.order,
- sort:params.sort
- };
- return temp;
- },
controller接收代码:
- @RequestMapping("")
- @ResponseBody
- public Map<String ,Object> list(@RequestParam Map<String,Object> params){
- // 存在排序字段时,将实体类字段转换为数据库字段
- if(StringUtils.checkValNotNull(params.get("sort"))){
- params.put("sort",StringUtils.camelToUnderline(params.get("sort").toString()));
- }
- return userService.list(params);
- }
service层代码:
- public Map<String,Object> list(Map<String,Object> params) {
- params.put(Constants.ROWS,userMapper.selectPage(params));
- return params;
- }
mapper接口代码:
- List<UserEntity> selectPage(@Param("pageMap") Map<String,Object> params);
mapper对应的xml部分代码(这里多说一点:#{}和${}用法的区别,在下面排序中,使用预编译的方式有bug所以使用非预编译模式):
- <select id="selectPage" resultType="xxx.UserEntity"
- flushCache="false">
- SELECT
- id
- FROM
- user_entity
- <choose>
- <when test="pageMap!=null">
- <trim prefix="WHERE" prefixOverrides="AND|OR">
- <if test="pageMap.id != null">id=#{pageMap.id}</if>
- AND is_delete='0'
- </trim>
- </when>
- <otherwise>
- WHERE is_delete ='0'
- </otherwise>
- </choose>
- <if test="pageMap.sort != null"> ORDER BY ${pageMap.sort} ${pageMap.order} </if>
- </select>
分页拦截器:
- /**
- * @author wzd
- * @date 2018/12/03
- */
- @Intercepts({
- @Signature(method = "prepare", type = StatementHandler.class, args = { Connection.class,Integer.class }) })
- public class PageInterceptor implements Interceptor {
- @Override
- public Object intercept(Invocation invocation) throws Throwable {
- if (invocation.getTarget() instanceof StatementHandler) {
- return handleStatementHandler(invocation);
- }
- return invocation.proceed();
- }
- private Object handleStatementHandler(Invocation invocation)
- throws InvocationTargetException, IllegalAccessException {
- StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
- MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
- // 仅仅针对查询
- MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
- if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
- return invocation.proceed();
- }
- String id = mappedStatement.getId();
- // 仅仅针对需要分页的查询
- if(id.matches(".+Page$")){
- // 获取查询的参数
- BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
- Map<String,Object> params = (Map<String, Object>) boundSql.getParameterObject();
- Map<String,Object> pageMap = (Map<String, Object>) params.get("pageMap");
- String sql = boundSql.getSql();
- String countSql = "SELECT COUNT(*) FROM ("+ sql+") total";
- this.queryTotal(countSql,metaObject,pageMap, (Connection) invocation.getArgs()[0]);
- String pageSql = sql + " LIMIT "+pageMap.get("offset")+","+pageMap.get("limit");
- metaObject.setValue("delegate.boundSql.sql", pageSql);
- // 禁用mybatis的内存(逻辑)分页,重置下面的两个参数
- metaObject.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET);
- metaObject.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT);
- }
- // 将执行权交给下一个拦截器
- return invocation.proceed();
- }
- @Override
- public Object plugin(Object target) {
- if (target instanceof StatementHandler) {
- return Plugin.wrap(target, this);
- }
- return target;
- }
- @Override
- public void setProperties(Properties properties) {
- }
- /**
- * 查询数据总数(带有查询条件)
- * @param countSql
- * @param metaObject
- * @param pageMap
- * @param connection
- */
- public void queryTotal(String countSql ,MetaObject metaObject, Map<String ,Object> pageMap , Connection connection){
- try{
- //利用原始sql语句的方法执行
- PreparedStatement countStatement = connection.prepareStatement(countSql);
- ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");
- // sql语句的参数设置
- parameterHandler.setParameters(countStatement);
- ResultSet rs = countStatement.executeQuery();
- //当结果集中有值时,表示页面数量大于等于1
- if(rs.next()) {
- pageMap.put("total",rs.getInt(1));
- }
- }catch(Exception e){
- }
- }
- }
【mybatis】mybatis分页拦截器搭配bootstrap-table使用的更多相关文章
- mybatis自定义分页拦截器
最近看了一下项目中代码,发现系统中使用的mybatis分页使用的是mybatis自带的分页,即使用RowBounds来进行分页,而这种分页是基于内存分页,即一次查出所有的数据,然后再返回分页需要的数据 ...
- Mybatis中的拦截器
作者:moshenglv的专栏 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法. ...
- MyBatis功能点二:MyBatis提供的拦截器平台
前面关于MyBatis功能点二plugin已经介绍了一些应用及其实现的底层代码,本文总结MyBatis提供的拦截器平台框架体系. 通过MyBatis功能点二:从责任链设计模式的角度理解插件实现技术 - ...
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- MyBatis空where拦截器
最近项目中出现了至少两次因为Mybatis的动态where条件不满足导致实际sql语句的where条件为空,进而查询全表,当数据量比较大的时候,导致OOM的情况. 如何禁止这种情况,个人觉得三种措施: ...
- Mybatis Plugin(拦截器)的开发
1.Plugin MyBatis 允许使用插件来拦截的方法调用包括: • Executor (update, query, flushStatements, commit, rollback, g ...
- Mybatis那些事-拦截器(Plugin+Interceptor)
作者:yhjyumi的专栏 数据权限实现(Mybatis拦截器+JSqlParser) Mybatis的拦截器实现机制,使用的是JDK的InvocationHandler. 当我们调用Paramete ...
- axios拦截器搭配token使用
在了解到cookie.session.token的作用后学习token的使用 cookie是随着url将参数发送到后台,安全性最低,并且大小受限,不超过4kb左右,它的数据保存在客户端 session ...
- mybatis:SQL拦截器
打印执行的SQL语句 import java.sql.Connection; import java.text.DateFormat; import java.util.Date; import ja ...
随机推荐
- WPF 基础 - Binding 的 数据更新提醒
WPF 作为一个专门的展示层技术,让程序员专注于逻辑层,让展示层永远处于逻辑层的从属地位: 这主要因为有 DataBinding 和配套的 Dependency Property 和 DataTemp ...
- MySQL二进制安装脚本
MySQL二进制包自行百度,晚上很多查找办法 #!/bin/bash #二进制安装mysql并初始化密码为123456 mysql_name=mysql-5.7.31-linux-glibc2.12- ...
- Qt update刷新之源码分析总结
大家好,我是IT文艺男,来自一线大厂的一线程序员 经过前面几次的Qt源码讲解,我相信大家对Qt update刷新机制从底层原理上有了一个深刻的理解:这次做一个收尾总结,来复盘前面几次所讲解的内容: 分 ...
- 前端-CS-04
一:DOM(文档对象模型) document 简写DOM 1.DOM中定义变量用 var 如下截图中:定义demo变量 2.取一个input输入框中的值的方法: 1)先如1中,在dom中顶一个一个变 ...
- Git标签与别名
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- Edge 浏览器开发工具新增了 3D 视图,你尝试了吗?
在使用开发者工具的时候,无意间发现了一个3D面板,如下: 仔细想想,这应该是之前 Firefox 的特性啊,不过后来去掉了,说是太难维护,没想到 Edge 也添加了这个特性. 使用该特性,你可以完成如 ...
- 003-Java中的变量和数据类型
@ 目录 一.变量 1.什么变量 2.变量的三要素 3.变量的命名规范 4.变量的分类 5.变量的作用域 6.变量的注意事项 二.数据类型 1.什么是数据类型 2.数据类型有什么用 3.数据类型的分类 ...
- [leetcode] 单调栈
本文总结单调栈算法. 原问题 学习一个算法,我们需要清楚的是:这个算法最原始的问题背景是什么样的? 下一个更小元素 给定一个数组 nums,返回每个元素的下一个更小的元素的下标 res,即 res[i ...
- 第23 章 : Kubernetes API 编程范式
Kubernetes API 编程范式 需求来源 首先我们先来看一下 API 编程范式的需求来源. 在 Kubernetes 里面, API 编程范式也就是 Custom Resources Defi ...
- 第18 章 : Kubernetes 调度和资源管理
Kubernetes 调度和资源管理 这节课主要讲三部分的内容: Kubernetes 的调度过程: Kubernetes 的基础调度能力(资源调度.关系调度): Kubernetes 高级调度能力( ...