【Java】SpringBootで複数のデータソースを統合 JdbcTemplate、Mybatis、Jpa

SpringBoot は JdbcTemplate の複数のデータソースを統合します

ポンポン

<!--        引入阿里的数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>

アプリケーションのプロパティ

#快捷键alt拉动一列添加one,此时自动配置失效
#数据源one
spring.datasource.one.url=jdbc:mysql://localhost:3306/db_jdbctemplate
spring.datasource.one.username=root
spring.datasource.one.password=rootroot
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
#数据源two
spring.datasource.two.url=jdbc:mysql://localhost:3306/db_jdbctemplate2
spring.datasource.two.username=root
spring.datasource.two.password=rootroot
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
  • 構成

DataSourceConfig.java

package com.bennyrhys.jdbctemplate2.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * 指定配置文件对应的不同数据源
 */
@Configuration
public class DataSourceConfig {
    
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne(){
    
    
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo(){
    
    
        return DruidDataSourceBuilder.create().build();
    }
}

JdbcTemplateConfig.java

package com.bennyrhys.jdbctemplate2.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class JdbcTemplateConfig {
    
    
    //@Qualifier("dsOne")指明要注入的bean,后面的参数名无所谓
    @Bean
    JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dsOne){
    
    
        return new JdbcTemplate(dsOne);
    }
    @Bean
    JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dsTwo){
    
    
        return new JdbcTemplate(dsTwo);
    }
}
public class User {
    
    
    private Integer id;
    private String username;
    private String address;
  • テスト
package com.bennyrhys.jdbctemplate2;

import com.bennyrhys.jdbctemplate2.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
class  Jdbctemplate2ApplicationTests {
    
    
    @Autowired //是按照类型查找的,但现在有两个template类型(会报错,需要结合)
    @Qualifier("jdbcTemplateOne")
    JdbcTemplate jdbcTemplateOne;

    @Resource(name = "jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;

    @Test
    void contextLoads() {
    
    
        List<User> list1 = jdbcTemplateOne.query("select * from user", new BeanPropertyRowMapper<>(User.class));
        System.out.println(list1);
        List<User> list2 = jdbcTemplateTwo.query("select * from user", new BeanPropertyRowMapper<>(User.class));
        System.out.println(list2);

    }

}

コンソール出力:

[ユーザー{id=2, ユーザー名='bennyrhys', アドレス='jilin'}, ユーザー{id=3, ユーザー名='ベニーリズ', アドレス='lanzou'}] 2020-01-19 22:39:03.408
情報6114 — [メイン] com.alibaba.druid.pool.DruidDataSource : {dataSource-2} が開始されました
[ユーザー{id=1, ユーザー名='zhangsan', アドレス='通化'}]

SpringBoot は Mybatis の複数のデータソースを統合します

現在ではほとんど使用されず、通常はミドルウェア MyCat 統合または jdbctemplate の相同性を使用します。

pom.xml

<!--修改版本信息-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>8.0.16</version>
        </dependency>
<!--        引入阿里数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

アプリケーションのプロパティ

#数据源1
spring.datasource.one.url=jdbc:mysql://localhost:3306/db_jdbctemplate
spring.datasource.one.username=root
spring.datasource.one.password=rootroot
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
#数据源2
spring.datasource.two.url=jdbc:mysql://localhost:3306/db_jdbctemplate2
spring.datasource.two.username=root
spring.datasource.two.password=rootroot
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

com.bennyrhys.mybatis2.bean.User

public class User {
    
        private Integer id;    private String username;    private String address;
  • 構成

DataSourceConfig.java

package com.bennyrhys.mybatis2.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/** * 数据源的配置 */@Configurationpublic class DataSourceConfig {
    
        @Bean    @ConfigurationProperties(prefix = "spring.datasource.one")    DataSource dsOne(){
    
            return DruidDataSourceBuilder.create().build();    }    @Bean    @ConfigurationProperties(prefix = "spring.datasource.two")    DataSource dsTwo(){
    
            return DruidDataSourceBuilder.create().build();    }}

MyBatisConfigOne.java

package com.bennyrhys.mybatis2.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.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;import javax.sql.DataSource;@Configuration@MapperScan(basePackages = "com.bennyrhys.mybatis2.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sessionTemplate1")public class MyBatisConfigOne {
    
        @Resource(name = "dsOne")    DataSource dsOne;    @Bean    SqlSessionFactory sqlSessionFactory1(){
    
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();        try {
    
                bean.setDataSource(dsOne);            return bean.getObject();        } catch (Exception e) {
    
                e.printStackTrace();        }        return null;    }    @Bean    SqlSessionTemplate sessionTemplate1(){
    
            SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1());        return template;    }}

MyBatisConfigTwo.java

package com.bennyrhys.mybatis2.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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.bennyrhys.mybatis2.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sessionTemplate2")
public class MyBatisConfigTwo {
    
    
    @Resource(name = "dsTwo")
    DataSource dsTwo;

    @Bean
    SqlSessionFactory sqlSessionFactory2(){
    
    
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        try {
    
    
            bean.setDataSource(dsTwo);
            return bean.getObject();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
    @Bean
    SqlSessionTemplate sessionTemplate2(){
    
    
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2());
        return template;
    }

}
  • フォルダ1

UserMapper1.java

package com.bennyrhys.mybatis2.mapper1;

import com.bennyrhys.mybatis2.bean.User;

import java.util.List;

public interface UserMapper1 {
    
    
    List<User> getAllUsers();
}

UserMapper1.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.bennyrhys.mybatis2.mapper1.UserMapper1">    <select id="getAllUsers" resultType="com.bennyrhys.mybatis2.bean.User">        select * from user;    </select></mapper>
  • マッパー2

ユーザーマッパー2

package com.bennyrhys.mybatis2.mapper2;

import com.bennyrhys.mybatis2.bean.User;

import java.util.List;

public interface UserMapper2 {
    
    
    List<User> getAllUser();
}

UserMapper2.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.bennyrhys.mybatis2.mapper2.UserMapper2">
    <select id="getAllUser" resultType="com.bennyrhys.mybatis2.bean.User">
        select * from user;
    </select>
</mapper>

Pom.xml のアクセス パスの変更

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes><include>**/*.xml</include></includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>

テスト

package com.bennyrhys.mybatis2;

import com.bennyrhys.mybatis2.bean.User;
import com.bennyrhys.mybatis2.mapper1.UserMapper1;
import com.bennyrhys.mybatis2.mapper2.UserMapper2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class Mybatis2ApplicationTests {
    
    
    @Autowired
    UserMapper1 userMapper1;
    @Autowired
    UserMapper2 userMapper2;

//记得启动之前,要声明mapper.xml位置,pom中定义

    /**
     * [User{id=2, username='bennyrhys', address='jilin'}, User{id=3, username='bennyrhys', address='lanzou'}]
     * 2020-01-20 13:30:35.558  INFO 1927 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-2} inited
     * [User{id=1, username='zhangsan', address='通化'}]
      */
    @Test
    void contextLoads() {
    
    
        List<User> list1 = userMapper1.getAllUsers();
        System.out.println(list1);

        List<User> list2 = userMapper2.getAllUser();
        System.out.println(list2);
    }

}

SpringBootはJPAの複数のデータソースを統合します

テンプレート選択 Web、mysql ドライバー、jpa

pom.xml

<!--修改mysql版本-->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <scope>runtime</scope>            <version>8.0.16</version>        </dependency><!--        添加阿里数据源-->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid-spring-boot-starter</artifactId>            <version>1.1.10</version>        </dependency>

アプリケーションのプロパティ

#配置数据源spring.datasource.one.url=jdbc:mysql://localhost:3306/db_jdbctemplatespring.datasource.one.username=rootspring.datasource.one.password=rootrootspring.datasource.one.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.two.url=jdbc:mysql://localhost:3306/db_jdbctemplate2spring.datasource.two.username=rootspring.datasource.two.password=rootrootspring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource#配置jpa,前面配置定义了propertiesspring.jpa.properties.show-sql=truespring.jpa.properties.hibernate.ddl-auto=updatespring.jpa.properties.database=mysqlspring.jpa.properties.database-platform=mysqlspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

@Entity(name = "t_book")public class Book {
    
        @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    private String name;    private String author;
  • 構成

データソース構成

package com.bennyrhys.jpa2.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;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 javax.sql.DataSource;@Configurationpublic class DataSourceConfig {
    
        @Bean    @Primary //优先使用,特色    @ConfigurationProperties(prefix = "spring.datasource.one")    DataSource dsOne(){        return  DruidDataSourceBuilder.create().build();    }    @Bean    @ConfigurationProperties(prefix = "spring.datasource.two")    DataSource dsTwo(){        return  DruidDataSourceBuilder.create().build();    }}

JPAConfig1

package com.bennyrhys.jpa2.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
//JPA相关扫描dao
@EnableJpaRepositories(basePackages = "com.bennyrhys.jpa2.dao1",
        entityManagerFactoryRef = "localContainerEntityManagerFactoryBean1",
        transactionManagerRef = "platformTransactionManager1")
public class JpaConfig1 {
    
    
    @Autowired
    @Qualifier("dsOne")
    DataSource dsOne;

    @Autowired  //加载properties的jpa
    JpaProperties jpaProperties;

    @Bean
    @Primary //多实例,优先使用
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean1(EntityManagerFactoryBuilder builder){
    
    
        return builder.dataSource(dsOne)
                .properties(jpaProperties.getProperties())
                .persistenceUnit("pu1")
                .packages("com.bennyrhys.jpa2.bean")
                .build();
    }
//    事务
    @Bean
    PlatformTransactionManager platformTransactionManager1(EntityManagerFactoryBuilder builder){
    
    
        return new JpaTransactionManager(localContainerEntityManagerFactoryBean1(builder).getObject());
    }
}

JPAConfig2

package com.bennyrhys.jpa2.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
//JPA相关扫描dao
@EnableJpaRepositories(basePackages = "com.bennyrhys.jpa2.dao2",
        entityManagerFactoryRef = "localContainerEntityManagerFactoryBean2",
        transactionManagerRef = "platformTransactionManager2")
public class JpaConfig2 {
    
    
    @Autowired
    @Qualifier("dsTwo")
    DataSource dsTwo;

    @Autowired  //加载properties的jpa
    JpaProperties jpaProperties;

    @Bean
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean2(EntityManagerFactoryBuilder builder){
    
    
        return builder.dataSource(dsTwo)
                .properties(jpaProperties.getProperties())
                .persistenceUnit("pu2")
                .packages("com.bennyrhys.jpa2.bean")
                .build();
    }
//    事务
    @Bean
    PlatformTransactionManager platformTransactionManager2(EntityManagerFactoryBuilder builder){
    
    
        return new JpaTransactionManager(localContainerEntityManagerFactoryBean2(builder).getObject());
    }
}
  • ナイフ1

BookDao1

package com.bennyrhys.jpa2.dao1;

import com.bennyrhys.jpa2.bean.Book;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BookDao1 extends JpaRepository<Book,Integer> {
    
    
}
  • だお2

BookDao2

package com.bennyrhys.jpa2.dao2;

import com.bennyrhys.jpa2.bean.Book;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BookDao2 extends JpaRepository<Book,Integer> {
    
    
}

テスト

package com.bennyrhys.jpa2;

import com.bennyrhys.jpa2.bean.Book;
import com.bennyrhys.jpa2.dao1.BookDao1;
import com.bennyrhys.jpa2.dao2.BookDao2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class Jpa2ApplicationTests {
    
    
    @Autowired
    BookDao1 dao1;
    @Autowired
    BookDao2 dao2;

    @Test
    void contextLoads() {
    
    
        List<Book> all = dao1.findAll();
        System.out.println(all);
        List<Book> all1 = dao2.findAll();
        System.out.println(all1);
    }

}

おすすめ

転載: blog.csdn.net/weixin_43469680/article/details/121622800
おすすめ