開發過程當中常常回須要對要執行的sql加以自定義處理,好比分頁,計數等。經過 MyBatis 提供的強大機制,使用插件是很是簡單的,只需實現 Interceptor 接口,並指定想要攔截的方法簽名便可。java
@Intercepts({@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,ResultHandler.class})}) public class MyPageInterceptor implements Interceptor { private static final Logger logger= LoggerFactory.getLogger(MyPageInterceptor.class); @Override public Object intercept(Invocation invocation) throws Throwable { logger.warn(invocation.toString()); return invocation.proceed(); } @Override public Object plugin(Object o) { return Plugin.wrap(o,this); } @Override public void setProperties(Properties properties) { logger.warn(properties.toString()); } }
個人配置spring
mybatis: type-aliases-package: me.zingon.pagehelper.model mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true default-fetch-size: 100 default-statement-timeout: 30
在springboot中要給mybatis加上這個攔截器,有三種方法,前兩種方法在啓動項目時不會自動調用自定義攔截器的setProperties方法。sql
直接給自定義攔截器添加一個 @Component註解,當調用sql時結果以下,能夠看到攔截器生效了,可是啓動時候並無自動調用setProperties方法。
apache
在配置類裏添加攔截器,這種方法結果同上,也不會自動調用setProperties方法。springboot
@Configuration public class MybatisConfig { @Bean ConfigurationCustomizer mybatisConfigurationCustomizer() { return new ConfigurationCustomizer() { @Override public void customize(org.apache.ibatis.session.Configuration configuration) { configuration.addInterceptor(new MyPageInterceptor()); } }; } }
這種方法就是跟之前的配置方法相似,在yml配置文件中指定mybatis的xml配置文件,注意config-location屬性和configuration屬性不能同時指定session
mybatis: config-location: classpath:mybatis.xml type-aliases-package: me.zingon.pagehelper.model mapper-locations: classpath:mapper/*.xml
mybatis.xmlmybatis
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="me.zingon.pacargle.model"/> </typeAliases> <plugins> <plugin interceptor="me.zingon.pagehelper.interceptor.MyPageInterceptor"> <property name="dialect" value="oracle"/> </plugin> </plugins> </configuration>
能夠看到,在啓動項目的時候setProperties被自動調用了
oracle
前兩種方法能夠在初始化自定義攔截器的時候經過 @Value 註解直接初始化須要的參數。app