1. 程式人生 > >MyBatis初級實戰之二:增刪改查

MyBatis初級實戰之二:增刪改查

### 歡迎訪問我的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