1. mybatis拦截器 2个重要的注解
@Intercepts 和 @Signature
@Signature 支持对Executor、StatementHandler、PameterHandler和ResultSetHandler进行拦截
2. 应用场景
在做国际化的时候用到了。将数据库中的数据查询出来,根据当前语言环境,将某些数据进行国际化。
3. 实现自定义的 mybatis 拦截器
1) implements org.apache.ibatis.plugin.Interceptor
2) 在intercept()方法中写自定义逻辑
4. 示例
@Intercepts({ @Signature(type = Executor.class, method = "update",
args = { MappedStatement.class, Object.class }) })
public class InterceptorTest implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
String sqlId = mappedStatement.getId();
String namespace = sqlId.substring(0, sqlId.indexOf('.'));
Executor exe = (Executor) invocation.getTarget();
String methodName = invocation.getMethod().getName();
if (methodName.equals("update")) {
Object parameter = invocation.getArgs()[1];
if(parameter instanceof User) {
((User)parameter).setLastUpdateDate(saveValueToDb(((User)parameter).getLastUpdateDate()));
}
}
return null;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
private Date saveValueToDb(Date value) {
return new Date();
}
}