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 的多數據源配置與驗證。