SpringBoot Druid Mybatis多数据源

标签: Springboot 分类: Java 创建时间:2020-07-13 08:56:36 更新时间:2024-11-15 10:49:43

有两种方式进行数据源配置,一种比较简单,使用配置文件加上DruidDataSourceBuilder.create().build()创建数据源就可以了,根据相关的资料,我觉得这种配置,只适合于对数据进行监控的情况,比如对于结合mybatis的情况,就不太适用了,我没有找到配置实体类扫描的地方。一种就是手写配置然后自己配置数据源的config就像参考文章1一样。

1.添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--数据源连接-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!--Sql Server-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.1.0.jre8</version>
</dependency>

2.编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
datasource:
sqlserver:
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://xxx:5433;DatabaseName=xxx
username: xxx
password: xxx
connection-timeout: 20000
maximum-pool-size: 5
sqlserver2:
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://xxx:5433;DatabaseName=xxx
username: xxx
password: xxx
connection-timeout: 20000
maximum-pool-size: 5

3.编写第一个数据源配置

注意其中的PACKAGE和MAPPER_LOCATION,是你mapper包的位置和xml文件的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = SqlServerConfig.PACKAGE, sqlSessionFactoryRef = "sqlserverSqlSessionFactory")
public class SqlServerConfig {

// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.proheng.gis.mapper.sqlserver";
static final String MAPPER_LOCATION = "classpath*:mapper/sqlserver/*.xml";

@Value("${datasource.sqlserver.url}")
private String url;

@Value("${datasource.sqlserver.username}")
private String user;

@Value("${datasource.sqlserver.password}")
private String password;

@Value("${datasource.sqlserver.driverClassName}")
private String driverClass;

@Bean(name = "sqlserverDataSource")
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}

@Bean(name = "sqlserverTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}

@Bean(name = "sqlserverSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("sqlserverDataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(SqlServerConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}

4.编写实体类

1
2
3
public class RealTime {
private Long id;
}

5.编写mapper

1
2
3
4
5
6
7
import java.util.List;

public interface RealTimeMapper {
// 获取全部的站点数据
List<RealTime> searchHistoryAll();
}

6.编写mapper.xml

注意其中的namespace应该换成你自己的包名和实体包路径。

1
2
3
4
5
6
7
8
9
10
<?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">
<!--namespace 指定映射对应的mapper接口类-->
<mapper namespace="com.proheng.gis.mapper.sqlserver.RealTimeMapper">
<!--查询全部站点历史记录-->
<select id="searchHistoryAll" resultType="com.proheng.gis.entity.sqlserver.RealTime">
SELECT * FROM realtime
</select>
</mapper>

7.自动注入mapper

1
2
3
4
5
6
7
 @Autowired
private RealTimeMapper realTimeMapper;

@RequestMapping("/test")
public List<RealTime> test(){
return realTimeMapper.searchHistoryAll();
}

8.编写第二个数据源配置

第二个数据源配置和第一个数据源配置的区别就是要把SqlServerConfig中的@Primary去掉,然后名称啊,什么都换掉,比如:(注意里面的名字)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = SqlServerConfig2.PACKAGE, sqlSessionFactoryRef = "sqlserver2SqlSessionFactory")
public class SqlServerConfig2 {

// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.proheng.gis.mapper.sqlserver2";
static final String MAPPER_LOCATION = "classpath*:mapper/sqlserver2/*.xml";

@Value("${datasource.sqlserver2.url}")
private String url;

@Value("${datasource.sqlserver2.username}")
private String user;

@Value("${datasource.sqlserver2.password}")
private String password;

@Value("${datasource.sqlserver2.driverClassName}")
private String driverClass;

@Bean(name = "sqlserver2DataSource")
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}

@Bean(name = "sqlserver2TransactionManager")
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}

@Bean(name = "sqlserver2SqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("sqlserver2DataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(SqlServerConfig2.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
参考文章:
1.Spring Boot 整合 Mybatis 实现 Druid 多数据源
2.Spring Boot+Druid多数据源配置 (使用DruidDataSourceBuilder.create().build()创建数据源)
3.Druid Spring Boot Starter (使用DruidDataSourceBuilder.create().build()创建数据源)
4.基于Spring Boot自定义Mybatis配置实例

总结
其实使用Druid配置数据源也好,使用mybatis配置多数据源也好,步骤和原理和使用jpa配置多数据源差不多(Post not found: Spring Boot多数据源及动态数据源 Spring Boot多数据源及动态数据源)

问题

(1) 项目启动失败
将:”classpath:mapper/sqlserver/.xml”,换成了:”classpath:mapper/sqlserver/*.xml”

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。