前言
沿用上一篇入门的项目结构:
Spring Boot 入门案例
新建一个数据库名为test2,test2中下的user表的数据:
相比上个入门案例项目整体结构改为(添加了取User用户表的功能)
1、pom.xml中添加dynamic-datasource-spring-boot-starter
如果你的maven显示找不到依赖项。可以去阿里云仓库搜索地址https://maven.aliyun.com/mvn/search
搜索你要找的依赖,下载下来放到你本地的jar路径。
<!-- https://developer.aliyun.com/mvn/search -->
<dependency>
<groupId>cn.humingfeng</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
2、在application.yml 中配置多个数据源
注:我这里用的都是MySQL的数据库。如果你是混用数据,需要在pom.xml中配置其他数据库的相关的数据库驱动依赖就好了。
spring:
datasource:
dynamic:
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123456
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test2?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml
server:
port: 8090
以上会配置一个默认库master数据源,一个组slave。
当然你也可以配置多个子库slave_1,slave_2,…等等
3、使用 @DS 切换数据源
@DS 可以注解在方法上和类上,同时存在的话,方法注解优先级高于在类上注解。
如果没有@DS则为默认数据源
@DS注解在service实现或mapper接口方法上,但不建议同时在service和mapper都加上这个注解。
userMapper.java:(mapper加service不加)
package com.example.demo.mapper;
import cn.humingfeng.dynamic.datasource.annotation.DS;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
//可在mapper中加@DS,则service无需加
@Mapper
@DS("slave")
public interface UserMapper {
List<User> findAll();
}
SutdentService.java:(service加,mapper不加)
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
//在类定义处注解,则整个类都默认采用master数据库
//如需在某个方法中更改数据中,则在方法前加@DS("dbname")修改即可
@Service
@DS("master")
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> findAll(){
return userMapper.findAll();
}
}
4、其他文件配置
其他如实体类,mapper.xml文件,controller则无需变动
userMapper.xml:
<?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.demo.mapper.UserMapper">
<select id="findAll" resultType="com.example.demo.entity.User">
select * from user;
</select>
</mapper>
userService.java:
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> findAll(){
return userMapper.findAll();
}
}
userController.java:
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping("user")
public List<User> findAll(){
return userService.findAll();
}
}
运行结果如图:
可以看到成功实现在不同的数据库中取数。