mybatis 自定义插件 获取元数据 spring boot + mybatis plus(prepareStatement.getMetaData())

@org.springframework.context.annotation.Configuration
@MapperScan(basePackages = {"xxx.xxx.xxx"})
public class MybatisPlusConfig {

@Bean
public ConfigurationCustomizer configurationCustomizer() {
ConfigurationCustomizer time = new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
MyMetaDataInterceptor myPlugin = new MyMetaDataInterceptor();
Properties properties = new Properties();
//这里设置慢查询阈值为1毫秒,便于测试
properties.setProperty("xxxtest", "xxx");
myPlugin.setProperties(properties);
configuration.addInterceptor(myPlugin);
}
};
return time;
}

}




@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class MyMetaDataInterceptor implements Interceptor {
private static Logger log = LoggerFactory.getLogger(MyMetaDataInterceptor.class);
private String xxxtest;
//方法拦截
@Override
public Object intercept(Invocation invocation) throws Throwable {
log.info("测试配置文件的值:"+xxxtest);
//通过StatementHandler获取执行的sql
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
Connection con = (Connection) invocation.getArgs()[0];
MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
//String value= (String) metaObject.getValue("delegate.mappedStatement.id");
//log.info("方法名为:"+value);
BoundSql boundSql = statementHandler.getBoundSql();
String sql = boundSql.getSql();
PreparedStatement prepareStatement = con.prepareStatement(sql);
//ParameterHandler paraHander = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");
//paraHander.setParameters(prepareStatement);
ResultSetMetaData rsmd = prepareStatement.getMetaData();
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String cloName=rsmd.getColumnLabel(i + 1);
log.info(cloName);
}
Object proceed = invocation.proceed();
return proceed;
}

//获取到拦截的对象,底层也是通过代理实现的,实际上是拿到一个目标代理对象
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}

@Override
public void setProperties(Properties properties) {
this.xxxtest = properties.getProperty("xxxtest");
}

}



猜你喜欢

转载自www.cnblogs.com/jingzhi-sksk/p/13393047.html