【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 ...
随机推荐
- 最简单的JVM内存结构图
JVM内存结构图 大家好,好几天没有更新了,今天的内容有点多,我们详细介绍下JVM内部结构图,还是和之前一样,案例先行,方便大家理解记忆. /** * @author :jiaolian * @dat ...
- Vue 全家桶学习资源(转)
companion: React 全家桶学习资源(持续更新) 下面整理了一些关于Vue以及Vue衍生的学习资源: 官网文档 官网API ECMAScript 6 入门 30分钟掌握ES6/ES2015 ...
- 混合编程:如何用python11调用C++
摘要:在实际开发过程中,免不了涉及到混合编程,比如,对于python这种脚本语言,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成. 那怎样做呢?我们能使用pybind11作 ...
- ch2_8_2求解幸运数问题
思路:f(x)进行十进制每位相加,g(x)进行二进制每位相加,比较是否相等即可. 小明同学学习了不同的进制之后,拿起了一些数字做起了游戏.小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中 ...
- 攻防世界 reverse 2ex1
2ex1 CISCN-2018-Quals mark 1 import base64 2 3 std_base= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk ...
- 数据表设计之主键自增、UUID或联合主键
最近在做数据库设计的时候(以MySQL为主),遇到不少困惑,因为之前做数据库表设计,基本上主键都是使用自增的形式,最近因为这种做法,被领导指出存在一些不足,于是我想搞明白哪里不足. 一.MySQL为什 ...
- 【论文笔记】Learning Fashion Compatibility with Bidirectional LSTMs
论文:<Learning Fashion Compatibility with Bidirectional LSTMs> 论文地址:https://arxiv.org/abs/1707.0 ...
- nacos下载慢吗?来这里
https://gitee.com/soul_PreCoder/springcloudalibab/repository/archive/master.zip
- Spring Authorization Server 全新授权服务器整合使用
前言 Spring Authorization Server 是 Spring 团队最新开发适配 OAuth 协议的授权服务器项目,旨在替代原有的 Spring Security OAuth 经过半年 ...
- 如何自己设计一个类似dubbo的rpc框架?
(1)上来你的服务就得去注册中心注册吧,你是不是得有个注册中心,保留各个服务的信息,可以用zookeeper来做,对吧 (2)然后你的消费者需要去注册中心拿对应的服务信息吧,对吧,而且每个服务可能会存 ...