【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 基础 - 启动与退出及异常捕获
1. 若需要控制 exe 实例数量 bool ret; mutex = new System.Threading.Mutex(true, exename, out ret); if (!ret) { ...
- Aibabelx-shop 大型微服务架构系列实战之技术选型
一.本项目涉及编程语言java,scala,python,涉及的技术如下: 1.微服务架构: springboot springcloud mybatisplus shiro 2.全文检索技术 sol ...
- POJ3278_Catch That Cow(JAVA语言)
思路:bfs裸题.三个选择:向左一个单位,向右一个单位,向右到2*x //注意,需要特判n是否大于k,大于k时只能向左,输出n-k.第一次提交没注意,结果RE了,, Catch That Cow Ti ...
- Manjaro Linux平台用pyinstaller打包python可执行文件
技术背景 当我们创建一个python项目,最终的成果如果希望用户能够不依赖于python源代码也能够正常的执行,就会比较的人性化.因为源代码数量众多,很难让每个用户都自行管理所有的源代码,因此我们需要 ...
- 学习笔记-git 上传
0.git add * (如果你需要修改源码需要在 1 之前使用,然后再回到 1) 1.git commit -m '提交文字描述' 2.git push -u origin master (上传到主 ...
- [Fundamental of Power Electronics]-PART I-2.稳态变换器原理分析-2.2 伏秒平衡/安秒平衡 小纹波近似
2.2 电感伏秒平衡.电容充放电平衡以及小纹波近似 让我们更加仔细地观察图2.6中的buck变换器的电感和电容的波形.我们是不可能设计一个滤波器能够只允许直流分量通过而完全滤除开关频率次谐波的.所以, ...
- 使用 shell 做 tcp 协议模拟
问题背景 公司有一套消息推送系统(简称GCM),由于人事变动接手了其中的客户端部分.看了一下文档,仅通讯协议部分有几页简单的说明,代码呢又多又乱,一时理不出一个头绪.由于消息是从后台推送到端的,所以使 ...
- [面试仓库]CSS面试题汇总--布局篇
一,盒模型 说到 CSS 布局这块的内容,首当其冲的就是我们的盒模型宽度计算问题,在开始我们的问题之前,我们首先要搞懂这些概念: 盒模型里面的内容(content): 也就是实实在在要展现的内容, ...
- django-自定义用户登录(个人笔记)
django自定义用户登录(个人笔记) 函数说明 1. render()函数:对用户请求做出响应 2. path()函数:定义路由 3. create()函数:增加数据表记录 配置settings.p ...
- Centos6无法使用yum解决办法
12月后Centos 6 系统无法使用yum出现错误(文章底部看) 相信已经有一部分朋友今天连接到CentOS 6的服务器后执行yum后发现报错,那么发生了什么? CentOS 6已经随着2020年1 ...