mybatis拦截器修改执行SQL

mybatis拦截器修改执行SQL

  1. 准备好mybatis环境,并且能够正常运行(可参考https://blog.csdn.net/weixin_44833594/article/details/123833872文章)
  2. 重新写一个拦截器(注意:此处需要添加@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表为空");
		}

	}

总结:亲测可用,如果只需要类型可以修改代码的类型,或则写一个切面方法用于判断。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值