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

执行后,我们查询数据库。

springboot mybatis controller 连接两个数据库 springboot mybatis 多个数据库_spring

然后,我们的数据已保存到数据库。

接下来,将第二个数据源用于保存操作。

清单 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

执行后,我们查询数据库。 

springboot mybatis controller 连接两个数据库 springboot mybatis 多个数据库_java_02

可以发现数据已经保存。

执行查询操作。

清单 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

springboot mybatis controller 连接两个数据库 springboot mybatis 多个数据库_数据库_03

其中,@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

springboot mybatis controller 连接两个数据库 springboot mybatis 多个数据库_mysql_04

 

在这里,我们已经完成了 Spring Boot 和 MyBatis 的多数据源配置与验证。