import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@RestController
public class DemoController {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
DataSource db1DataSource;
@Autowired
@Qualifier("db2DataSource")
DataSource db2DataSource;
@GetMapping("/getDemo")
public List<Map> getDemo () throws SQLException {
List<Map<String, Object>> maps = this.jdbcTemplate.queryForList("select * from table_a where name = 'xiaoming' ");
System.out.println("默认数据库 =>" + maps.toString());
JdbcTemplate jdbc = new JdbcTemplate(db1DataSource);
List<Map<String, Object>> maps1 = jdbc.queryForList("select * from table_a where name = 'xiaoming' ");
System.out.println("默认数据库,使用传参形式,参数为db1 =>" + maps1.toString());
JdbcTemplate jdbc2 = new JdbcTemplate(db2DataSource);
List<Map<String, Object>> maps2 = jdbc2.queryForList("select * from table_a where name = 'xiaoming' ");
System.out.println("使用2号数据库,传参,参数为db2 =>" + maps2.toString());
return null;
直接在流程器访问:http://localhost/getDemo ,控制台打印的数据前两条数据是相同的,第三条是不同的,前提是你的db1和db2同表,数据不同。
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
1、完善连接池参数实现,调整了参数配置文件的配置,采用数组方式兼容yml文件
2、支持为每个数据源分别配置连接池参数
3、注解 @TargetDataSource 更名为 @DataSource
4、支持类级别、方法级别、参数级别的动态数据源
5、将注解使用范围下沉到更接近SQL的 Mapper 层,可以完全避免在Service层因为嵌套调用使用不当导致的数据源冲突或不生效问题
6、支持自定义SQL的数据源切换,兼容通用Mapper内置各种的方法的数据源切换
7、对PageHeader分页使用无影响
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.6</version>
</dependency>
注释掉其他的数据源
例如我的是
yml配置多个数据源(树形排列也可以)
spring.datasource.primary.url=jdbc:oracle:thin:@//dev-ceshi:1521/d0prps
spring.datasource.primary.username=123123
spring.datasource.primary.password=123456
spring.datasource.secondary
SpringBoot yml文件中配置多数据源连接方式springboot配置多数据源,持久层实现自动切换pom文件配置application.yml配置配置一个控制器,并启动程序(启动类无需进行配置,pom依赖导入后,直接在持久层接口使用@DS()注解即可)最主要的变化是持久层接口测试
当前文章是持久层注解实现数据源切换,jdbc实现数据源切换请点击
springboot配置多数据源,持久层实现自动切换
原使用jdbc方式进行连接,现需要改为在xml文件中实现查询
pom文件配置
<dependen
在Spring boot开发中,需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于”裸奔”了,因此需要进行加密处理才行。
使用@SpringBootApplication注解启动的项目,只需增加maven依赖
我们对信息加解密是使用这个jar包的:
编写加解密测试类:
package cn.linjk.ehome;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.
如果一个系统存在多个业务数据库,那么就意味着在该系统中存在多个数据源,此时针对数据库的操作如何让其具体的落地到某个库中呢?
二、解决办法
一个解决办法就是mybatis不同的mapper文件对应不同的数据源,这样service在操作不同的mapper时即操作了不同的数据源
1、yml文件中配置多个数据源
spring:
datasource:
druid:
......
@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class DataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource);
dataSourceMap.put("slave", slaveDataSource);
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
@Bean
public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dynamicDataSource);
return sessionFactory.getObject();
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
3. 在Mapper接口中使用@Mapper注解,并在XML文件中使用namespace指定Mapper接口的全限定名,例如:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(@Param("id") Long id);
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="findById" parameterType="java.lang.Long" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
这样就可以实现Spring Boot MyBatis多数据源的配置和使用了。
注意:以上代码仅供参考,具体实现方式可能会因项目需求而有所不同。