背景
MyBatis的插件可以实现在sql执行前后增加代码片段,自定义的实现功能(比如:日志、分页等)
代码举例
pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
mybatis-config.xml
<?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>
<properties resource="jdbc.properties" />
<plugins>
<plugin interceptor="org.example.plugin.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/timeMapper.xml" />
</mappers>
</configuration>
jdbc.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:32306/mybatis-study?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
username=root
password=xxx
ExamplePlugin.java
@Intercepts(
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
)
public class ExamplePlugin implements Interceptor {
private Properties properties = new Properties();
@Override
public Object intercept(Invocation invocation) throws Throwable {
// implement pre processing if need
System.out.println("implement pre processing if need");
Object returnObject = invocation.proceed();
// implement post processing if need
System.out.println("implement post processing if need");
return returnObject;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
this.properties = properties;
}
}
TimeMapper.java
public interface TimeMapper {
String getTime();
}
Main.java
public class Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try
{
TimeMapper mapper = (TimeMapper ) session.getMapper(TimeMapper.class);
System.out.println(mapper.getTime());
}
finally
{
session.close();
}
}
}
执行结果
由下图可见,在sql执行前后都能加上代码片段