springboot~mybatis-plus的DynamicTableNameInnerInterceptor实现分表

打印 上一主题 下一主题

主题 938|帖子 938|积分 2814

超轻量级

DynamicTableNameInnerInterceptor是mybatis-plug的一个拦截器插件,可以自己定义需要拦截的表单,然后对它进行加工,这时mybatis-plus就会把SQL代码的表名加上你的这个装饰。
封装的思想

我们通常把mybatis做成一个包,公司其它同事直接使用咱们的包,包里会统一定义数据基类、数据分页、数据脱敏、审计字段填充等特性,开发人员不需要关注这些内容,这些内容会被自己注册;或者人开发人员可以直接继承它们,直接使用即可。

  • 插件注册器
  1. @Configuration
  2. public class MybatisPlusConfig implements ApplicationContextAware {
  3.         ApplicationContext applicationContext;
  4.         /**
  5.          * 拦截器
  6.          */
  7.         @Bean
  8.         public MybatisPlusInterceptor mybatisPlusInterceptor() {
  9.                 MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  10.                 // 分页插件, 对于单一数据库类型来说,都建议配置该值,避免每次分页都去抓取数据库类型
  11.                 interceptor.addInnerInterceptor(new LindPaginationInnerInterceptor());
  12.                 // 防止全表更新与删除
  13.                 interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
  14.                 // 加载个性化的分表配置,它可能是用户在当前项目定义的,然后我们统一对它们进行装配
  15.                 Optional.ofNullable(applicationContext.getBeanNamesForType(DynamicTableNameInnerInterceptor.class))
  16.                                 .ifPresent(o -> {
  17.                                         for (String beanName : o) {
  18.                                                 DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = applicationContext
  19.                                                                 .getBean(beanName, DynamicTableNameInnerInterceptor.class);
  20.                                                 interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
  21.                                         }
  22.                                 });
  23.                 return interceptor;
  24.         }
  25. .....
  26. }
复制代码
通过上面的代码我们知道,在外部定义的DynamicTableNameInnerInterceptor对象,会被自动的注册到mybatis-plus的组件中,开发人员在具体项目里不需要再次注册。

  • 开发人员在项目中定义一个t_log表,按时间进行分表
  1.         @Bean
  2.         public DynamicTableNameInnerInterceptor tableNamePlusInterceptor() {
  3.                 DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
  4.                 HashMap<String, TableNameHandler> map = new HashMap<String, TableNameHandler>();
  5.                 map.put("t_log", new DaysTableNameParser());
  6.                 dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
  7.                 return dynamicTableNameInnerInterceptor;
  8.         }
复制代码
代码的测试
  1.         @Test(expected = BadSqlGrammarException.class)
  2.         public void insertLog() {
  3.                 TLog log = new TLog();
  4.                 log.setMessage("测试");
  5.                 logDao.insert(log);
  6.         }
复制代码
生成的sql代码如下
  1. [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组成的分表,咱们都需要提前把数据表建立出来,他们这些组件是不会自动建表的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表