spring boot mybatis多数据源解决方案过程解析
在我们的项目中不免会遇到需要在一个项目中使用多个数据源的问题,像我在得到一个任务将用户的聊天记录进行迁移的时候,就是用到了三个数据源,当时使用的AOP的编程方式根据访问的方法的不同进行动态的切换数据源,觉得性能不太好,先在又新用到了一种使用方式,觉得不错,记录下来。
介绍一下DEMO项目,使用的springboot集成mybatis,mybatis查询数据库是基于注解形式查询的,目的查询两个数据库test1和test2的用户信息,并在控制台打印。
1.pom文件
org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.1 com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java runtime 5.1.27 org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine src/main/java **/*.xml src/resources org.springframework.boot spring-boot-maven-plugin
其中添加了alibaba的druid的数据源代替了springboot默认的hikacp,注意mysql的驱动的版本号要与自己所使用的mysql的版本号保持一致,其中build模块里面的resources里面是为了防止springboot过滤掉src/main/java的XML文件,毕竟有的人喜欢mybatsi查询数据库的时候使用的是XML映射文件,不过我们本次使用的是注解的形式,所以
2.用户类
publicclassUser{ publicIntegerid; publicStringname; publicStringaddress; @Override publicStringtoString(){ return"User{"+ "id="+id+ ",name='"+name+'\''+ ",address='"+address+'\''+ '}'; } //getset方法省略........... }
用户类没有什么好说的,就是基本的几个属性。
3.application.properties文件配置
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.one.username=root spring.datasource.one.password=123456 spring.datasource.one.url=jdbc:mysql://localhost:3306/test1 spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.two.username=root spring.datasource.two.password=123456 spring.datasource.two.url=jdbc:mysql://localhost:3306/test2
这里主要配置了两个数据库的访问属性,注意两个的区别为one何two的前缀不同,方便在下面使用springboot的类安全属性的方式创建不同的数据源。
4.根据不同的前缀创建不同的数据源
@Configuration publicclassDataSourceConfig{ @Bean @ConfigurationProperties(prefix="spring.datasource.one") publicDataSourcedsOne(){ returnDruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix="spring.datasource.two") publicDataSourcedsTwo(){ returnDruidDataSourceBuilder.create().build(); } }
该类位于主目录的config目录下面,使用@ConfigurationProperties注解表明对应的DataSource创建的时候使用的配置文件的内容。
5.在主目录下面分别创建mapper1和mapper2包,在对应的包下面创建对应的数据层访问接口UserMapper1和UserMapper2,内容都如下所示
@Mapper publicinterfaceUserMapper1{ @Select("select*fromusers") ListgetAllUser(); }
这接口里面没有什么好说的就是一个简单的mytatis的基于注解的查询所有用户的接口。
6.在config包下面创建不同的配置类MybatisConfigOne和MybatisConfigTwo两个类分别对应去扫描mapper1和mapper2两个路径下面的dao层接口。
@Configuration @MapperScan(basePackages="com.hopec.mybatis.mapper1",sqlSessionFactoryRef="sqlSessionFactory1", sqlSessionTemplateRef="sqlSessionTemplate1") publicclassMybatisConfigOne{ @Autowired @Qualifier("dsOne") DataSourceds1; @Bean SqlSessionFactorysqlSessionFactory1(){ SqlSessionFactoryBeanbean=newSqlSessionFactoryBean(); bean.setDataSource(ds1); try{ returnbean.getObject(); }catch(Exceptione){ e.printStackTrace(); } returnnull; } @Bean SqlSessionTemplatesqlSessionTemplate1(){ returnnewSqlSessionTemplate(sqlSessionFactory1()); } }
publicclassMybatisConfigTwo{ @Autowired @Qualifier("dsTwo") DataSourceds2; @Bean SqlSessionFactorysqlSessionFactory2(){ SqlSessionFactoryBeanbean=newSqlSessionFactoryBean(); bean.setDataSource(ds2); try{ returnbean.getObject(); }catch(Exceptione){ e.printStackTrace(); } returnnull; } @Bean SqlSessionTemplatesqlSessionTemplate2(){ returnnewSqlSessionTemplate(sqlSessionFactory2()); } }
7.测试
@SpringBootTest classMybatisApplicationTests{ @Autowired UserMapper1userMapper1; @Autowired UserMapper2userMapper2; @Test voidcontextLoads(){ Listusers=userMapper1.getAllUser(); System.out.println(users); List allUser=userMapper2.getAllUser(); System.out.println(allUser); } }
测试结果:
如果想使用多个数据源,就继续增加就可以了,ok,大功告成了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。