mybatis拦截器修改执行SQL
- 准备好mybatis环境,并且能够正常运行(可参考https://blog.csdn.net/weixin_44833594/article/details/123833872文章)
- 重新写一个拦截器(注意:此处需要添加@Component注解,否则无效)
package com.answer.test.mybatisplus.util;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.Properties;
@Component
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class,Integer.class})})
public class MybatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
//MetaObject优雅访问对象的属性(这里访问statementHandler的属性)
//MetaObject优雅访问对象的属性,通过它可以简化代码
MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
//id为方法的全路径
String id = mappedStatement.getId();
System.out.println("id为方法的全路径:" + id);
//sql语句类型
String sqlCommandType = mappedStatement.getSqlCommandType().toString();
System.out.println("sql语句类型:" + sqlCommandType);
BoundSql boundSql = statementHandler.getBoundSql();
//获取原始sql
String sql = boundSql.getSql();
String mSql = sql.replace(",last_login_time"," ");
System.out.println("原sql为:" + sql);
System.out.println("新绑定的sql为:" + mSql);
Field field = boundSql.getClass().getDeclaredField("sql");
field.setAccessible(true);
field.set(boundSql,mSql);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
System.out.println(properties.getProperty("name"));
}
}
3.代码测试
@Test
public void testSelect() {
System.out.println("开始查询user表");
List<User> users = userMapper.selectList(null);
if (users.size() != 0 && users != null) {
for (User user : users) {
System.out.println("查询出来的user的记录为:" + user);
}
} else {
System.out.println("开始查询user表为空");
}
}
总结:亲测可用,如果只需要类型可以修改代码的类型,或则写一个切面方法用于判断。