zoukankan      html  css  js  c++  java
  • 【Mybatis-Plus进阶学习(七)】动态表名SQL解析器

    因为表的数据太大了,有的项目会进行分表存储。例如日志表,一般都是按时间区分,表名xxx_年_月;还有的业务表针对不同机构,一个机构一个表 ,表命_xxxid。这些表的字段都是一样的,不同的是内容和表名。当我们需要操作表的时候,可能需要根据业务和需求的不同,操作不同的表,这时候我们就需要动态的进行表名的拼接。虽然市面上也有一些分库分表的插件,但是视频的作者并不推荐。

    动态表名的简单使用

    动态表名也是要写在分页插件中的,和多租户插件相同。DynamicTableNameParser 必须在MP 3.1.2版本后才能用,3.1.2之前的动态表名操作不一样。

    第一步:配置动态表名SQL解析器

    public static ThreadLocal<String> myTalbeName = new ThreadLocal<>();
    
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
            ArrayList<ISqlParser> sqlParsers = new ArrayList<>();
    
            DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
            Map<String, ITableNameHandler> tableNameHandlerMap = new HashMap<>();
            tableNameHandlerMap.put("user", new ITableNameHandler() {
                @Override
                public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
                    //返回替换后的表名
                    return myTalbeName.get();
                }
            });
            dynamicTableNameParser.setTableNameHandlerMap(tableNameHandlerMap);
            sqlParsers.add(dynamicTableNameParser);
    
            paginationInterceptor.setSqlParserList(sqlParsers);
            //过滤方法
            paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
                @Override
                public boolean doFilter(MetaObject metaObject) {
                    MappedStatement mappedStatement = SqlParserHelper.getMappedStatement(metaObject);
                    if ("com.fang.dao.UserMapper.selectById".equals(mappedStatement.getId())) {
                        return true;
                    }
                    return false;
                }
            });
            return paginationInterceptor;
        }
    

    第二步:测试

        @Test
        public void query() {
            MybatisConfig.myTalbeName.set("user_2019");
            List<User> list = userMapper.selectList(null);
        }
    

    运行测试,会发现报错,因为没有user_2019这张表。

    注意事项

    1. 如果没有给MybatisConfig.myTalbeName赋值,dynamicTableName返回值为空,不会进行表名的替换。
    2. SqlParserFilter对动态表名SQL解析器同样有效。
    3. @SqlParser(filter = true)对动态表名SQL解析器同样有效。
  • 相关阅读:
    设计模式之适配器模式(Decorator)
    可复用面向对象软件的基础
    dpkg命令的用法
    UML类图几种关系的总结
    Java多线程并发编程之原子变量与非阻塞同步机制
    Java内部类总结
    多线程并发编程之构建自定义同步工具
    多线程并发编程之显示锁ReentrantLock和读写锁
    多线程并发编程之变量
    汇编语言学习系列 冒泡排序实现
  • 原文地址:https://www.cnblogs.com/zllk/p/14239926.html
Copyright © 2011-2022 走看看