文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-08 04:52

关注

这篇“springboot中如何利用mybatis+druid配置动态数据源”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot中如何利用mybatis+druid配置动态数据源”文章吧。

一、建数据库和表
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引入包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version></dependency><!-- aop --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency><!-- alibaba druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><!-- dynamic--><dependency><groupId>com.typesafe.dynamicdatasource</groupId><artifactId>dynamic-data-source_2.11</artifactId></dependency>

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

User.javaRole.javaUserMapper.javaRoleMapper.javaUserMapper.xmlRoleMapper.xml

四、配置application.yml

server:port: 8088mybatis:mapper-locations: classpath:mapper/*.xmlspring:datasource:db1:url: jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTusername: rootpassword: roottype: 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 1validation-query: SELECT 1 FROM DUAL#空闲时测试,testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证test-while-idle: truetest-on-borrow: falsetest-on-return: false#打开PSCache,并指定每个链接上的PSCache大小pool-prepared-statements: truemax-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#合并多个DruidDataSourceuseGlobalDataSourceStat: truedb2:url: jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTusername: rootpassword: roottype: 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 1validation-query: SELECT 1 FROM DUAL#空闲时测试,testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证test-while-idle: truetest-on-borrow: falsetest-on-return: false#打开PSCache,并指定每个链接上的PSCache大小pool-prepared-statements: truemax-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#合并多个DruidDataSourceuseGlobalDataSourceStat: 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

@Configurationpublic 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<Object,Object> dsMap=new HashMap<>();dsMap.put("datasource1",dataSource1());dsMap.put("datasource2",dataSource2());//将多数据源放到数据源池中dynamicDatasource.setTargetDataSources(dsMap);return dynamicDatasource;}}

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

public class DynamicDataSourceContextHolder {private static final ThreadLocal<String> 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 {@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDB();}}

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

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

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

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

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

@Aspect@Componentpublic 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

@RestControllerpublic class Test {@Autowiredprivate RoleMapper roleMapper;@Autowiredprivate 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配置动态数据源

以上就是关于“springboot中如何利用mybatis+druid配置动态数据源”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯