一个项目中配置多个数据源(链接不同库 jdbc), 无限大, 具体多少根据内存大小
项目中多数据源如何划分: 分包名 (业务) 或注解方式. 分包名方式类似多个不同的 jar, 同业务需求放一个包中.
分包方式配置多数据源
项目目录结构
2.14.1 pom 文件
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.9.RELEASE</version>
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!-- mybatis-spring-boot-starter -->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>2.0.1</version>
- </dependency>
- <!-- mysql 驱动 -->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>8.0.11</version>
- </dependency>
- <!-- 提示建议引入 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- <optional>true</optional>
- </dependency>
- </dependencies>
2.14.2 创建 test1 包名下类
- public class Employee implements Serializable{
- private static final long serialVersionUID = 1L;
- private Integer id;
- private String lastName;
- public interface EmployeeDao {
- // @Insert("insert into myemployeee(last_name) values (#{lastName})")
- int insert(Employee emp);
- }
EmployeeMapping.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.springboot2.test1.dao.EmployeeDao">
- <insert id="insert" parameterType="com.springboot2.test1.bean.Employee">
- insert into myemployeee(last_name) values (#{lastName,jdbcType=VARCHAR})
- </insert>
- </mapper>
service 类
- @Service
- public class EmployeeService {
- @Autowired
- EmployeeDao employeeDao;
- public Integer insert(Employee emp) {
- return employeeDao.insert(emp);
- }
- }
2.14.3 创建 test2 包名下类
- public class User implements Serializable{
- private static final long serialVersionUID = 1L;
- private Integer id;
- private String name;
- private Integer age;
- public interface UserDao {
- // @Insert("insert into myuser(name,age) values (#{name},#{age})")
- int insert(User user);
- }
UserMapping.xml 文件
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.springboot2.test2.dao.UserDao">
- <insert id="insert" parameterType="com.springboot2.test2.bean.User">
- insert into myuser(name,age) values (#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER})
- </insert>
- </mapper>
- @Service
- public class UserService {
- @Autowired
- UserDao userDao;
- public Integer insert(User user2) {
- return userDao.insert(user2);
- }
- }
2.14.4 重点: 多数据源配置
2.14.4.1 首先 application.YAML 文件
- # 多数据源配置
- spring:
- datasource:
- test1: #数据源 1(自定义)
- driver-class-name: com.MySQL.cj.jdbc.Driver
- jdbc-url: jdbc:MySQL://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT+8&allowMultiQueries=true
- username: root
- password: (***)
- test2: #数据源 2(自定义)
- driver-class-name: com.MySQL.cj.jdbc.Driver
- jdbc-url: jdbc:MySQL://localhost:3306/mytest2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT+8&allowMultiQueries=true
- username: root
- password: (***)
注意: 虽然为高版本, 但多数据源配置时, 必须为 spring.datasource.test.jdbc-url 而不是 spring.datasource.test.url
2.14.4.2 多数据源配置类
- /**
- * 数据源配置
- * @author admin
- *
- */
- @Configuration
- @MapperScan(basePackages= "com.springboot2.test1.dao",sqlSessionFactoryRef="test1SqlSessionFactory") // 注意: com.springboot2.test1.dao 是 dao 类的包名!!
- public class DatasourceConfig1 {
- /**
- * 配置 test1 数据库
- * @return
- */
- @Bean(name="test1DataSource")
- @ConfigurationProperties(prefix="spring.datasource.test1")
- @Primary
- public DataSource test1DataSource() {
- return DataSourceBuilder.create().build();
- }
- /**
- * 创建 sqlsessinfactory 会话工厂
- * @param dataSource
- * @return
- * @throws Exception
- */
- @Bean(name="test1SqlSessionFactory")
- @Primary
- public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
- SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
- sqlSessionFactoryBean.setDataSource(dataSource);
- // 加载 mapping 文件
- sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
- .getResources("classpath:com/springboot2/test1/mapping/*.xml"));
- return sqlSessionFactoryBean.getObject();
- }
- /**
- * 事务管理
- */
- @Bean(name="test1TransactionManager")
- @Primary
- public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
- return new DataSourceTransactionManager(dataSource);
- }
- /**
- * 创建 SqlSessionTemplate
- * @param sqlSessionFactory
- * @return
- */
- @Bean(name="test1SqlSessionTemplate")
- @Primary
- public SqlSessionTemplate test1SqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
- return new SqlSessionTemplate(sqlSessionFactory);
- }
- }
- /**
- * 数据源配置
- * @author admin
- *
- */
- @Configuration
- @MapperScan(basePackages= {"com.springboot2.test2.dao"},sqlSessionFactoryRef="test2SqlSessionFactory")
- public class DatasourceConfig2 {
- /**
- * 配置 test2 数据库
- * @return
- */
- @Bean(name="test2DataSource")
- @ConfigurationProperties(prefix="spring.datasource.test2")
- public DataSource test2DataSource() {
- return DataSourceBuilder.create().build();
- }
- /**
- * 创建 sqlsessinfactory 会话工厂
- * @param dataSource
- * @return
- * @throws Exception
- */
- @Bean(name="test2SqlSessionFactory")
- public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
- SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
- sqlSessionFactoryBean.setDataSource(dataSource);
- // 加载 mapping 文件
- sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
- .getResources("classpath:com/springboot2/test2/mapping/*.xml"));
- return sqlSessionFactoryBean.getObject();
- }
- /**
- * 事务管理
- */
- @Bean(name="test2TransactionManager")
- public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
- return new DataSourceTransactionManager(dataSource);
- }
- /**
- * 创建 SqlSessionTemplate
- * @param sqlSessionFactory
- * @return
- */
- @Bean(name="test2SqlSessionTemplate")
- public SqlSessionTemplate test2SqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
- return new SqlSessionTemplate(sqlSessionFactory);
- }
- }
注意:
1)分包方式下 @Primary 可以不写!
2)mapperscan 扫描为 dao 类对应的包名而不是 dao 类, 否则会导致无法注入, 报错缺少 component 注解.
2.14.5 controller 类
- @RestController
- public class MultiDataSourceController {
- @Autowired
- EmployeeService employeeService1;
- @Autowired
- UserService userService;
- @RequestMapping("/insertEmployee")
- public String insert(String lastName){
- Employee emp=new Employee();
- emp.setLastName(lastName);
- int i=employeeService1.insert(emp);
- return i+"";
- }
- // 接收 JSON 格式请求
- @RequestMapping("/insertUser")
- public String insert(@RequestBody User user){
- User user2=new User();
- user2.setAge(user.getAge());
- user2.setName(user.getName());
- int i=userService.insert(user2);
- return i+"";
- }
- // 接收普通格式多参数请求
- @RequestMapping("/insertUser2")
- public String insertUser2(@RequestParam("name") String name,@RequestParam("name") Integer age){
- User user2=new User();
- user2.setAge(age);
- user2.setName(name);
- int i=userService.insert(user2);
- return i+"";
- }
2.14.7 启动类
- @SpringBootApplication
- //@MapperScan("com.springboot2.dao")// 多数据源下在数据源配置中配置 DatasourceConfig1 和 DatasourceConfig2
- public class StartApplication {
- public static void main(String[] args) {
- SpringApplication.run(StartApplication.class, args);
- }
- }
2.14.8 测试
1 Get 请求:
执行成功返回 1
2 Post 请求(且 content-type 为 application/JSON 类型)
http://localhost:8080/insertUser
请求参数:
- {
- "name":"test3",
- "age":11
- }
返回成功 1
3 get 请求(content-type 类型随意)
http://localhost:8080/insertUser2?name=ttdd&age=22
返回成功 1
来源: http://www.bubuko.com/infodetail-3056130.html