【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 ...
随机推荐
- 解决图片把父元素向下撑大大约3px问题
现象 bug: 图片在div\li\dt 等 图片把父元素向下撑大大约3px <style> img { width: 30%; //这里由于 ...
- 如何使用jQuery $.post() 方法实现前后台数据传递
基础方法为 $.post(URL,data,callback); 参数介绍: 1.URL 参数规定您希望请求的 URL. 2.data 参数规定连同请求发送的数据. 3.callback 参数是请求成 ...
- jQuery学习笔记(1) 初识jQuery
目录 目录 引用 注意 HelloWorldHelloWorld! jQueryjQuery对象和DOMDOM对象的相互转换 冲突的解决 引用 本地文件引用: <script src=" ...
- MyBatis的XML配置文件
属性(properties) 通过properties的子元素设置配置项: <properties> <property name="driver" value= ...
- JSP配置虚拟路径及虚拟主机
1.tomact解压后目录 bin:可执行文件(startup.bat shutdown.bat) conf:配置文件(server.xml) lib:tomcat以来的jar文件 log:日志文 ...
- JAVA使用SizeOf
研究一下JAVA的SizeOf 引用外部类实现JAVA的SizeOf JAVA本身是没有SizeOf的,因此我们需要去MavenRepository中下载JAR包(也可以使用maven等),因为这里只 ...
- 简易计算器实现:while循环+switch语句
个人练习: 写一个计算器,要求实现加减乘除功能,并且能循环接收新的数据,通过用户交互实现(即Scanner对象) 用到了 while循环 switch语句,实现了数据的循环输入并计算!!!!妙啊!!! ...
- 解决send-mail: fatal: parameter inet_interfaces: no local interface found for ::1
1:检查sendmail服务的状态 service sendmail status 2:开启sendmail服务 service sendmail start3:关闭sendmail服务 servic ...
- 如何建立一个足够安全的SSH连接?
1 概述 使用SSH连接服务器是一件很平常的事,但是,连接是否足够安全是一个令人担忧的问题.本文从如下几个方面介绍了如何建立一个足够安全的SSH连接: 端口 协议 用户 密码 密钥对 ssh-agen ...
- js格式化时间(指定模板格式)
1 /** 格式化时间 2 * @param {string} date 需要格式化的时间 3 * @param {string} fmt 想要格式化的格式 4 */ 5 function forma ...