暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot多数据源

dalaoyang 2018-05-30
656

很多业务场景都需要使用到多数据库,本文介绍springboot对多数据源的使用。

这次先说一下application.properties文件,分别连接了2个数据库test和test1。完整代码如下:

  1. ##端口号

  2. server.port=8888



  3. ##数据库url

  4. spring.datasource.test.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false

  5. ##数据库用户名

  6. spring.datasource.test.username=root

  7. ##数据库密码

  8. spring.datasource.test.password=root

  9. ##数据库驱动

  10. spring.datasource.test.driver-class-name=com.mysql.jdbc.Driver



  11. ##数据库url

  12. spring.datasource.test2.url=jdbc:mysql://localhost:3306/test2?characterEncoding=utf8&useSSL=false

  13. ##数据库用户名

  14. spring.datasource.test2.username=root

  15. ##数据库密码

  16. spring.datasource.test2.password=root

  17. ##数据库驱动

  18. spring.datasource.test2.driver-class-name=com.mysql.jdbc.Driver



  19. spring.jpa.hibernate.ddl-auto=create

  20. ##控制台打印sql

  21. spring.jpa.show-sql=true

复制

然后说一下处理多数据源的DataSourceConfig,其中@ConfigurationProperties注解对应刚才的数据库,而且这个重点是一定要有一个主数据源,并且在上面加上@Primary,代码如下:

  1. package com.dalaoyang.config;


  2. import org.springframework.beans.factory.annotation.Qualifier;

  3. import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

  4. import org.springframework.boot.context.properties.ConfigurationProperties;

  5. import org.springframework.context.annotation.Bean;

  6. import org.springframework.context.annotation.Configuration;

  7. import org.springframework.context.annotation.Primary;


  8. import javax.sql.DataSource;

  9. /**

  10. * @author dalaoyang

  11. * @Description

  12. * @project springboot_learn

  13. * @package com.dalaoyang.config

  14. * @email yangyang@dalaoyang.cn

  15. * @date 2018/4/10

  16. */

  17. @Configuration

  18. public class DataSourceConfig {

  19.    @Bean(name = "testDataSource")

  20.    @Qualifier("testDataSource")

  21.    @ConfigurationProperties(prefix="spring.datasource.test")

  22.    public DataSource primaryDataSource() {

  23.        return DataSourceBuilder.create().build();

  24.    }


  25.    @Bean(name = "test2DataSource")

  26.    @Qualifier("test2DataSource")

  27.    @Primary

  28.    @ConfigurationProperties(prefix="spring.datasource.test2")

  29.    public DataSource secondaryDataSource() {

  30.        return DataSourceBuilder.create().build();

  31.    }

  32. }

复制

接下来是对应test数据库的配置,其中需要说一下的是@EnableJpaRepositories注解里面的basePackages属性对应的是这个数据源对应的repository(因为本文使用的是jpa), @Qualifier注解内的value要和DataSourceConfig的值一致即可。 代码如下:

  1. package com.dalaoyang.config;


  2. import org.springframework.beans.factory.annotation.Autowired;

  3. import org.springframework.beans.factory.annotation.Qualifier;

  4. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;

  5. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;

  6. import org.springframework.context.annotation.Bean;

  7. import org.springframework.context.annotation.Configuration;

  8. import org.springframework.context.annotation.Primary;

  9. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

  10. import org.springframework.orm.jpa.JpaTransactionManager;

  11. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

  12. import org.springframework.transaction.PlatformTransactionManager;

  13. import org.springframework.transaction.annotation.EnableTransactionManagement;


  14. import javax.persistence.EntityManager;

  15. import javax.sql.DataSource;

  16. import java.util.Map;


  17. /**

  18. * @author dalaoyang

  19. * @Description

  20. * @project springboot_learn

  21. * @package com.dalaoyang.config

  22. * @email yangyang@dalaoyang.cn

  23. * @date 2018/4/10

  24. */

  25. @Configuration

  26. @EnableTransactionManagement

  27. @EnableJpaRepositories(

  28.        entityManagerFactoryRef="entityManagerFactoryPrimary",

  29.        transactionManagerRef="transactionManagerPrimary",

  30.        basePackages= { "com.dalaoyang.repository.datasource" })

  31. public class TestDataSourceConfig {

  32.    @Autowired

  33.    @Qualifier("testDataSource")

  34.    private DataSource dataSource;


  35.    @Primary

  36.    @Bean(name = "entityManagerPrimary")

  37.    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {

  38.        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();

  39.    }


  40.    @Primary

  41.    @Bean(name = "entityManagerFactoryPrimary")

  42.    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {

  43.        return builder

  44.                .dataSource(dataSource)

  45.                .properties(getVendorProperties(dataSource))

  46.                .packages("com.dalaoyang.entity.datasource") //设置实体类所在位置

  47.                .persistenceUnit("primaryPersistenceUnit")

  48.                .build();

  49.    }


  50.    @Autowired

  51.    private JpaProperties jpaProperties;


  52.    private Map<String, String> getVendorProperties(DataSource dataSource) {

  53.        return jpaProperties.getHibernateProperties(dataSource);

  54.    }


  55.    @Primary

  56.    @Bean(name = "transactionManagerPrimary")

  57.    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {

  58.        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());

  59.    }

  60. }

复制

Test2DataSourceConfig就不多说了,和TestDataSourceConfig原理一致,代码如下:

  1. package com.dalaoyang.config;



  2. import org.springframework.beans.factory.annotation.Autowired;

  3. import org.springframework.beans.factory.annotation.Qualifier;

  4. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;

  5. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;

  6. import org.springframework.context.annotation.Bean;

  7. import org.springframework.context.annotation.Configuration;

  8. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

  9. import org.springframework.orm.jpa.JpaTransactionManager;

  10. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

  11. import org.springframework.transaction.PlatformTransactionManager;

  12. import org.springframework.transaction.annotation.EnableTransactionManagement;


  13. import javax.persistence.EntityManager;

  14. import javax.sql.DataSource;

  15. import java.util.Map;

  16. /**

  17. * @author dalaoyang

  18. * @Description

  19. * @project springboot_learn

  20. * @package com.dalaoyang.config

  21. * @email yangyang@dalaoyang.cn

  22. * @date 2018/4/10

  23. */

  24. @Configuration

  25. @EnableTransactionManagement

  26. @EnableJpaRepositories(

  27.        entityManagerFactoryRef="entityManagerFactorySecondary",

  28.        transactionManagerRef="transactionManagerSecondary",

  29.        basePackages= { "com.dalaoyang.repository.datasource2" }) //设置Repository所在位置

  30. public class Test2DataSourceConfig {

  31.    @Autowired

  32.    @Qualifier("test2DataSource")

  33.    private DataSource dataSource;


  34.    @Bean(name = "entityManagerSecondary")

  35.    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {

  36.        return entityManagerFactorySecondary(builder).getObject().createEntityManager();

  37.    }


  38.    @Bean(name = "entityManagerFactorySecondary")

  39.    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {

  40.        return builder

  41.                .dataSource(dataSource)

  42.                .properties(getVendorProperties(dataSource))

  43.                .packages("com.dalaoyang.entity.datasource2") //设置实体类所在位置

  44.                .persistenceUnit("secondaryPersistenceUnit")

  45.                .build();

  46.    }


  47.    @Autowired

  48.    private JpaProperties jpaProperties;


  49.    private Map<String, String> getVendorProperties(DataSource dataSource) {

  50.        return jpaProperties.getHibernateProperties(dataSource);

  51.    }


  52.    @Bean(name = "transactionManagerSecondary")

  53.    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {

  54.        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());

  55.    }

  56. }

复制

下面是对应的model和repository

City类

  1. package com.dalaoyang.entity.datasource;


  2. import javax.persistence.*;


  3. /**

  4. * @author dalaoyang

  5. * @Description

  6. * @project springboot_learn

  7. * @package com.dalaoyang.Entity

  8. * @email 397600342@qq.com

  9. * @date 2018/4/7

  10. */

  11. @Entity

  12. @Table(name="city")

  13. public class City {


  14.    @Id

  15.    @GeneratedValue(strategy=GenerationType.AUTO)

  16.    private int cityId;

  17.    private String cityName;

  18.    private String cityIntroduce;


  19.    public City(int cityId, String cityName, String cityIntroduce) {

  20.        this.cityId = cityId;

  21.        this.cityName = cityName;

  22.        this.cityIntroduce = cityIntroduce;

  23.    }


  24.    public City(String cityName, String cityIntroduce) {

  25.        this.cityName = cityName;

  26.        this.cityIntroduce = cityIntroduce;

  27.    }


  28.    public City() {

  29.    }


  30.    public int getCityId() {

  31.        return cityId;

  32.    }


  33.    public void setCityId(int cityId) {

  34.        this.cityId = cityId;

  35.    }


  36.    public String getCityName() {

  37.        return cityName;

  38.    }


  39.    public void setCityName(String cityName) {

  40.        this.cityName = cityName;

  41.    }


  42.    public String getCityIntroduce() {

  43.        return cityIntroduce;

  44.    }


  45.    public void setCityIntroduce(String cityIntroduce) {

  46.        this.cityIntroduce = cityIntroduce;

  47.    }



  48. }

复制

House类

  1. package com.dalaoyang.entity.datasource2;


  2. import javax.persistence.*;


  3. /**

  4. * @author dalaoyang

  5. * @Description

  6. * @project springboot_learn

  7. * @package com.dalaoyang.entity

  8. * @email yangyang@dalaoyang.cn

  9. * @date 2018/4/10

  10. */

  11. @Entity

  12. @Table(name="house")

  13. public class House {


  14.    @Id

  15.    @GeneratedValue(strategy=GenerationType.AUTO)

  16.    private int houseId;

  17.    private String houseName;

  18.    private String houseIntroduce;


  19.    public int getHouseId() {

  20.        return houseId;

  21.    }


  22.    public void setHouseId(int houseId) {

  23.        this.houseId = houseId;

  24.    }


  25.    public String getHouseName() {

  26.        return houseName;

  27.    }


  28.    public void setHouseName(String houseName) {

  29.        this.houseName = houseName;

  30.    }


  31.    public String getHouseIntroduce() {

  32.        return houseIntroduce;

  33.    }


  34.    public void setHouseIntroduce(String houseIntroduce) {

  35.        this.houseIntroduce = houseIntroduce;

  36.    }


  37.    public House(String houseName, String houseIntroduce) {

  38.        this.houseName = houseName;

  39.        this.houseIntroduce = houseIntroduce;

  40.    }

  41. }

复制

CityRepository

  1. package com.dalaoyang.repository.datasource;


  2. import com.dalaoyang.entity.datasource.City;

  3. import org.springframework.data.jpa.repository.JpaRepository;


  4. /**

  5. * @author dalaoyang

  6. * @Description

  7. * @project springboot_learn

  8. * @package com.dalaoyang.Repository

  9. * @email 397600342@qq.com

  10. * @date 2018/4/7

  11. */

  12. public interface CityRepository extends JpaRepository<City,Integer> {

  13. }

复制

HouseRepository

  1. package com.dalaoyang.repository.datasource2;


  2. import com.dalaoyang.entity.datasource2.House;

  3. import org.springframework.data.jpa.repository.JpaRepository;


  4. /**

  5. * @author dalaoyang

  6. * @Description

  7. * @project springboot_learn

  8. * @package com.dalaoyang.repository.datasource2

  9. * @email yangyang@dalaoyang.cn

  10. * @date 2018/4/10

  11. */

  12. public interface HouseRepository extends JpaRepository<House,Integer> {

  13. }

复制

pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4.    <modelVersion>4.0.0</modelVersion>


  5.    <groupId>com.dalaoyang</groupId>

  6.    <artifactId>springboot_datasources</artifactId>

  7.    <version>0.0.1-SNAPSHOT</version>

  8.    <packaging>jar</packaging>


  9.    <name>springboot_datasources</name>

  10.    <description>springboot_datasources</description>


  11.    <parent>

  12.        <groupId>org.springframework.boot</groupId>

  13.        <artifactId>spring-boot-starter-parent</artifactId>

  14.        <version>1.5.9.RELEASE</version>

  15.        <relativePath/> <!-- lookup parent from repository -->

  16.    </parent>


  17.    <properties>

  18.        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  19.        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  20.        <java.version>1.8</java.version>

  21.    </properties>


  22.    <dependencies>

  23.        <dependency>

  24.            <groupId>org.springframework.boot</groupId>

  25.            <artifactId>spring-boot-starter-data-jpa</artifactId>

  26.        </dependency>

  27.        <dependency>

  28.            <groupId>org.springframework.boot</groupId>

  29.            <artifactId>spring-boot-starter-web</artifactId>

  30.        </dependency>


  31.        <dependency>

  32.            <groupId>org.springframework.boot</groupId>

  33.            <artifactId>spring-boot-devtools</artifactId>

  34.            <scope>runtime</scope>

  35.        </dependency>

  36.        <dependency>

  37.            <groupId>mysql</groupId>

  38.            <artifactId>mysql-connector-java</artifactId>

  39.            <scope>runtime</scope>

  40.        </dependency>

  41.        <dependency>

  42.            <groupId>org.springframework.boot</groupId>

  43.            <artifactId>spring-boot-starter-test</artifactId>

  44.            <scope>test</scope>

  45.        </dependency>

  46.    </dependencies>


  47.    <build>

  48.        <plugins>

  49.            <plugin>

  50.                <groupId>org.springframework.boot</groupId>

  51.                <artifactId>spring-boot-maven-plugin</artifactId>

  52.            </plugin>

  53.        </plugins>

  54.    </build>



  55. </project>

复制

因为上面这些都没什么可说的,都是和正常的写法没什么区别,最后是TestController测试类

  1. package com.dalaoyang.controller;


  2. import com.dalaoyang.entity.datasource.City;

  3. import com.dalaoyang.entity.datasource2.House;

  4. import com.dalaoyang.repository.datasource.CityRepository;

  5. import com.dalaoyang.repository.datasource2.HouseRepository;

  6. import org.springframework.beans.factory.annotation.Autowired;

  7. import org.springframework.web.bind.annotation.GetMapping;

  8. import org.springframework.web.bind.annotation.RestController;


  9. /**

  10. * @author dalaoyang

  11. * @Description

  12. * @project springboot_learn

  13. * @package com.dalaoyang.controller

  14. * @email yangyang@dalaoyang.cn

  15. * @date 2018/4/10

  16. */

  17. @RestController

  18. public class TestController {


  19.    @Autowired

  20.    CityRepository cityRepository;


  21.    @Autowired

  22.    HouseRepository houseRepository;


  23.    @GetMapping("/testDataSource")

  24.    public String testDataSource(){

  25.        City city = new City("北京","中国首都");

  26.        cityRepository.save(city);

  27.        return "success";

  28.    }


  29.    @GetMapping("/testDataSource2")

  30.    public String testDataSource2(){

  31.        House house = new House("豪宅","特别大的豪宅");

  32.        houseRepository.save(house);

  33.        return "success";

  34.    }


  35. }

复制

启动项目可以看到test数据库中新建了city表,test2数据库中新建了house表。

源码下载 :大老杨码云

个人网站:https://dalaoyang.cn


文章转载自dalaoyang,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论