SpringBoot多源資料庫配置案例
阿新 • • 發佈:2020-08-20
注:案例中兩個源資料庫都為mysql
<?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 http://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.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent><groupId>com.springboot</groupId> <artifactId>chapter4-5-2</artifactId> <version>0.0.1-SNAPSHOT</version> <name>chapter4-5-2</name> <description>chapter4-5-2</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jersey</artifactId> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--spring切面aop依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </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.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--easypoi--> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.1.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-jersey2-jaxrs</artifactId> <version>1.5.17</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!-- 分頁外掛 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> <exclusions> <exclusion> <artifactId>mybatis-spring-boot-starter</artifactId> <groupId>org.mybatis.spring.boot</groupId> </exclusion> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!--token驗證--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency> </dependencies> <build> <!--打包後的專案名稱 --> <finalName>com.wiscom.kingpds.webapi</finalName> <resources> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}\classes</targetPath> <excludes> <!-- 這裡不能排除config/**,這裡是myeclipse的編譯環境,不是打包的,排除之後, myeclipse中classpath下將找不到config,會報錯 --> <exclude>download/**</exclude> </excludes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.yml</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- 資原始檔拷貝外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- java編譯外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>UTF-8</encoding> <compilerArgs> <!-- 過期方法警告 --> <arg>-Xlint:deprecation</arg> </compilerArgs> <compilerArguments> <!-- 解決maven命令編譯報錯,因為rt.jar 和jce.jar在jre的lib下面,不在jdk的lib下面, 導致maven找不到(java7以後會出現這個問題)--> <bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath> </compilerArguments> </configuration> </plugin> <!-- 打jar包的外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib</classpathPrefix> <!-- 程式啟動入口 --> <mainClass>com.wiscom.Application</mainClass> </manifest> <manifestEntries> <Class-Path>./</Class-Path> </manifestEntries> </archive> <excludes> <!-- <exclude>config/**</exclude>--> <exclude>static/**</exclude> </excludes> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <!-- not append assembly id in release file name --> <appendAssemblyId>false</appendAssemblyId> <descriptors> <!-- 注意這裡的路徑 --> <descriptor>src/main/build/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <!-- mybatis generator 自動生成程式碼外掛 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.1</version> <configuration> <configurationFile>${basedir}/src/main/resources/config/generatorConfig.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> </plugin> </plugins> </build> </project>
src/main/resources/
application.properties
# test\u6570\u636E\u6E90 #\u6570\u636E\u5E93url spring.datasource.test.jdbc-url=jdbc:mysql://111.222.333.444:3306/test?characterEncoding=utf8&useSSL=false ##\u6570\u636E\u5E93\u7528\u6237\u540D spring.datasource.test.username=root ##\u6570\u636E\u5E93\u5BC6\u7801 spring.datasource.test.password=root ##\u6570\u636E\u5E93\u9A71\u52A8 spring.datasource.test.driver-class-name=com.mysql.jdbc.Driver ## test2\u6570\u636E\u6E90 ##\u6570\u636E\u5E93url spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false ##\u6570\u636E\u5E93\u7528\u6237\u540D spring.datasource.test2.username=root ##\u6570\u636E\u5E93\u5BC6\u7801 spring.datasource.test2.password=root ##\u6570\u636E\u5E93\u9A71\u52A8 spring.datasource.test2.driver-class-name=com.mysql.jdbc.Driver #spring.datasource.url=jdbc:mysql://101.200.42.195:3306/test?characterEncoding=utf8&useSSL=false ###\u6570\u636E\u5E93\u7528\u6237\u540D #spring.datasource.username=root ###\u6570\u636E\u5E93\u5BC6\u7801 #spring.datasource.password=root ###\u6570\u636E\u5E93\u9A71\u52A8 #spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.configuration.map-underscore-to-camel-case=true
mapper/
datasource2/HouseMapper.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.springboot.mapper.datasource2.HouseMap"> <select id="getAllHouse" resultType="com.springboot.entity.datasource2.House"> select * from house; </select> </mapper>
datasource/CityMapper.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.springboot.mapper.datasource.CityMap"> <select id="getAllCity" resultType="com.springboot.entity.datasource.City"> select * from City; </select> </mapper>
src/main/java/com/springboot
Chapter452Application.java
package com.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication //@MapperScan("com.springboot.mapper") public class Chapter452Application { public static void main(String[] args) { SpringApplication.run(Chapter452Application.class, args); } }
entity/
datasource/City.java
package com.springboot.entity.datasource; public class City { private int cityId; private String cityName; private String cityIntroduce; }
datasource2/House.java
package com.springboot.entity.datasource2; public class House { private int houseId; private String houseName; private String houseIntroduce; }
config/
DataSourceConfig.java
package com.springboot.config; import org.springframework.beans.factory.annotation.Qualifier; 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; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; @Configuration public class DataSourceConfig { @Bean(name = "testDataSource") @Qualifier("testDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.test") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "test2DataSource") @Qualifier("test2DataSource") @ConfigurationProperties(prefix="spring.datasource.test2") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }
Test2DataSourceConfig.java
package com.springboot.config; 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.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = "com.springboot.mapper.datasource2", sqlSessionTemplateRef = "sqlSessionTemplateSecondary") public class Test2DataSourceConfig { @Bean(name = "sqlSessionFactorySecondary") public SqlSessionFactory masterSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/datasource2/*.xml")); return bean.getObject(); } @Bean(name = "transactionManagerSecondary") public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplateSecondary") public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("sqlSessionFactorySecondary") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean @ConfigurationProperties(prefix = "mybatis.configuration") public org.apache.ibatis.session.Configuration configuration(){ return new org.apache.ibatis.session.Configuration(); } }
TestDataSourceConfig.java
package com.springboot.config; 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.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; 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 @MapperScan(basePackages = "com.springboot.mapper.datasource", sqlSessionTemplateRef = "sqlSessionTemplatePrimary") public class TestDataSourceConfig { @Bean(name = "sqlSessionFactoryPrimary") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //如果使用xml寫SQL的話在這裡配置 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/datasource/*.xml")); // 配置駝峰 bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true); return bean.getObject(); } @Bean(name = "transactionManagerPrimary") @Primary public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("testDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplatePrimary") @Primary public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("sqlSessionFactoryPrimary") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
controller/
TestController.java
package com.springboot.controller; import com.springboot.entity.datasource.City; import com.springboot.entity.datasource2.House; import com.springboot.service.CityService; import com.springboot.service.HouseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController public class TestController { @Autowired private CityService cityService; @Autowired private HouseService houseService; @GetMapping("/testDataSource") public Map testDataSource() { Map map = new HashMap(); List<City> cityList = cityService.getAllCitys(); List<House> houseList = houseService.getAllHouse(); map.put("cityList", cityList); map.put("houseList",houseList); return map; } }
service
CityService.java
package com.springboot.service; import com.springboot.entity.datasource.City; import com.springboot.mapper.datasource.CityMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class CityService { @Autowired private CityMap cityMap; public List<City> getAllCitys(){ return cityMap.getAllCity(); } }
HouseService.java
package com.springboot.service; import com.springboot.entity.datasource2.House; import com.springboot.mapper.datasource2.HouseMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class HouseService { @Autowired private HouseMap houseMap; public List<House> getAllHouse(){ return houseMap.getAllHouse(); } }
mapper
datasource/CityMap.java
package com.springboot.mapper.datasource; import com.springboot.entity.datasource.City; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface CityMap { List<City> getAllCity(); }
datasource2/HouseMap.java
package com.springboot.mapper.datasource2; import com.springboot.entity.datasource2.House; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface HouseMap { List<House> getAllHouse(); }