Spring Boot + MyBatis 實現多數據源配置

1:創建兩個數據庫和 users 用戶表

開始,我們首先創建兩個數據庫 test1 test2 .

# 創建數據庫
# create database <數據庫名>

create database test1
# 創建數據庫
# create database <數據庫名>

create database test2

接下來,我們創建兩個表,創建表的方法如下。

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `userName` varchar(32) DEFAULT NULL COMMENT '用戶名',
  `passWord` varchar(32) DEFAULT NULL COMMENT '密碼',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

 2:添加依賴

只需將清單 1 的內容添加到 pom.xml.

 

清單 1:

		<!-- MyBatis相關操作 -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>

		<!-- MySql數據庫連接包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

 3:配置數據源

將清單 2 的內容放入到 application.properties

 

清單 2:

# Mybatis 操作
mybatis.type-aliases-package=com.example.Hello.model

spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
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?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver

可以看出,我們在這裏配置了兩個數據源,它們可以操作兩個不同的數據庫和數據表。隨着併發的增加,可以有效地減輕單個數據庫的壓力。

完成後,創建兩個文件並添加清單 3 清單 4 的內容。

 

清單 3:(com.example.Hello.datasource)

@Configuration
@MapperScan(basePackages = "com.example.Hello.mapper.test1", sqlSessionTemplateRef  = "test1SqlSessionTemplate")
public class DataSource1Config {

    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "test1SqlSessionFactory")
    @Primary
    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) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

 

清單 4: (com.example.Hello.datasource)

@Configuration
@MapperScan(basePackages = "com.example.Hello.mapper.test2", sqlSessionTemplateRef  = "test2SqlSessionTemplate")
public class DataSource2Config {

    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")

    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "test2SqlSessionFactory")

    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) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

因爲我們有多個數據源,所以這裏配置了多個數據源,其中 @Primary 代表默認數據源,並且多個數據源必須至少具有一個數據源方法來一次配置此註釋,否則將報告錯誤。

4:創建用戶類

 

清單 5:(com.example.Hello.model)

public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private String userName;
    private String passWord;

    public User() {
        super();
    }

    public User(String userName, String passWord, UserSexEnum userSex) {
        super();
        this.passWord = passWord;
        this.userName = userName;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "userName " + this.userName + ", pasword " + this.passWord;
    }
}

5:創建 Mapper

清單 6:(com.example.Hello.mapper.test1)

@Mapper
@Service
public interface User1Mapper {
    @Select("SELECT * FROM users")
    @Results({
            @Result(property = "userName",  column = "userName"),
            @Result(property = "passWord", column = "passWord")
    })
    List<User> getAll();

    @Select("SELECT * FROM users WHERE id = #{id}")
    @Results({
            @Result(property = "userName",  column = "userName"),
            @Result(property = "passWord", column = "passWord")
    })
    User getOne(Long id);

    @Insert("INSERT INTO users(userName,passWord) VALUES(#{userName}, #{passWord})")
    void insert(User user);

    @Update("UPDATE users SET userName=#{userName}, WHERE id =#{id}")
    void update(User user);

    @Delete("DELETE FROM users WHERE id =#{id}")
    void delete(Long id);

}

因爲我們已經配置了多個數據源,所以所有的Mapper都寫在這裏,我們在這裏使用 User1Mapper 和 User2Mapper ,除類名外,其他幾乎相同。您可以自己創建一個User2Mapper類。

讓我們首先看一下 @Results 批註的用法。

 

當數據庫數據庫名稱與對應於實體類的屬性名稱相鄰時,可以使用 @Results 映射進行對應。column 爲數據庫字段名,porperty 是實體類的屬性名稱,jdbcType 是數據庫磁盤數據類型,而 id 表示是否爲主鍵(true/false)。

舉個例子:

比如某個實體類變量稱爲cityname,而數據庫的名稱屬於city_name。爲了對應它們,我們可以編寫@Result(property =“ cityname”,column=“ city_name”)。

6:Controller

 

接下來,我們編寫控制器。

我們首先使用數據源之一進行存儲操作。

清單 7:(com.example.Hello.web)

@RestController
public class UserController2 {

    @Autowired
    private User1Mapper user1Mapper;

    @RequestMapping("/insert")
    public void insert(){
        User user = new User();
        user.setUserName("劉金帥");
        user.setPassWord("123456789");
        user1Mapper.insert(user);
    }

}

 

上面,我們執行了存儲操作。瀏覽器輸入:localhost:8080/insert

執行後,我們查詢數據庫。

然後,我們的數據已保存到數據庫。

接下來,將第二個數據源用於保存操作。

清單 8:(com.example.Hello.web)

@RestController
public class UserController2 {

    @Autowired
    private User1Mapper user1Mapper;

    @Autowired
    private User2Mapper user2Mapper;


    @RequestMapping("/insert")
    public void insert(){
        User user = new User();
        user.setUserName("劉金帥");
        user.setPassWord("123456789");
        user1Mapper.insert(user);
    }

    @RequestMapping("/insert2")
    public void insert2(){
        User user = new User();
        user.setUserName("劉金帥");
        user.setPassWord("88888888");
        user2Mapper.insert(user);
    }

}

 

瀏覽器輸入:localhost:8080/insert2

執行後,我們查詢數據庫。 

可以發現數據已經保存。

執行查詢操作。

清單 9 :(com.example.Hello.web)

    @RequestMapping(value="/getUseres/{id}")
    public User getUser(@PathVariable("id") Long id) {
        User user=user2Mapper.getOne(id);
        return user;
    }

 瀏覽器輸入:localhost:8080/getUseres/28

其中,@PathVariable 能夠識別 URL 裏面的一個模板。

與 @PathVariable 不同的是,@RequestParam 是從請求中拿取值。

清單 10:(com.example.Hello.web)

    @RequestMapping("/getUseres2/28")
    public User getUser2(@RequestParam(value="id") Long id) {
        User user=user2Mapper.getOne(id);
        return user;
    }

瀏覽器輸入:localhost:8080/getUseres2/28?id=28

 

在這裏,我們已經完成了 Spring Boot 和 MyBatis 的多數據源配置與驗證。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章