MyBatis Excutor 拦截器的巧妙用法
来源:互联网 发布:手机拍电影特效软件 编辑:程序博客网 时间:2024/05/19 11:48
这里要讲的巧妙用法是用来实现在拦截器中执行额外 MyBatis 现有方法的用法。
并且会提供一个解决拦截Executor
时想要修改MappedStatement
时解决并发的问题。
这里假设一个场景:
实现一个拦截器,记录 MyBatis 所有的 insert,update,delete 操作,将记录的信息存入数据库。
这个用法在这里就是将记录的信息存入数据库。
实现过程的关键步骤和代码:
1.首先在某个 Mapper.xml 中定义好了一个往日志表中插入记录的方法,假设方法为id="insertSqlLog"
。
2.日志表相关的实体类为SqlLog
.
3.拦截器签名:
@Intercepts({@org.apache.ibatis.plugin.Signature( type=Executor.class, method="update", args={MappedStatement.class, Object.class})})public class SqlInterceptor implements Interceptor
4.接口方法简单实现:
public Object intercept(Invocation invocation) throws Throwable { Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; Object parameter = args[1]; SqlLog log = new SqlLog(); Configuration configuration = ms.getConfiguration(); Object target = invocation.getTarget(); StatementHandler handler = configuration.newStatementHandler((Executor) target, ms, parameter, RowBounds.DEFAULT, null, null); BoundSql boundSql = handler.getBoundSql(); //记录SQL log.setSqlclause(boundSql.getSql()); //执行真正的方法 Object result = invocation.proceed(); //记录影响行数 log.setResult(Integer.valueOf(Integer.parseInt(result.toString()))); //记录时间 log.setWhencreated(new Date()); //TODO 还可以记录参数,或者单表id操作时,记录数据操作前的状态 //获取insertSqlLog方法 ms = ms.getConfiguration().getMappedStatement("insertSqlLog"); //替换当前的参数为新的ms args[0] = ms; //insertSqlLog 方法的参数为 log args[1] = log; //执行insertSqlLog方法 invocation.proceed(); //返回真正方法执行的结果 return result;}
重点
MappedStatement
是一个共享的缓存对象,这个对象是存在并发问题的,所以几乎任何情况下都不能去修改这个对象(通用Mapper除外),想要对MappedStatement
做修改该怎么办呢?并不难,
Executor
中的拦截器方法参数中都有MappedStatement ms
,这个ms
就是后续方法执行要真正用到的MappedStatement
,这样一来,问题就容易解决了,根据自己的需要,深层复制MappedStatement
对象中自己需要修改的属性,然后修改这部分属性,之后将修改后的ms
通过上面代码中args[0]=ms
这种方式替换原有的参数,这样就能实现对ms
的修改而且不会有并发问题了。这里日志的例子就是一个更简单的应用,并没有创建
ms
,只是获取了一个新的ms
替换现有的ms
,然后去执行。
1 0
- MyBatis Excutor 拦截器的巧妙用法
- Excutor的使用
- Excutor
- 标签的巧妙用法
- system 的巧妙用法
- DISTINCT的巧妙用法
- mybatis 拦截器的理解
- Try / Catch的巧妙用法
- dual的一些巧妙用法
- Android BigDecime的巧妙用法
- Raphael.animation()的巧妙用法
- struts2 拦截器的用法
- ModelDriven拦截器的用法
- mybatis拦截器的注解说明
- mybatis拦截器的执行顺序
- mybatis实现拦截器的方法
- springmvc+mybatis中拦截器的使用
- mybatis拦截器的执行顺序
- HDU-5918 Sequence I(暴力)(KMP)
- 开发常用单词
- 创建新项目的目录(MVP)
- html布局中form表单的简单用法和常用属性设置
- AIDL
- MyBatis Excutor 拦截器的巧妙用法
- hdoj-5446-Unknown Treasure
- Kafka 单机安装、测试和监控
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料汇总
- 数据结构实验之栈四:括号匹配
- Binder机制
- Spring的体系结构
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- Java:常用集合类(List、Map、Set、Queue、Stack)