如何使用MyBatis的插件

39 阅读1分钟

背景

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执行前后都能加上代码片段

image.png

image.png