MybatisPlus动态表名

news2024/11/27 8:44:04

核心代码



  • mybatisplus的配置
@Configuration
public class MybatisPlusConfig {
    // 这里是存储需要动态变化的表,防止乱操作
    static List<String> tableList() {
        List<String> tables = new ArrayList<>();
        //表名
        tables.add("user");
        return tables;
    }

    //拦截器,获取到表名给替换
    @Bean
    public MybatisPlusInterceptor dynamicTableNameInnerInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
            //这里可以自定义,只要返回正确的表名就行了
            String newTable = null;
            for (String table : tableList()) {
                newTable = RequestDataHelper.getRequestData(table);
                if (table.equals(tableName) && newTable != null) {
                    tableName = newTable;
                    break;
                }
            }
            return tableName;
        });
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }
}



  • 表更换的辅助类

public class RequestDataHelper {
    /**
     * 请求参数存取
     */
    private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();

    /**
     * 设置请求参数
     *
     * @param requestData 请求参数 MAP 对象
     */
    public static void setRequestData(Map<String, Object> requestData) {
        REQUEST_DATA.set(requestData);
    }

    /**
     * 获取请求参数
     *
     * @param param 请求参数
     * @return 请求参数 MAP 对象
     */
    public static <T> T getRequestData(String param) {
        Map<String, Object> dataMap = getRequestData();
        if (CollectionUtils.isNotEmpty(dataMap)) {
            return (T) dataMap.get(param);
        }
        return null;
    }

    /**
     * 获取请求参数
     *
     * @return 请求参数 MAP 对象
     */
    public static Map<String, Object> getRequestData() {
        return REQUEST_DATA.get();
    }
}




*测试代码

    @Test
    public void test1() {
    	//表名:user_01
        RequestDataHelper.setRequestData(new HashMap<String, Object>() {{
            put("user", "user" + "_01");
        }});
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);

		//表名:user
        RequestDataHelper.setRequestData(new HashMap<String, Object>() {{
            put("user", "user");
        }});
        List<User> users1 = userMapper.selectList(null);
        users1.forEach(System.out::println);

    }











以下代码是对上面代码的详解

完整项目介绍:

  • 项目目录
    在这里插入图片描述


  • 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.keeson.www</groupId>
    <artifactId>DynamicTableName</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>DynamicTableName</name>
    <description>DynamicTableName</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>



  • 配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false
    username: root
    password: 123456



  • 代码
    1.实体类
@Data
public class User extends Model<User> {
    //主键
    private Long id;
    //用户名
    private String userName;
    //密码
    private String password;

    private Integer isDelete;

    private Integer age;
}




2.数据访问mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {

}




3.springboot启动类

@SpringBootApplication
public class DynamicTableNameApplication {

    public static void main(String[] args) {
        SpringApplication.run(DynamicTableNameApplication.class, args);
    }

}




4.配置类1

@Configuration
public class MybatisPlusConfig {
    // 这里是存储需要动态变化的表,防止乱操作
    static List<String> tableList() {
        List<String> tables = new ArrayList<>();
        //表名
        tables.add("user");
        return tables;
    }

    //拦截器,获取到表名给替换
    @Bean
    public MybatisPlusInterceptor dynamicTableNameInnerInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
            //这里可以自定义,只要返回正确的表名就行了
            String newTable = null;
            for (String table : tableList()) {
                newTable = RequestDataHelper.getRequestData(table);
                if (table.equals(tableName) && newTable != null) {
                    tableName = newTable;
                    break;
                }
            }
            return tableName;
        });
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }
}




5.配置类2

public class RequestDataHelper {
    /**
     * 请求参数存取
     */
    private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();

    /**
     * 设置请求参数
     *
     * @param requestData 请求参数 MAP 对象
     */
    public static void setRequestData(Map<String, Object> requestData) {
        REQUEST_DATA.set(requestData);
    }

    /**
     * 获取请求参数
     *
     * @param param 请求参数
     * @return 请求参数 MAP 对象
     */
    public static <T> T getRequestData(String param) {
        Map<String, Object> dataMap = getRequestData();
        if (CollectionUtils.isNotEmpty(dataMap)) {
            return (T) dataMap.get(param);
        }
        return null;
    }

    /**
     * 获取请求参数
     *
     * @return 请求参数 MAP 对象
     */
    public static Map<String, Object> getRequestData() {
        return REQUEST_DATA.get();
    }
}



  • 测试代码
@SpringBootTest
class DynamicTableNameApplicationTests {

    @Autowired
    UserMapper userMapper;

    @Test
    void contextLoads() {
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

    @Test
    public void test1() {
        RequestDataHelper.setRequestData(new HashMap<String, Object>() {{
            put("user", "user" + "_01");
        }});

        //表名会被动态替换成"TestUser_2022_05"
        //如果实际表名与实体类与不同,可先在实体类类注明表名@TableName("TestUser")
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);

        RequestDataHelper.setRequestData(new HashMap<String, Object>() {{
            put("user", "user");
        }});


        List<User> users1 = userMapper.selectList(null);
        users1.forEach(System.out::println);


    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flask框架的学习---01

1.工程搭建&#xff1a; 安装flask: pip3 install flask 终端运行&#xff1a;flask run 绑定IP地址和端口&#xff1a;Flask run -h 127.0.0.1 -p 8083 修改端口号生产环境&#xff1a;set FLASK_ENVproduction开发模式&#xff1a;set FLASK_ENVdevelopment 虽然 flask …

ChatGPT真的有那么牛吗?

ChatGPT真的有那么牛吗&#xff1f;ChatGPT真的有那么牛吗&#xff1f; 作为一款大型语言模型&#xff0c;ChatGPT确实具有很高的自然语言处理和生成能力&#xff0c;可以生成流畅、准确和有逻辑性的语言&#xff0c;而且能够理解和回答广泛的问题。 它是目前最先进和最强大的…

《HelloGitHub》第 85 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

奇舞周刊第 491 期 初探 Web 客户端追踪技术

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 初探 Web 客户端追踪技术 浏览器的追踪技术是一把双刃剑&#xff0c;它建立了用户个人信息和网站之间的连接&#xff0c;合理地使用能够大大提高用户的体验&#xff0c;但是同时也…

【测试开发】第二节.测开基础篇

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java测试开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 一、软件测…

盈泰德带你了解产品表面缺陷检测系统

与前几年相比&#xff0c;机器视觉行业在表面检测方面有了很大的突破。检测产品表面的划痕、污渍不再困难&#xff0c;广泛应用于金属、玻璃、手机屏幕、液晶面板等行业的表面检测。 机器视觉检测有以下四种常用的检查和照明方法&#xff1a; 同轴照明、低角度照明、背光照明…

最全最简单scrapy框架搭建(附源码案例)

最近在做项目中,需要网页的大批数据,查询数据是一项体力劳动,原本的我 然而,奋斗了一天的我查到的数据却寥寥无几,后来的我是这样的 作为一个cv工程师,复制粘贴原本是一件很快乐的事情但是它缺给了我无尽的折磨,所以我利用4天时间查询各种资料,翻阅各种视频,终于了解了一个面向…

【五一创作】[论文笔记]图片人群计数CSRNet,Switch-CNN

2018(有代码)_CSRNet (10次) 应用最最广泛的&#xff1a;e, is the most widely used while working with counting problems. 2018_CVPR——CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes https://arxiv.org/abs/1802.100…

[遗传学]近亲繁殖与杂种优势

目录 近交与杂交的遗传学效应 (1) 近交使基因纯和,杂交使基因杂合 近交效应: (2) 近交系数与亲缘系数 (3)运用通径分析方法计算近交系数和亲缘系数 ① 通径与通径链 ② 通径分析的理论及其应用 (4)近交降低群体基因型值的平均值,杂交提高群体均值 (5)近交使群体分化,杂…

mysql卸载及Ubuntu降级mysql并安装MySQL5.7并修改键盘失灵问题及 centos_x86.64安装MySQL5.7及修改密码及设置访问

卸载mysql 可以看centos_x86.64安装MySQL5.7标题的卸载 查看MySQL的依赖项 dpkg --list|grep mysql 卸载 mysql-common sudo apt remove mysql-common 卸载 mysql-server sudo apt autoremove --purge mysql-server 清除残留数据 dpkg -l|grep ^rc|awk ‘{print$2}’|sudo …

java.lang.NoSuchFieldException: TYPE

环境: IDEA 2022.1.4 SQL 2012 今日启动SpringBoot项目&#xff0c;出现 Initializing Spring embedded WebApplicationContext。 启动失败&#xff0c;我百度了下&#xff0c;说可能是下了断点&#xff0c;可我没有下断点。 2023-04-29 15:40:02.039 INFO 13676 --- [ …

Vue.js按键修饰符及v-model修饰符

目录 一、按键修饰符 &#xff08;1&#xff09;回车键按键修饰符示例 &#xff08;2&#xff09;自定义按键修饰符示例 二、v-model修饰符 &#xff08;1&#xff09;.lazy &#xff08;2&#xff09;.number &#xff08;3&#xff09;.trim 一、按键修饰符 v-on指令用…

【计算机图形学】三维图形投影和消隐(正等轴测投影图 消隐图构造)

模块4-2 三维图形投影和消隐 一 实验目的 编写三维图形各种变换的投影或消隐算法 二 实验内容 1&#xff1a;自行选择三维物体&#xff08;不能选长方体&#xff09;&#xff0c;建立坐标系&#xff0c;给定点的三维坐标值&#xff0c;建立边表结构&#xff0c;完成正等轴测…

【VM服务管家】VM4.x算法模块开发_4.2 联合OpenCV开发

目录 4.2.1 环境配置&#xff1a;使用OpenCV开发的环境配置4.2.2 图像类算法&#xff1a;使用OpenCV开发算法模块的方法 4.2.1 环境配置&#xff1a;使用OpenCV开发的环境配置 描述 环境&#xff1a;VM4.0.0及以上 VS2013 现象&#xff1a;使用第三方库OpenCV开发时&#xff…

记录-做一个文件拖动到文件夹的效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在我的电脑中&#xff0c;回想一下我们想要把一个文件拖动到另一个文件夹是什么样子的呢 1:鼠标抓起文件 2:拖动文件到文件夹上方 3:文件夹高亮&#xff0c;表示到达指定位置 4:松开鼠标将文件夹放入文…

ChatGPT能让智能客服更上一层楼么?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 现实生活中&#xff0c;智能客服的身影已随处可见。 随着全球经济从以产品为主向以服务为主转型&#xff0c;体验经济也快速发展。客户服务逐渐成为一个独立的产业&#xff0c;而客服中心也成为所有企业的基本部门。然而&am…

港科夜闻|香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)。沈向洋院士于2023年3月6日起担任香港科大校董会主席&#xff0c;这是他上任以后首次率队到访香港科大(广州)。这也标志着&#xff0c;两校将继续坚定不移地在“…

JavaEE——单例模式

文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前&#xff0c;我们得先明确一个名词设计模式。 所谓设计模式其实不难理解&#xff0c;就是在计算机这个圈子中&#xff0c;呢些大佬们为了…

驾考系统C#winform驾照考试系统

驾考系统C#winform驾照考试系统 c#&#xff0c;sqlite&#xff0c;winform &#xff0c;.net framwork4.0驾照考试系统 有兴趣的朋友可以修改源代码玩玩!我用的数据库是sqlite &#xff08;随着我国社会的不断进步和发展&#xff0c;越来越多的家庭拥有汽车&#xff0c;人们…