1. 程式人生 > >SpringBoot2.0之八 多資料來源配置

SpringBoot2.0之八 多資料來源配置

  在開發的過程中我們可能都會遇到對接公司其他系統等需求,對於外部的系統可以採用介面對接的方式,對於一個公司開發的兩個系統,並且知道相關資料庫結構的情況下,就可以考慮使用多資料來源來解決這個問題。SpringBoot為我們提供了相對簡單的實現。

一、建立如下結構的maven專案
這裡寫圖片描述

二、新增相關資料庫配置資訊

server:
  port: 8080

spring:  
  datasource:
    master:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/test
?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 slaver: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/dev?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456

三、主庫和從庫的相關配置
1、主庫資料來源配置

@Configuration
@MapperScan(basePackages = "com.somta.springboot.dao.master", sqlSessionTemplateRef  = "masterSqlSessionTemplate")
public class MasterDataSourceConfiguration {

    @Value("${spring.datasource.master.driver-class-name}")
    private String driverClassName;

    @Value
("${spring.datasource.master.url}") private String url; @Value("${spring.datasource.master.username}") private String username; @Value("${spring.datasource.master.password}") private String password; @Bean(name = "masterDataSource") @Primary public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(this.driverClassName); dataSource.setUrl(this.url); dataSource.setUsername(this.username); dataSource.setPassword(this.password); return dataSource; } @Bean(name = "masterSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/Mysql_*Mapper.xml")); return bean.getObject(); } @Bean(name = "masterTransactionManager") @Primary public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "masterSqlSessionTemplate") @Primary public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }

2、從庫的資料來源配置資訊

@Configuration
@MapperScan(basePackages = "com.somta.springboot.dao.slaver", sqlSessionTemplateRef  = "slaverSqlSessionTemplate")
public class SlaverDataSourceConfiguration {

    @Value("${spring.datasource.slaver.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.slaver.url}")
    private String url;

    @Value("${spring.datasource.slaver.username}")
    private String username;

    @Value("${spring.datasource.slaver.password}")
    private String password;


    @Bean(name = "slaverDataSource")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(this.driverClassName);
        dataSource.setUrl(this.url);
        dataSource.setUsername(this.username);
        dataSource.setPassword(this.password);
        return dataSource;
    }

    @Bean(name = "slaverSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("slaverDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/slaver/**/Mysql_*Mapper.xml"));
        return bean.getObject();
    }

    @Bean(name = "slaverTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("slaverDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "slaverSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaverSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

  注意在配置資料來源的資訊時,一定要通過@Primary配置一個主庫,對於資料庫配置部分與普通的資料來源配置沒有差異,新建一個DataSource,在建立一個SqlSessionTemplate,最後建立一個SqlSessionTemplate,分別以此注入即可,@MapperScan註解的掃描路徑要分別對於相應的dao層

四、編寫dao層和xml

public interface UserMasterDao {
    int addUser(User user);
    int deleteUserById(Long id);
    int updateUserById(User user);
    User queryUserById(Long id);
    List<User> queryUserList();
}
<?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.somta.springboot.dao.master.UserMasterDao" > 
<!-- Result Map-->
<resultMap id="BaseResultMap" type="com.somta.springboot.pojo.User" >
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
</resultMap>

<!-- th_role_user table all fields -->
<sql id="Base_Column_List" >
    id, name, age
</sql>

<insert id="addUser" parameterType="com.somta.springboot.pojo.User" >
    insert into t_user (id, name, age) 
    values (#{id},#{name},#{age});
</insert>

<delete id="deleteUserById" parameterType="java.lang.Long">
 delete from t_user where id=#{id}
</delete>

<update id="updateUserById" parameterType="com.somta.springboot.pojo.User" >
    update t_user set 
    <trim  suffixOverrides="," >
    <if test="id != null and id != ''">
        id=#{id},
    </if>
    <if test="name != null and name != ''">
        name=#{name},
    </if>
    <if test="age != null and age != ''">
        age=#{age},
    </if>
    </trim> where id=#{id}
</update>

<select id="queryUserById" resultMap="BaseResultMap" parameterType="java.lang.Long">
    select <include refid="Base_Column_List" /> 
    from t_user where id = #{id}
</select>

<select id="queryUserList" resultMap="BaseResultMap">
    select <include refid="Base_Column_List" /> 
    from t_user
</select>

</mapper>   

五、編寫測試類進行測試

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class MultiDatasourceTest {
    @Autowired
    private UserMasterDao masterUserDao;
    @Autowired
    private UserSlaverDao slaverUserDao;
    /**
     * 查詢使用者
     * @throws Exception
     */
    @Test
    public void testQueryUser() throws Exception {
        User masterUser = masterUserDao.queryUserById(1L);
        System.out.println("masterUser==>"+masterUser.getName());

        User slaverUser = slaverUserDao.queryUserById(1L);
        System.out.println("slaverUser==>"+slaverUser.getName());
    }
}

當在控制檯看到如下所示輸出就代表我們的配置已經成功了
這裡寫圖片描述

  本文由明天的地平線創作,如想了解更多更詳細的內容,請關注一下公眾號,公眾號內將進行最新最實時的更新!
二維碼