定义数据库CRUD后的处理接口
有时候我们在数据库的CRUD操作后,需要做一些缓存的清理或缓存的重置;比如select操作后添加到缓存,update、insert、delete操作后需要清理缓存。我们定义一个接口AfterCrud用于实现CRUD后的操作。
实现mybatis拦截器Interceptor
基于mybatis拦截器Interceptor可以做很多有趣的事情,著名的开源项目PageHelper就是基于mybatis拦截器Interceptor和ThreadLocal实现的。我们这里实现的拦截器主要有两个功能,一个是打印运行时的sql便于监控耗时信息,另一个是拦截数据库写操作后做一些缓存清理的工作。
SqlInterceptor实现了Interceptor接口,构造方法可以根据传入的参数决定是否开启打印日志功能,是否支持CRUD后的一些额外的操作比如清理缓存等。
实现AfterCrud接口,做缓存清理操作
AfterCrudImpl实现AfterCrud接口负责处理一些缓存清理的操作:
上面的代码CacheManagerFactory的核心代码片段:
mybatis拦截器Interceptor其实是责任链模式,由于项目使用过程中使用了PageHelper,导致向SqlSessionFactory中加入拦截器时不生效,解决办法是在springboot的启动类上排除掉PageHelperAutoConfiguration:
同时自定义一个InterceptorConfig并把PageHelperAutoConfiguration中的代码拷贝出来改造如下:
我们的拦截器要加到PageInterceptor的后面,否则不生效,具体原因请参考PageHelper的PageInterceptor的实现。