- 实现接口 org.apache.ibatis.plugin.Interceptor
- 添加注解
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
- 重写两个普通方法
@Override
public Object plugin(Object target) {
if (target instanceof StatementHandler) {
return Plugin.wrap(target, this);
} else {
return target;
}
}
@Override
public void setProperties(Properties properties) {
}
- 重写重要方法
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 拦截对象
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, reflectorFactory);
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
// 类与方法
String id = mappedStatement.getId();
String className = id.substring(0, id.lastIndexOf('.'));
String methodName = id.substring(id.lastIndexOf('.') + 1);
BaseStatementHandler delegate = (BaseStatementHandler) metaObject.getValue("delegate");
BoundSql boundSql = delegate.getBoundSql();
Object parameterObject = boundSql.getParameterObject();
if (parameterObject instanceof MapperMethod.ParamMap) {
MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) parameterObject;
}
String sql = (String) metaObject.getValue("delegate.boundSql.sql");
metaObject.setValue("delegate.boundSql.sql", sql);
// 传递给下一个拦截器处理
return invocation.proceed();
}
- 获取spring容器对象
继承 ApplicationObjectSupport
ApplicationContext applicationContext = getApplicationContext();
applicationContext.getBean(***.class);