The World Best ST.

Dynamic Datasource

字数统计: 751阅读时长: 3 min
2019/12/26 Share

Dynamic Datasource - 动态数据源

springboot版本: 2.2.2.RELEASE
mybatis-plus版本: 3.1.0
druid版本: 1.1.18
dynamic-datasource版本: 2.4.2
mysql-connector-java版本: 8.0.15
mybatis-plus-generator版本: 3.1.0

※当mybatis-plus版本与mybatis-plus-generator版本为3.1.0以上时, 使用jdk8的LocalDateTime查询时会报如下错误:java.sql.SQLFeatureNotSupportedException, 将mybatis-plus和mybatis-plus-generator版本降低即可。

引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!--集成druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.18</version>
</dependency>
<!--Mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 多数据源切换 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.4.2</version>
</dependency>

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# dynamic datasource
# master datasource
#设置默认的数据源或者数据源组,默认值即为master
spring.datasource.dynamic.primary=master
#设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源
spring.datasource.dynamic.strict=false
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://192.168.89.128:3306/bbs?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=123456
spring.datasource.dynamic.datasource.master.driverClassName=com.mysql.cj.jdbc.Driver
# slave datasource
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.89.128:3306/mysql?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=123456
spring.datasource.dynamic.datasource.slave.driverClassName=com.mysql.cj.jdbc.Driver

启动类修改

去除DruidDataSourceAutoConfigure.class, 若没有去除, 否则会在spring.datasource下面查找url和username等相关配置. 需要根据引入的连接池进行去除

1
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)

使用@DS进行数据源切换

interface:

1
2
3
4
5
public interface IUserService extends IService<User> {
List<User> selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper<User> userWrapper);

List<User> selectByName(@Param("name") String name);
}

implement

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
@DS("slave")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

@Autowired
UserMapper userMapper;

@Override
public List<User> selectByMyWrapper(Wrapper<User> userWrapper) {
return userMapper.selectByMyWrapper(userWrapper);
}

@Override
@DS("master")
public List<User> selectByName(String name) {
return userMapper.selectByName(name);
}
}

mapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface UserMapper extends BaseMapper<User> {
/**
* 如果自定义的方法还希望能够使用MP提供的Wrapper条件构造器,则需要如下写法
*
* @param userWrapper
* @return
*/
@Select("SELECT * FROM user ${ew.customSqlSegment}")
List<User> selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper<User> userWrapper);

/**
* 和Mybatis使用方法一致
* @param name
* @return
*/
@Select("SELECT * FROM user where userName = #{name}")
List<User> selectByName(@Param("name") String name);
}

@DS(“slave”) 括号内即是application.properties中配置的数据源名称,不加注解默认是访问主库master,可加在service方法上,也可加在mapper方法上,但强烈不建议同时在service和mapper注解。
@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。

CATALOG
  1. 1. Dynamic Datasource - 动态数据源
    1. 1.0.1. 引入依赖
    2. 1.0.2. 配置文件
    3. 1.0.3. 启动类修改
    4. 1.0.4. 使用@DS进行数据源切换