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,分页
0
投稿
猜你喜欢
使用java的HttpClient实现多线程并发
2022-09-19 20:35:55
Unity实现俄罗斯方块(一)
2021-06-07 15:30:24
JavaFX实现UI美观效果代码实例
2021-08-27 21:02:15
kotlin java 混合代码 maven 打包实现
2023-04-09 13:33:41
Android实现SQLite添加、更新及删除行的方法
2022-03-29 05:23:45
Android 使用Picasso加载网络图片等比例缩放的实现方法
2023-08-29 15:36:32
spring-boot-maven-plugin引入出现爆红(已解决)
2021-06-06 12:05:35
Java中避免过多if-else的几种方法
2023-11-28 13:07:09
springboot中的静态资源加载顺序优先级
2023-08-24 11:12:31
C#中Razor模板引擎简单使用
2022-01-21 10:04:13
如何利用Jenkins + TFS为.Net Core实现持续集成/部署详解
2022-11-12 06:14:32
java数据结构之java实现栈
2023-11-25 05:32:36
Android获取ROOT权限的实例代码
2022-09-10 01:24:05
基于C#对用户密码使用MD5加密与解密
2022-11-24 23:05:23
C#下载歌词文件的同步和异步方法
2023-04-11 22:46:49
创建execl导入工具类的步骤
2022-03-11 11:41:09
Java快速排序QuickSort(实例)
2021-12-22 21:47:42
C#中重载相等(==)运算符示例
2023-01-11 15:10:36
java设计模式之适配器模式
2021-08-28 09:08:09
DevExpress中GridControl列转义的实现方法
2022-11-10 05:14:31