【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 ...
随机推荐
- golang实现已知三角形三点坐标,求三角形面积
代码如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) float64 { //根 ...
- python写一个学生信息管理系统
#coding:utf-8 2 info = []#全局变量 3 def info_print(): 4 print("请选择功能:") 5 print("1:添加学员& ...
- DEV表格设置列不可编辑
现在是可编辑的 Run Designer--Columns--Column options下的AllowEdit属性改为false即可
- 攻防世界 reverse EASYHOOK
EASYHOOK XCTF 4th-WHCTF-2017 1 data=[ 0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F, 2 ...
- Go语言GC实现原理及源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/475 本文使用的 Go 的源码1.15.7 介绍 三色标记法 三色标 ...
- 玩玩CSS,写一个图标堆叠效果
遇到有人问如下效果怎么写,一时兴起,自己写一个玩玩. 看到这个样子,首先应该考虑一下 DOM 结构,以我的观点,把DOM结构设计为如下形式: <div> <img src=" ...
- Android Studio 之 制作 Nine-Patch 图片(.9图片)
•引言 9.png 可以保证图片在合适的位置进行局部拉伸,避免了图片全局缩放造成的图片变形问题. 但是由于Android Studio对于.9图片的检查更加严格,所以不符合AS要求的.9图片会带来很多 ...
- PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642
PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642 题目描述: Given any string of N (≥5) ...
- Linux(六):系统运维常用命令
实际的生产环境下,不论是研发还是运维,或多或少的得面对在linux上定位问题这个关卡,这里介绍一下linux环境下一些状态查看常用的命令. 系统资源监控 总体资源占用情况查看 命令:top 像wind ...
- [Fundamental of Power Electronics]-PART I-3.稳态等效电路建模,损耗和效率-3.1 直流变压器模型
3.1 直流变压器模型 如图3.1所示,任何开关变换器都包含三个部分:功率输入,功率输出以及控制输入.输入功率按控制输入进行特定的功率变换输出到负载.理想情况下,这些功能将以100%的效率完成,因此 ...