【資料圖】
超輕量級(jí)
DynamicTableNameInnerInterceptor是mybatis-plug的一個(gè)攔截器插件,可以自己定義需要攔截的表單,然后對(duì)它進(jìn)行加工,這時(shí)mybatis-plus就會(huì)把SQL代碼的表名加上你的這個(gè)裝飾。
封裝的思想
我們通常把mybatis做成一個(gè)包,公司其它同事直接使用咱們的包,包里會(huì)統(tǒng)一定義數(shù)據(jù)基類
、數(shù)據(jù)分頁
、數(shù)據(jù)脫敏
、審計(jì)字段填充等特性,開發(fā)人員不需要關(guān)注這些內(nèi)容,這些內(nèi)容會(huì)被自己注冊(cè);或者人開發(fā)人員可以直接繼承它們,直接使用即可。
- 插件注冊(cè)器
@Configurationpublic class MybatisPlusConfig implements ApplicationContextAware {ApplicationContext applicationContext;/** * 攔截器 */@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分頁插件, 對(duì)于單一數(shù)據(jù)庫(kù)類型來說,都建議配置該值,避免每次分頁都去抓取數(shù)據(jù)庫(kù)類型interceptor.addInnerInterceptor(new LindPaginationInnerInterceptor());// 防止全表更新與刪除interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());// 加載個(gè)性化的分表配置,它可能是用戶在當(dāng)前項(xiàng)目定義的,然后我們統(tǒng)一對(duì)它們進(jìn)行裝配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對(duì)象,會(huì)被自動(dòng)的注冊(cè)到mybatis-plus的組件中,開發(fā)人員在具體項(xiàng)目里不需要再次注冊(cè)。
- 開發(fā)人員在項(xiàng)目中定義一個(gè)t_log表,按時(shí)間進(jìn)行分表
@Beanpublic DynamicTableNameInnerInterceptor tableNamePlusInterceptor() {DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();HashMap map = new HashMap();map.put("t_log", new DaysTableNameParser());dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);return dynamicTableNameInnerInterceptor;}
代碼的測(cè)試
@Test(expected = BadSqlGrammarException.class)public void insertLog() {TLog log = new TLog();log.setMessage("測(cè)試");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組成的分表,咱們都需要提前把數(shù)據(jù)表建立出來,他們這些組件是不會(huì)自動(dòng)建表的。