Springboot如何使用mybatis实现拦截SQL分页
作者:理舞 时间:2021-08-15 13:16:56
新建一个类MyPageInterceptor.java(注意在springboot中要添加注解@Component)
package com.grand.p1upgrade.mapper.test;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
@Component
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
public class MyPageInterceptor implements Interceptor {
private int page;
private int size;
@SuppressWarnings("unused")
private String dbType;
@SuppressWarnings("unchecked")
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("plugin is running...");
StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
while(metaObject.hasGetter("h")){
Object object = metaObject.getValue("h");
metaObject = SystemMetaObject.forObject(object);
}
while(metaObject.hasGetter("target")){
Object object = metaObject.getValue("target");
metaObject = SystemMetaObject.forObject(object);
}
MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
String mapId = mappedStatement.getId();
if(mapId.matches(".+ByPager$")){
ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
Map<String, Object> params = (Map<String, Object>)parameterHandler.getParameterObject();
page = (int)params.get("page");
size = (int)params.get("size");
String sql = (String) metaObject.getValue("delegate.boundSql.sql");
sql += " limit "+(page-1)*size +","+size;
metaObject.setValue("delegate.boundSql.sql", sql);
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
String limit = properties.getProperty("limit","10");
this.page = Integer.parseInt(limit);
this.dbType = properties.getProperty("dbType", "mysql");
}
}
添加测试TestMapper.java
package com.grand.p1upgrade.mapper.test;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TestMapper {
public List<Map<String,Object>> findByPager(Map<String, Object> params);
public long count();
}
TestMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.grand.p1upgrade.mapper.test.TestMapper">
<select id="findByPager" resultType="java.util.HashMap">
select * from p1project.sys_user
</select>
<select id="count" resultType="long">
select count(1) from p1project.sys_user
</select>
</mapper>
在调用TestMapper.findByPager传递参数的时候将page和size传入即可
来源:https://www.cnblogs.com/TheoryDance/p/12363935.html
标签:Spring,boot,mybatis,SQL,分页
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Flutter图片与文件选择器使用实例
2023-07-17 09:11:12
![](https://img.aspxhome.com/file/2023/0/106030_0s.png)
浅谈Java中向上造型向下造型和接口回调中的问题
2023-11-09 13:51:46
![](https://img.aspxhome.com/file/2023/1/59151_0s.jpg)
java设计模式学习之工厂方法模式
2023-10-12 17:19:04
![](https://img.aspxhome.com/file/2023/7/58607_0s.jpg)
Spring Security之默认的过滤器链及自定义Filter操作
2023-11-24 02:48:35
![](https://img.aspxhome.com/file/2023/3/59733_0s.png)
java图形用户界面实现菜单功能
2023-11-23 11:50:58
![](https://img.aspxhome.com/file/2023/2/59032_0s.jpg)
java 实现MD5加密算法的简单实例
2023-07-19 21:53:56
JavaWeb项目部署到服务器详细步骤详解
2023-11-29 11:15:20
![](https://img.aspxhome.com/file/2023/4/58764_0s.png)
详解Android自定义控件属性TypedArray以及attrs
2023-06-20 05:13:41
![](https://img.aspxhome.com/file/2023/9/62179_0s.jpg)
Spring Boot 整合 Apache Dubbo的示例代码
2021-10-09 03:52:07
![](https://img.aspxhome.com/file/2023/8/60488_0s.jpg)
详解如何在Java中实现堆排序算法
2023-11-11 11:34:46
javaWeb使用servlet搭建服务器入门
2023-11-21 04:47:45
ConcurrentHashMap是如何实现线程安全的你知道吗
2023-11-28 23:14:25
![](https://img.aspxhome.com/file/2023/5/60195_0s.jpg)
深入探讨Linux静态库与动态库的详解(一看就懂)
2023-07-04 01:02:28
详解备忘录模式及其在Java设计模式编程中的实现
2023-08-24 22:34:02
![](https://img.aspxhome.com/file/2023/6/58436_0s.jpg)
Java编程实现非对称加密的方法详解
2023-08-24 01:21:26
Java中的接口回调实例
2023-11-29 08:05:43
SpringBoot异步调用方法并接收返回值
2023-08-16 22:33:49
![](https://img.aspxhome.com/file/2023/5/58055_0s.jpg)
java 中HttpClient传输xml字符串实例详解
2023-11-24 13:40:54
Spring AOP如何整合redis(注解方式)实现缓存统一管理详解
2023-11-19 06:09:27
springboot ErrorPageFilter的实际应用详解
2023-11-24 01:02:59