天天看點

看完這篇文章還不會建立Mybatis插件嗎?

作者:小馬的生活筆記

MyBatis 是一個優秀的持久層架構,它提供了許多友善的功能來幫助開發人員操作資料庫。其中之一就是 MyBatis 插件(Plugin),它提供了一種機制來修改 MyBatis 在執行 SQL 語句時的行為,進而讓開發人員可以在不修改 MyBatis 源碼的情況下擴充它的功能。本篇部落格将詳細介紹如何建立一個 MyBatis 插件,并在項目中使用。

建立插件

插件主要包括三個部分:

攔截器(Interceptor):實作攔截器接口,重寫 intercept() 方法,在執行 SQL 語句時修改其行為。

注解(Annotation):标記要攔截的方法或類,用來告訴攔截器要攔截哪些方法或類。

配置(Configuration):配置插件,包括指定要攔截的方法或類、指定攔截器等。

下面是一個簡單的插件示例,它實作了一個攔截器,用于在執行查詢語句時列印 SQL 語句和執行時間:

@Intercepts({
@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})
})
public class MyPlugin implements Interceptor {
  private static final Logger LOGGER = LoggerFactory.getLogger(MyPlugin.class);
 
	@Override
  public Object intercept(Invocation invocation) throws Throwable {
    long start = System.currentTimeMillis();
    Object result = invocation.proceed();
    long end = System.currentTimeMillis();
    long time = end - start;
    StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
    BoundSql boundSql = statementHandler.getBoundSql();
    String sql = boundSql.getSql();
    LOGGER.info("Execute SQL [{}], time: {}ms", sql, time);
    return result;
  }

  @Override
  public Object plugin(Object target) {
  	return Plugin.wrap(target, this);
  }

  @Override
  public void setProperties(Properties properties) {
  	// do nothing
  }
}           

這個插件實作了 Interceptor 接口,并重寫了 intercept() 方法,在查詢語句執行前後列印 SQL 語句和執行時間。它還使用 @Intercepts 注解标記了要攔截的方法,指定了攔截器的類型和方法簽名。

注冊插件

建立完插件後,我們需要将其注冊到 MyBatis 中,以便在執行 SQL 語句時調用。有兩種方法可以注冊插件:

通過配置檔案

在 MyBatis 配置檔案中,可以通過 <plugins> 元素來注冊插件。例如:

<configuration>
  <plugins>
  	<plugin interceptor="com.example.MyPlugin"/>
  </plugins>
</configuration>           

這種方式比較簡單,但需要手動添加配置檔案,不太友善。

通過代碼

在 Spring Boot 中,可以通過 @Configuration 注解和 @Bean 注解來完成注冊。

首先,我們需要建立一個配置類,用于注冊插件:

@Configuration
public class MybatisPluginConfig {
  
  @Bean
  public MyPlugin myPlugin() {
  	return new MyPlugin();
  }
  
  @Bean
  public ConfigurationCustomizer mybatisConfigurationCustomizer() {
  	return configuration -> configuration.addInterceptor(myPlugin());
  }
}           

這個配置類使用 @Bean 注解建立了一個 MyPlugin 對象,并使用 @Bean 注解建立了一個 ConfigurationCustomizer 對象。ConfigurationCustomizer 是 MyBatis 提供的一個接口,用于自定義 MyBatis 的配置資訊。在這裡,我們使用 configuration.addInterceptor() 方法将 MyPlugin 對象添加到 MyBatis 的配置資訊中。

使用插件

完成插件的注冊後,我們就可以在 MyBatis 中使用它了。在 Spring Boot 中,我們隻需要在 application.properties 或 application.yml 檔案中添加如下配置即可:

mybatis.configuration.customizers=com.example.MybatisPluginConfig           

這個配置項指定了要使用的 MybatisPluginConfig 類,Spring Boot 會自動将其加入到 MyBatis 的配置中。現在,我們可以在 MyBatis 中執行查詢語句,檢視日志輸出是否包含了 SQL 語句和執行時間。

public interface UserMapper {
  @Select("SELECT * FROM user WHERE id = #{id}")
  User findById(Long id);
}

@Autowired
private UserMapper userMapper;

@Test
public void testFindById() {
  User user = userMapper.findById(1L);
  assertNotNull(user);
}           

在執行 findById() 方法時,我們可以在日志中看到類似下面的輸出:

Execute SQL [SELECT * FROM user WHERE id = ?], time: 2ms           

這說明我們的插件已經成功地攔截了查詢語句,并列印了 SQL 語句和執行時間。

總結

本篇部落格詳細介紹了如何建立一個 MyBatis 插件,并在項目中使用。我們首先建立了一個攔截器,然後将其注冊到 MyBatis 中。最後,在項目中使用插件,成功地攔截了查詢語句并列印了 SQL 語句和執行時間。