MyBatis初級實戰之二:增刪改查
阿新 • • 發佈:2021-01-18
### 歡迎訪問我的GitHub
[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos)
內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
本文是《MyBatis初級實戰》系列的第二篇,通過前文我們知道了如何在SpringBoot中整合MyBatis,本篇就一起來練習基本功:增刪改查;
### 本篇概覽
本篇要練習的內容如下:
1. 單表的增刪改查
2. 批量新增
3. 聯表查詢
全文由以下部分組成:
1. 新建工程
2. 增加啟動類
3. 增加swagger的配置類,工程包含了swagger,以便稍後在瀏覽器上驗證
4. 增加配置檔案
5. 增加實體類
6. 增加mapper配置檔案
7. 增加mapper介面
8. 增加service,呼叫mapper介面
9. 增加controller,呼叫service服務
10. 編寫單元測試用例
11. 驗證
### 原始碼下載
1. 如果您不想編碼,可以在GitHub下載所有原始碼,地址和連結資訊如下表所示(https://github.com/zq2599/blog_demos):
| 名稱 | 連結 | 備註|
| :-------- | :----| :----|
| 專案主頁| https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 |
| git倉庫地址(https)| https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 |
| git倉庫地址(ssh)| [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
2. 這個git專案中有多個資料夾,本章的應用在mybatis資料夾下,如下圖紅框所示:
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210118082315694-720718018.png)
### 開發
1. 本文的實戰使用的資料庫和表結構與前文[《MyBatis初級實戰之一:Spring Boot整合》](https://blog.csdn.net/boling_cavalry/article/details/107805840)一模一樣;
2. 前文[《MyBatis初級實戰之一:Spring Boot整合》](https://blog.csdn.net/boling_cavalry/article/details/107805840)新建了父工程mybatis,本文繼續在此工程中新增子工程,名為curd,整個子工程檔案結構如下:
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210118082316311-1145483818.png)
3. 修改父工程mybatis的pom.xml,在dependencyManagement節點下新增兩個dependency節點,如下所示,這麼做是為了統一管理依賴庫的版本:
```xml
```
4. 名為curd子工程,其pom.xml內容如下:
```xml
```
5. 增加啟動類,注意要用MapperScan註釋來指定mapper介面程式碼的包路徑:
```java
package com.bolingcavalry.curd;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.bolingcavalry.curd.mapper")
public class CurdApplication {
public static void main(String[] args) {
SpringApplication.run(CurdApplication.class, args);
}
}
```
6. 本次實戰用到了swagger,這樣可以很方便的通過瀏覽器向各個controller介面傳送請求,以下是配置類:
```java
package com.bolingcavalry.curd;
import springfox.documentation.service.Contact;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Tag;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.tags(new Tag("UserController", "使用者服務"), new Tag("LogController", "日誌服務"))
.select()
// 當前包路徑
.apis(RequestHandlerSelectors.basePackage("com.bolingcavalry.curd.controller"))
.paths(PathSelectors.any())
.build();
}
//構建 api文件的詳細資訊函式,注意這裡的註解引用的是哪個
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//頁面標題
.title("MyBatis CURD操作")
//建立人
.contact(new Contact("程式設計師欣宸", "https://github.com/zq2599/blog_demos", "[email protected]"))
//版本號
.version("1.0")
//描述
.description("API 描述")
.build();
}
}
```
7. application.yml內容如下:
```yml
server:
port: 8080
spring:
# 資料來源
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.50.43:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis配置
mybatis:
# 配置檔案所在位置
config-location: classpath:mybatis-config.xml
# 對映檔案所在位置
mapper-locations: classpath:mappers/*Mapper.xml
# 日誌配置
logging:
level:
root: INFO
com:
bolingcavalry:
curd:
mapper: debug
```
6. 增加user表的實體類User.java,裡面帶有swagger的註解,方便在swagger頁面展示:
```java
package com.bolingcavalry.curd.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = "使用者實體類")
public class User {
@ApiModelProperty(value = "使用者ID")
private Integer id;
@ApiModelProperty(value = "使用者名稱", required = true)
private String name;
@ApiModelProperty(value = "使用者地址", required = false)
private Integer age;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
// 省去get和set方法,請您自行補齊
}
```
8. 增加log表的實體類Log.java,裡面帶有swagger的註解,方便在swagger頁面展示:
```java
package com.bolingcavalry.curd.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.sql.Date;
/**
* @Description: 實體類
* @author: willzhao E-mail: [email protected]
* @date: 2020/8/4 8:24
*/
@ApiModel(description = "日誌實體類")
public class Log {
@ApiModelProperty(value = "日誌ID")
private Integer id;
@ApiModelProperty(value = "使用者ID")
private Integer userId;
@ApiModelProperty(value = "日誌內容")
private String action;
@ApiModelProperty(value = "建立時間")
private Date createTime;
@Override
public String toString() {
return "Log{" +
"id=" + id +
", userId=" + userId +
", action='" + action + '\'' +
", createTime=" + createTime +
'}';
}
// 省去get和set方法,請您自行補齊
}
```
9. 為聯表查詢的結果準備一個bean,名為LogExtend.java,繼承自Log.java,自己只有個userName欄位,對應聯表查詢user表的name欄位:
```java
package com.bolingcavalry.curd.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = "日誌實體類(含使用者表的欄位)")
public class LogExtend extends Log {
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@ApiModelProperty(value = "使用者名稱")
private String userName;
@Override
public String toString() {
return "LogExtend{" +
"id=" + getId() +
", userId=" + getUserId() +
", userName='" + getUserName() + '\'' +
", action='" + getAction() + '\'' +
", createTime=" + getCreateTime() +
'}';
}
}
```
10. 增加user表的mapper對映檔案,可見都是些很簡單sql,要注意的是批量新增的節點,這裡面用到了foreach語法,可以通過集合動態生成sql:
```xml
```
11. 增加log表的mapper對映檔案,如下所示,請關注聯表操作selExtend,其結果是logExtendResultMap:
```xml
```
12. 增加使用者表的mapper介面類UserMapper.java ,對應著對映檔案中的sql節點的id:
```java
package com.bolingcavalry.curd.mapper;
import com.bolingcavalry.curd.entity.LogExtend;
import com.bolingcavalry.curd.entity.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserMapper {
User sel(int id);
int insertWithFields(User user);
int insertBa