当前位置:

首页 > 编程开发 > springboot中如何利用mybatis+druid配置动态数据源

springboot中如何利用mybatis+druid配置动态数据源

一、建数据库和表1.数据库demo1放一张user表SETFOREIGN_KEY_CHECKS=0;--------------------------------Tablestructureforuser------------------------------DROPTABLEIFEXISTS`user`;CREATETABLE`user`(`id`int(11)NOTNULL,`name`varchar(255)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBD

本文目录

    一、建数据库和表
    1.数据库demo1放一张user表

    SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
    `id` int(11) NOT NULL,
    `name` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', 'aa');
    INSERT INTO `user` VALUES ('2', 'bb');

    2.数据库demo2放一张role表

    SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for role
    -- ----------------------------
    DROP TABLE IF EXISTS `role`;
    CREATE TABLE `role` (
    `id` int(11) NOT NULL,
    `name` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of role
    -- ----------------------------
    INSERT INTO `role` VALUES ('1', 'CC');
    INSERT INTO `role` VALUES ('2', 'DD');

    二、pom.xml引入包

    
    org.springframework.boot
    spring-boot-starter-web
    
    
    org.springframework.boot
    spring-boot-starter-test
    test
    
    
    org.springframework.boot
    spring-boot-starter-thymeleaf
    
    
    mysql
    mysql-connector-java
    runtime
    
    
    mysql
    mysql-connector-java
    
    
    org.springframework.boot
    spring-boot-starter-jdbc
    
    
    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    2.0.1
    
    
    
    org.aspectj
    aspectjweaver
    
    
    
    com.alibaba
    druid-spring-boot-starter
    1.1.10
    
    
    
    com.typesafe.dynamicdatasource
    dynamic-data-source_2.11
    

    三、用generator插件生成user、role两张表的实体类、mapper.java、mapper.xml

    User.java
    Role.java
    UserMapper.java
    RoleMapper.java
    UserMapper.xml
    RoleMapper.xml

    四、配置application.yml

    server:
    port: 8088
    mybatis:
    mapper-locations: classpath:mapper/*.xml
    spring:
    datasource:
    db1:
    url: jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    #驱动包
    driver-class-name: com.mysql.cj.jdbc.Driver
    #初始连接数
    initial-size: 5
    #最小空闲数
    min-idle: 5
    #最大活动数
    max-active: 20
    #等待超时时间
    max-wait: 60000
    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    time-between-eviction-runs-millis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    min-evictable-idle-time-millis: 300000
    #验证数据库连接的查询语句,MYSQL是select 1
    validation-query: SELECT 1 FROM DUAL
    #空闲时测试,testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    #打开PSCache,并指定每个链接上的PSCache大小
    pool-prepared-statements: true
    max-pool-prepared-statement-per-connection-size: 20
    #配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall'用于防火墙,此处是filter修改的地方
    filters: stat,wall
    #通过connectproperties属性来打开mergesql功能:慢sql记录
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    #合并多个DruidDataSource
    useGlobalDataSourceStat: true
    db2:
    url: jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    #驱动包
    driver-class-name: com.mysql.cj.jdbc.Driver
    #初始连接数
    initial-size: 5
    #最小空闲数
    min-idle: 5
    #最大活动数
    max-active: 20
    #等待超时时间
    max-wait: 60000
    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    time-between-eviction-runs-millis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    min-evictable-idle-time-millis: 300000
    #验证数据库连接的查询语句,MYSQL是select 1
    validation-query: SELECT 1 FROM DUAL
    #空闲时测试,testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    #打开PSCache,并指定每个链接上的PSCache大小
    pool-prepared-statements: true
    max-pool-prepared-statement-per-connection-size: 20
    #配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall'用于防火墙,此处是filter修改的地方
    filters: stat,wall
    #通过connectproperties属性来打开mergesql功能:慢sql记录
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    #合并多个DruidDataSource
    useGlobalDataSourceStat: true

    五、启动类扫描mapper.java文件

    @SpringBootApplication
    @MapperScan("com.example.demo.dao")
    public class DemoApplication {
    public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
    }
    }

    六、定义DataSourceConfig, 将application.yml中的配置导入DataSource中,并注入到bean

    @Configuration
    public class DataSourceConfig {
    //从配置文件配置数据源
    @Primary
    @Bean(name="datasource1")
    @ConfigurationProperties("spring.datasource.db1")
    public DataSource dataSource1(){
    return new DruidDataSource();
    }
    //从配置文件配置数据源
    @Bean(name="datasource2")
    @ConfigurationProperties("spring.datasource.db2")
    public DataSource dataSource2(){
    return new DruidDataSource();
    }
    //动态数据源 进行数据源切换
    @Bean(name="dynamicDataSource")
    public DataSource dynamicDataSource(){
    DynamicDataSource dynamicDatasource=new DynamicDataSource();
    //设置默认数据源
    dynamicDatasource.setDefaultTargetDataSource(dataSource1());
    //配置多数据源
    Map dsMap=new HashMap<>();
    dsMap.put("datasource1",dataSource1());
    dsMap.put("datasource2",dataSource2());
    //将多数据源放到数据源池中
    dynamicDatasource.setTargetDataSources(dsMap);
    return dynamicDatasource;
    }
    }

    七、定义动态数据源切换类DynamicDataSourceContextHolder

    public class DynamicDataSourceContextHolder {
    private static final ThreadLocal contextHolder=new ThreadLocal<>();
    //设置数据源名称
    public static void setDB(String dbType){
    contextHolder.set(dbType);
    }
    //获取数据源名称
    public static String getDB(){
    return contextHolder.get();
    }
    //清除数据源名
    public static void clearDB(){
    contextHolder.remove();
    }
    }

    八、定义获取动态数据源类DynamicDataSource

    public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
    return DynamicDataSourceContextHolder.getDB();
    }
    }

    九、定义mybatis配置类,将DynamicDataSource放入SqlSessionFactoryBean中

    @EnableTransactionManagement
    @Configuration
    public class MyBatisConfig {
    @Resource(name = "dynamicDataSource")
    private DataSource dynamicDataSource;
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dynamicDataSource);//将动态数据源bean配置到sqlsessionfactory
    sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
    return sqlSessionFactoryBean.getObject();
    }
    @Bean
    public PlatformTransactionManager platformTransactionManager() {
    return new DataSourceTransactionManager(dynamicDataSource);
    }
    }

    十、定义用于切换数据源的注解TargetDataSource

    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface TargetDataSource {
    String value() default "datasource1";
    }

    十一、定义切面DynamicDataSourceAspect,用于拦截注解,并执行数据源切换功能

    @Aspect
    @Component
    public class DynamicDataSourceAspect {
    @Before("@annotation(targetDataSource)")
    public void beforeSwitchDS(JoinPoint point,TargetDataSource targetDataSource){
    DynamicDataSourceContextHolder.setDB(targetDataSource.value());
    }
    @After("@annotation(targetDataSource)")
    public void afterSwitchDS(JoinPoint point,TargetDataSource targetDataSource){
    DynamicDataSourceContextHolder.clearDB();
    }
    }

    十二、测试类Test

    @RestController
    public class Test {
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private UserMapper userMapper;
    //未使用TargetDataSource注解,则使用默认数据源,即datasource1
    @RequestMapping("/ds1")
    public String selectDataSource1(){
    return userMapper.selectByPrimaryKey(1).toString();
    }
    //使用了注解,则数据源为注解中指定的datasource2
    @RequestMapping("/ds2")
    @TargetDataSource("datasource2")
    public String selectDataSource2(){
    return roleMapper.selectByPrimaryKey(1).toString();
    }
    }

    测试

    1.输入

    http://localhost:8088/ds1

    返回
    ↓

    springboot中如何利用mybatis+druid配置动态数据源

    2.输入

    http://localhost:8088/ds2

    返回
    ↓

    springboot中如何利用mybatis+druid配置动态数据源

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    MyBatis XML开发全面完整指南
    MyBatis XML开发全面完整指南

    MyBatisXML开发方式适合复杂SQL逻辑,通过配置数据库连接与mapper路径,在接口和XML映射文件中实现增删改查操作。XML支持多表查询及结果映射,#{}使用预编译防注入,${}直接拼接需注意字符串引号。

    MyBatis Mapper 接口原理与实现解析
    MyBatis Mapper 接口原理与实现解析

    MyBatis通过动态代理自动生成Mapper接口实现类,运行时将接口方法绑定到SQL语句,结合XML映射文件中的SQL与参数配置,由SqlSession执行并返回结果,避免了手动编写实现类的繁琐过程。

    MyBatis框架常见问题及解决方案
    MyBatis框架常见问题及解决方案

    MyBatis常见问题包含:1.实体类属性与数据库字段不一致,解决方案为使用@Column注解映射;2.执行更新操作失败,需要配置update元素并检查SQL语句;3.查询结果映射出错,需检查resultMap配置是否正确;4.解析SQL参数失败,要使用#{}占位符并确保参数类型匹配。

    MyBatis框架中设计模式的应用
    MyBatis框架中设计模式的应用

    MyBatis框架广泛应用设计模式,包括:工厂模式:创建SqlSessionFactory对象,管理数据库连接和查询;代理模式:实现延迟加载和懒加载,提高性能。外观模式:封装对数据库访问,简化代码维护。其中,一对多关系映射可以通过User和Order类、Mapper接口和MapperXML配置实现,使用延迟加载和嵌套resultMap优化性能。

    MyBatis 的动态 SQL 解析:原理、实现和优化
    MyBatis 的动态 SQL 解析:原理、实现和优化

    MyBatis动态SQL解析:原理:使用TAG和OGNL表达式动态构建SQL语句。实现:通过SqlNode、SqlSource和ParameterHandler接口实现。优化:避免不必要的动态SQL、优化OGNL表达式、使用PreparedStatement缓存和配置查询超时。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    正确使用MyBatis中的小于符号
    正确使用MyBatis中的小于符号

    MyBatis是一个用Java语言编写的持久层框架,广泛用于数据库操作。在MyBatis中,使用小于号(<)进行条件查询是很常见的操作。但是,小于号在MyBatis中有一些使用注意事项,本文将介绍MyBatis小于号的正确使用方法,并提供具体的代码示例。1.在MyBatis中使用小于号的基本方法在MyBatis中使用小于号进行条件查询,一般是在SQL

    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景
    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景

    MyBatis的缓存机制解析:一级缓存与二级缓存的区别与应用在MyBatis框架中,缓存是一个非常重要的特性,可以有效提升数据库操作的性能。其中,一级缓存和二级缓存是MyBatis中常用的两种缓存机制。本文将详细解析一级缓存与二级缓存的区别与应用,并提供具体的代码示例进行说明。一、一级缓存一级缓存也被称为本地缓存,它默认开启且不可关闭。一级缓存是SqlSes

    深入了解MyBatis缓存机制:揭秘缓存存储原理
    深入了解MyBatis缓存机制:揭秘缓存存储原理

    MyBatis缓存机制详解:一文读懂缓存存储原理引言在使用MyBatis进行数据库访问时,缓存是一个非常重要的机制,能够有效减少对数据库的访问,提高系统性能。本文将详细介绍MyBatis的缓存机制,包括缓存的分类、存储原理和具体的代码示例。一、缓存的分类MyBatis的缓存主要分为一级缓存和二级缓存两种。一级缓存一级缓存是SqlSession级别的缓存,当在

    详解在MyBatis中使用小于符号的方法
    详解在MyBatis中使用小于符号的方法

    MyBatis中小于号的写法详解MyBatis是一个优秀的持久层框架,广泛应用于Java开发中。在使用MyBatis进行数据库操作的过程中,我们经常会用到小于号(<)进行条件查询。但是,MyBatis中小于号的写法并不像普通的SQL语句那样直接使用小于号符号,而是需要使用特定的方式来实现。本文将详细解释MyBatis中小于号的写法,并提供具体的代码示例

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。