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 的多数据源配置与验证。