# 超輕量級 DynamicTableNameInnerInterceptor是mybatis-plug的一個攔截器插件,可以自己定義需要攔截的表單,然後對它進行加工,這時mybatis-plus就會把SQL代碼的表名加上你的這個裝飾。 # 封裝的思想 我們通常把mybatis做成一個包,公司其它同 ...
超輕量級
DynamicTableNameInnerInterceptor是mybatis-plug的一個攔截器插件,可以自己定義需要攔截的表單,然後對它進行加工,這時mybatis-plus就會把SQL代碼的表名加上你的這個裝飾。
封裝的思想
我們通常把mybatis做成一個包,公司其它同事直接使用咱們的包,包里會統一定義數據基類
、數據分頁
、數據脫敏
、審計欄位填充等特性,開發人員不需要關註這些內容,這些內容會被自己註冊;或者人開發人員可以直接繼承它們,直接使用即可。
- 插件註冊器
@Configuration
public class MybatisPlusConfig implements ApplicationContextAware {
ApplicationContext applicationContext;
/**
* 攔截器
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分頁插件, 對於單一資料庫類型來說,都建議配置該值,避免每次分頁都去抓取資料庫類型
interceptor.addInnerInterceptor(new LindPaginationInnerInterceptor());
// 防止全表更新與刪除
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
// 載入個性化的分表配置,它可能是用戶在當前項目定義的,然後我們統一對它們進行裝配
Optional.ofNullable(applicationContext.getBeanNamesForType(DynamicTableNameInnerInterceptor.class))
.ifPresent(o -> {
for (String beanName : o) {
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = applicationContext
.getBean(beanName, DynamicTableNameInnerInterceptor.class);
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
}
});
return interceptor;
}
.....
}
通過上面的代碼我們知道,在外部定義的DynamicTableNameInnerInterceptor對象,會被自動的註冊到mybatis-plus的組件中,開發人員在具體項目里不需要再次註冊。
- 開發人員在項目中定義一個t_log表,按時間進行分表
@Bean
public DynamicTableNameInnerInterceptor tableNamePlusInterceptor() {
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
HashMap<String, TableNameHandler> map = new HashMap<String, TableNameHandler>();
map.put("t_log", new DaysTableNameParser());
dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
return dynamicTableNameInnerInterceptor;
}
代碼的測試
@Test(expected = BadSqlGrammarException.class)
public void insertLog() {
TLog log = new TLog();
log.setMessage("測試");
logDao.insert(log);
}
生成的sql代碼如下
[main] DEBUG com.lind.mybatis.dao.LogDao.insert - ==> Preparing: INSERT INTO t_log_20230524 ( id, message, create_by, create_time, update_by, update_time, del_flag ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
需要註意的是,無論是sharding-jdbc還是mybatis-plus-DynamicTableNameInnerInterceptor組成的分表,咱們都需要提前把數據表建立出來,他們這些組件是不會自動建表的。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!