思路
实现
1.自定义插件MySqlPulgin类
@Intercepts({
@Signature(
type = StatementHandler.class,
method = "query",
args = {Statement.class, ResultHandler.class}
)
})
public class MySqlPlugin implements Interceptor{
@Override
public Object intercept(Invocation invocation) throws Throwable {
//每次调用原方法之前,就会执行这里
System.out.println("方法进行了增强");
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
//把这个拦截器封装成代理对象,并加入拦截器队列
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
//获取插件的配置信息
System.out.println(properties);
}
}
<plugins>
<plugin interceptor="com.study.mybatis_test.plugins.MySqlPlugin">
<!--配置参数-->
<property name="name" value="Bob"/>
</plugin>
</plugins>
如果是springboot项目,往配置类中添加bean
@Bean
public MySqlPlugin mySqlPlugin(){
MySqlPlugin mySqlPlugin = new MySqlPlugin();
Properties properties = new Properties();
properties.setProperty("name","tom");
mySqlPlugin.setProperties(properties);
return mySqlPlugin;
}
至此Mybatis的自定插件配置完毕
springboot项目:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
<exclusions>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
spring项目:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>
springboot项目:
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
//方言:mysql
properties.setProperty("dialect","mysql");
pageHelper.setProperties(properties);
return pageHelper;
}
spring项目:
<!--注意:分页助手的插件 配置在通用馆mapper之前*-->*
<plugin interceptor="com.github.pagehelper.PageHelper">
<!—指定方言 —>
<property name="dialect" value="mysql"/>
</plugin>
测试代码:
@Resource
private UserMapper userMapper;
@Test
void test1(){
PageHelper.startPage(1,1);
List<User> all = userMapper.findAll();
all.forEach(System.out::println);
PageInfo<User> pageInfo = new PageInfo<>(all);
System.out.println("总页数:"+pageInfo.getTotal());
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页条数:"+pageInfo.getPageSize());
}
运行结果:
2021-06-03 22:45:13.430 [main] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [HikariProxyConnection@1572582034 wrapping com.mysql.cj.jdbc.ConnectionImpl@267f9765] will not be managed by Spring
2021-06-03 22:45:13.437 [main] DEBUG c.s.mybatis_test.mapper.UserMapper.findAll_COUNT - ==> Preparing: SELECT count(0) FROM user
2021-06-03 22:45:13.626 [main] DEBUG c.s.mybatis_test.mapper.UserMapper.findAll_COUNT - ==> Parameters:
2021-06-03 22:45:13.777 [main] DEBUG c.s.mybatis_test.mapper.UserMapper.findAll_COUNT - <== Total: 1
2021-06-03 22:45:13.783 [main] DEBUG com.study.mybatis_test.mapper.UserMapper.findAll - ==> Preparing: select * from user LIMIT ?
2021-06-03 22:45:13.784 [main] DEBUG com.study.mybatis_test.mapper.UserMapper.findAll - ==> Parameters: 1(Integer)
2021-06-03 22:45:13.790 [main] DEBUG com.study.mybatis_test.mapper.UserMapper.findAll - <== Total: 1
2021-06-03 22:45:13.791 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6ddee60f]
User(id=1, name=zhangsan)
总页数:3
当前页:1
每页条数:1
package com.migu.tsg.channel.service;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.util.Properties;
/**
* @description:
* @author: gongjunjie
* @date: 2022年12月05日
*/
@Intercepts({//注意看这个大花括号,也就这说这里可以定义多个@Signature对多个地方拦截,都用这个拦截器
@Signature(
type = Executor.class, //这是指拦截哪个接口
method = "query",//这个接口内的哪个方法名,不要拼错了
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}// 这是拦截的方法的入参,按顺序写到这,不要多也不要少,如果方法重载,可是要通过方法名和入参来确定唯一的
),
@Signature(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}
)
})
@Component
public class SqlPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取得到封装的映射语句对象
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 获取得到参数
Object parameterObject = invocation.getArgs()[1];
// if (SqlCommandType.SELECT != mappedStatement.getSqlCommandType()) {
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
String sql = boundSql.getSql();
System.out.println("自定义sql拦截器拦截的sqlCommandType=" + sqlCommandType + ",sql:" + sql);
// }
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Interceptor.super.plugin(target);
}
@Override
public void setProperties(Properties properties) {
Interceptor.super.setProperties(properties);
}
}