整点活,MyBatis-Plus学习笔记(动态表名SQL解析器)

前言

偶摩西罗伊
这个是自己学习时候记得笔记要是想详细了解可以去MP官网,上边有更详细的配置流程以及视频教学:MyBatis-Plus

概念及使用场景

有些数据表的数据量比较大,可以进行份表存储,分出来的表有不同的数据以及相同的字段,而这些表表名基本类似,只是后缀不同。
数据分表后,对数据进行查询或者操作时,不可以只针对固定的表名,需要动态的拼接要操作的表名,此时使用动态表名SQL解析器

实现

也要写在分页插件中,与多租户SQL解析类似

  1. 创建保存动态表名的数据结构(这里用的public static ThreadLocal< String >)
 // 保存新表名
    public static ThreadLocal<String> myTableName = new ThreadLocal<>();
  1. 在分页插件中配置动态表明SQL解析器
 @Bean
    public PaginationInterceptor paginationInterceptor() {
        // 1. 分页插件
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 2. 设置解析器保存集合
        ArrayList<ISqlParser> sqlParserList = new ArrayList<ISqlParser>();
        // 设置动态表明 SQL 解析器
        // 2.1 创建动态表名SQL解析器对象
        DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
        // 2.2 创建替换map
        // key String:要替换的表明
        // value ITableNameHandler: 动态表名处理器,处理逻辑要写在这里
        Map<String, ITableNameHandler> tableNameHandlerMap = new HashMap<>();
        // 2.3 设置替换map中的值
        tableNameHandlerMap.put("tbl_type", new ITableNameHandler() {
            @Override
            public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
                System.out.println(sql+"   \n"+tableName);
                return myTableName.get();    // 返回值为 替换后的表名
            }
        });
        // 2.4设置到dynamicTableNameParser中
        dynamicTableNameParser.setTableNameHandlerMap(tableNameHandlerMap);
        // 2.5 设置到sqlPareserList中
        sqlParserList.add(dynamicTableNameParser);
        // 6. 将list放到分页器中
        paginationInterceptor.setSqlParserList(sqlParserList);
        return paginationInterceptor;
    }
  1. 在执行SQL操作时,向存储表明的数据结构中放数据
    以单查id方法为例子
    public Type selectById(int id) {
        if (id<7) {
            MyBatisPlusConfig.myTableName.set("tbl_type1");
        }else{
            MyBatisPlusConfig.myTableName.set("tbl_type2");
        }
        return this.typeMapper.selectById(id);
    }
  1. 执行命令
    第一条:原SQL语句
    第二条:原查询表明
    第三条之后:实际执行查询
    很明显由tbl_type改成了tbl_type2

注意事项

  1. 配置ITableNameHandler时,如果返回值为空,那么则查询原表
tableNameHandlerMap.put("tbl_type", new ITableNameHandler() {
            @Override
            public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
                System.out.println(sql+"   \n"+tableName);
                return myTableName.get();    // 返回值为 替换后的表名
            }
        });
  1. 之前配置的SQL过滤器也会对表名SQL解析器进行过滤
  2. @SqlParser(filter = true)配置的自定义Mapper方法对动态表名SQL解析器同样过滤

你可能感兴趣的:(整点活,MyBatis-Plus学习笔记(动态表名SQL解析器))