• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MyBatis Excutor 拦截器的巧妙用法

java 搞代码 4年前 (2022-01-05) 21次浏览 已收录 0个评论

这里要讲的巧妙用法是用来实现在拦截器中执行额外 MyBatis 现有方法的用法,并提供了解决拦截Executor时想要修改MappedStatement时解决并发的问题。感兴趣的朋友一起看看吧

这里要讲的巧妙用法是用来实现在拦截器中执行额外 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是一个共享的缓存对象,这个对象是来源gaodai#ma#com搞@@代~&码网存在并发问题的,所以几乎任何情况下都不能去修改这个对象(通用Mapper除外),想要对MappedStatement做修改该怎么办呢?

并不难,Executor中的拦截器方法参数中都有MappedStatement ms,这个ms就是后续方法执行要真正用到的MappedStatement,这样一来,问题就容易解决了,根据自己的需要,深层复制MappedStatement对象中自己需要修改的属性,然后修改这部分属性,之后将修改后的ms通过上面代码中args[0]=ms这种方式替换原有的参数,这样就能实现对ms的修改而且不会有并发问题了。

这里日志的例子就是一个更简单的应用,并没有创建ms,只是获取了一个新的ms替换现有的ms,然后去执行。

总结

以上所述是小编给大家介绍的MyBatis Excutor 拦截器的巧妙用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对gaodaima搞代码网网站的支持!

以上就是MyBatis Excutor 拦截器的巧妙用法的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MyBatis Excutor 拦截器的巧妙用法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址