SpringBoot学习笔记(二)——配置多数据源

Springboot2.0版本 

1. application.properties

spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.test1.username=root
spring.datasource.test1.password=root
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver

2.主数据源DataSource1Config 配置,其中@Primary表示主数据源

package com.study.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.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

//配置扫描的包
@Configuration
@MapperScan(basePackages= {"com.study.mapper.test01"},sqlSessionFactoryRef="test1SqlSessionFactory")
public class DataSource1Config {
    @Bean(name="test1DataSource")//注入到这个容器
    @ConfigurationProperties(prefix="spring.datasource.test1")//表示取application.properties配置文件中的前缀
    @Primary
    //primary是设置优先,因为有多个数据源,在没有明确指定用哪个的情况下,会用带有primary的,这个注解必须有一个数据源要添加
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name="test1SqlSessionFactory")
    @Primary

    //@Qualifier("xxx")的含义是告诉他使用哪个DataSource
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
    @Bean(name="test1TransactionManager")//配置事务
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean(name="test1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

2.DataSource2Config,DataSource2Config和DataSource1Config的区别就在于@Primary

package com.study.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.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
//配置mapper所在的包
@MapperScan(basePackages= {"com.study.mapper.test02"},sqlSessionFactoryRef="test2SqlSessionFactory")
public class DataSource2Config {
    @Bean(name="test2DataSource")//注入到这个容器
    @ConfigurationProperties(prefix="spring.datasource.test2")//表示取application.properties配置文件中的前缀
    //primary是设置优先,因为有多个数据源,在没有明确指定用哪个的情况下,会用带有primary的,这个注解必须有一个数据源要添加
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name="test2SqlSessionFactory")
    //@Qualifier("xxx")的含义是告诉他使用哪个DataSource
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
    @Bean(name="test2TransactionManager")//配置事务
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean(name="test2SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3.在test01和test02包下分别建对应的mapper类

UserMapper2.java

package com.study.mapper.test02;

import com.study.Entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper2 {
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") Integer id);

    @Insert("insert into User(name,sex) values(#{name},#{sex})")
    void insertUser(@Param("name") String name,@Param("sex") String sex);
}

UserMapper1.java

import com.study.Entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper1 {
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") Integer id);

    @Insert("insert into User(name,sex) values(#{name},#{sex})")
    void insertUser(@Param("name") String name,@Param("sex") String sex);
}

4.Controller

package com.study.controller;

import com.study.Entity.User;
import com.study.mapper.test01.UserMapper1;
import com.study.mapper.test02.UserMapper2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    private UserMapper1 userMapper1;
    @Autowired
    private UserMapper2 userMapper2;
    @GetMapping("/getUser1")
    public User getUser1() {
        return userMapper1.getUserById(1);
    }

    @GetMapping("/getUser2")
    public User getUser2() {
        return userMapper2.getUserById(1);
    }
}

此处需要格外注意 

(1)单数据源是spring.datasource.url=jdbc:mysql://localhost:part/test?characterEncoding=utf-8,1.0.x多数据源版本也是url

(2)Springboot2.0版本是jdbc-ur

我之前写成了url,然后报错:

java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.

 


版权声明:本文为qq_31970227原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。