我是靠谱客的博主 迷你向日葵,最近开发中收集的这篇文章主要介绍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 的多数据源配置与验证。

 

最后

以上就是迷你向日葵为你收集整理的Spring Boot + MyBatis 实现多数据源配置的全部内容,希望文章能够帮你解决Spring Boot + MyBatis 实现多数据源配置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部