【sping-boot】链接多个数据库源
修改配置文件
pom.xml中新增数据库配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>two-db-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>two-db-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
<configurationFile>src/main/resources/mybatis/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
目录结构
mybatis配置相关
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="mysqlTables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="false"/> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--目标数据库配置--> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/komo?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullNamePatternMatchesAll=true" userId="root" password="123456"/> <!-- 指定生成的类型为java类型,避免数据库中number等类型字段 --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成model模型,对应的包,存放位置可以指定具体的路径,如/ProjectName/src,也可以使用MAVEN来自动生成 --> <javaModelGenerator targetPackage="com.example.twodbdemo.dao.komoDao" targetProject="src/main/java"> <property name="enableSubPackages" value="false"/> <property name="trimStrings" value="true"/> <property name="immutable" value="false"/> </javaModelGenerator> <!--对应的xml mapper文件 --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources/mybatis/komo"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 对应的dao接口 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.twodbdemo.mapper.komoMapper" targetProject="src/main/java"> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!--定义需要操作的表及对应的DTO名称--> <table tableName="t_user" domainObjectName="User" /> </context> </generatorConfiguration>
启动类上新增
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
package com.example.twodbdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; // 去掉自动数据库自动配置类 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class TwoDbDemoApplication { public static void main(String[] args) { SpringApplication.run(TwoDbDemoApplication.class, args); System.out.println("========= Two Db Demo Application End ============"); } }
application数据库配置
先看application.yml中的配置
spring: datasource: db1: jdbc-url: jdbc:mysql://127.0.0.1:3306/komo?characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver db2: jdbc-url: jdbc:mysql://127.0.0.1:3306/mfw?characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver server: port: 7777
config目录下的数据库配置
DataSourceConfig.java
package com.example.twodbdemo.config; import javax.sql.DataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author komiles@163.com * @date 2020-05-09 14:18 */ @Configuration public class DataSourceConfig { @Bean(name="db1") @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource komoDbDataSource() { return DataSourceBuilder.create().build(); } @Bean(name="db2") @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource mfwDbDataSource() { return DataSourceBuilder.create().build(); } }
Db1Config.java
package com.example.twodbdemo.config; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; /** * @author komiles@163.com * @date 2020-05-09 14:21 */ @Configuration @MapperScan(basePackages = {"com.example.twodbdemo.mapper.komoMapper"}, sqlSessionFactoryRef = "sqlSessionFactoryDb1") public class Db1Config { private static final String PATH = "classpath:mybatis/komo/mapper/*.xml"; @Autowired @Qualifier("db1") private DataSource dataSourceDb1; @Bean public SqlSessionFactory sqlSessionFactoryDb1() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSourceDb1); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(Db1Config.PATH)); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception { return new SqlSessionTemplate(sqlSessionFactoryDb1()); } }
Db2Config.java
package com.example.twodbdemo.config; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; /** * @author komiles@163.com * @date 2020-05-09 14:21 */ @Configuration @MapperScan(basePackages = {"com.example.twodbdemo.mapper.mfwMapper"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2") public class Db2Config { private static final String PATH = "classpath:mybatis/mfw/mapper/*.xml"; @Autowired @Qualifier("db2") private DataSource dataSourceDb2; @Bean public SqlSessionFactory sqlSessionFactoryDb2() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSourceDb2); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(Db2Config.PATH)); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception { return new SqlSessionTemplate(sqlSessionFactoryDb2()); } }
Controller层文件
UserController.java
package com.example.twodbdemo.controller; import com.example.twodbdemo.dao.komoDao.User; import com.example.twodbdemo.dao.mfwDao.UserBase; import com.example.twodbdemo.service.komo.UserService; import com.example.twodbdemo.service.mfw.UserBaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author komiles@163.com * @date 2020-05-09 14:39 */ @RestController @RequestMapping("/user") public class UserController { @Autowired UserService userService; @Autowired UserBaseService userBaseService; @GetMapping("/komo/id") public User getOne(@RequestParam(value = "id") Integer id){ return userService.getOne(id); } @GetMapping("/mfw/id") public UserBase getBaseOne(@RequestParam(value = "id") Integer id){ return userBaseService.getOne(id); } }
项目源码
地址:https://github.com/KoMiles/spring-example/tree/master/two-db-demo
千里之行,始于足下。改变现在,就是改变未来。改变未来,从现在开始。