1. 程式人生 > >MyBatis初級實戰之一:Spring Boot整合

MyBatis初級實戰之一:Spring Boot整合

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ### MyBatis初級實戰 《MyBatis初級實戰》系列旨在通過一系列編碼實戰,和讀者一起掌握MyBatis的基本用法,幫助初學者快速運用MyBatis參與實際開發; ### 聚焦MyBatis 《MyBatis初級實戰》面向的是對MyBatis有興趣的讀者,向讀者們提供可用的方案和程式碼,這裡不是比較Hibernate、sqltoy-orm的地方,作者也十分認可這些ORM框架,但《MyBatis初級實戰》不參與比較; ### 關於MyBatis 引自官方:MyBatis 是一款優秀的持久層框架,它支援自定義 SQL、儲存過程以及高階對映。MyBatis 免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。 ### 實戰環境 《MyBatis初級實戰》系列的環境資訊如下: 1. JDK:1.8.0_181 2. mybatis-spring-boot-starter:2.1.3(對應的MyBatis:3.5.5) 3. Spring Boot:2.3.2.RELEASE 4. MySQL:5.7.29 5. 實戰環境:win10 6. 開發工具:IntelliJ IDEA 2019.2.1 (Ultimate Edition) ### Spring Boot整合MyBatis常規步驟概覽 Spring Boot整合MyBatis的常規步驟如下: 1. maven中新增mybatis-spring-boot-starter的依賴; 2. Spring Boot的配置中指定MyBatis配置檔案的位置; 3. Spring Boot的配置中指定MyBatis對映檔案的位置; 4. 新增MyBatis配置檔案,後續MyBatis的常規配置集中在此; 5. 對映檔案xxxMapper.xml及其對應的介面檔案; 6. 業務程式碼中,Autowired註解修飾介面檔案並使用; - 接下來開始實戰,咱們先把資料準備好; ### 準備資料 1. 請您自行準備好MySQL服務,我這邊MySQL是部署在docker上的,可以參考[《群暉DS218+部署mysql》](https://blog.csdn.net/boling_cavalry/article/details/105460567); 2. 建立名為mybatis的資料庫; 3. 在mybatis資料庫下執行以下SQL,即可建立本次實戰所需資料: ```shell USE mybatis; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(32) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `age` int(32) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `log`; CREATE TABLE `log` ( `id` int(32) NOT NULL AUTO_INCREMENT, `user_id` int(32), `action` varchar(255) NOT NULL, `create_time` datetime not null, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO mybatis.user (id, name, age) VALUES (3, 'tom', 11); INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (3, 3, 'read book', '2020-08-07 08:18:16'); ``` ### 原始碼下載 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-20210115075624880-1773120229.png) ### 關於父子工程 為了整個系列的程式碼好管理,我這邊用maven建立的是父子工程,如果您只要子工程,不需要父子結構,要對子工程的pom.xml做以下調整: 1. parent節點原本如下: ```xml ``` 請替換成以下內容(也就是直接用>spring-boot-starter-parent作為父工程): ```xml ``` 2. 子工程種的dependency節點中沒有version子節點,這些都放在父工程的dependencyManagement中統一管理了,請您將version新增到子工程的各個dependency節點: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075625285-403251202.png) - 接下來開始編碼 ### 建立父工程 建立名為mybatis的maven工程,pom.xml內容如下: ```xml ``` - 至此,準備工作算是全部完成了,接下來咱們開始建立一個典型的Spring Boot整合MyBatis的專案吧; ### Spring Boot整合MyBatis 1. 在父工程mybatis之下新建名為simple的Spring Boot子工程,其pom.xml內容如下: ```xml ``` 2. Spring Boot配置檔案是simple/src/main/resources/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: simple: mapper: debug ``` 3. 新建user表對應的實體類User.java: ```java package com.bolingcavalry.simple.entity; /** * @Description: 實體類 * @author: willzhao E-mail: [email protected] * @date: 2020/8/4 8:24 */ public class User { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } } ``` 4. 新建log表對應的實體類Log.java: ```java package com.bolingcavalry.simple.entity; import java.sql.Date; /** * @Description: 實體類 * @author: willzhao E-mail: [email protected] * @date: 2020/8/4 8:24 */ public class Log { private Integer id; private Integer userId; private String action; private Date createTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getAction() { return action; } public void setAction(String action) { this.action = action; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } @Override public String toString() { return "Log{" + "id=" + id + ", userId=" + userId + ", action='" + action + '\'' + ", createTime=" + createTime + '}'; } } ``` 5. 接下來會新建三個配置檔案,先來看下它們的位置,以免後面放錯地方引起不必要的麻煩: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075625810-1240442995.png) 6. application.yml所在目錄下,新增名為mybatis-config.xml的檔案,這是mybatis的配置檔案,本例很簡單隻有一個配置,內容如下: ```xml ``` 7. resources/mappers目錄下,新增名為UserMapper.xml的檔案,和user表相關的查詢都在此,本文只有一個查詢user表的操作,注意下文中的resultType等於User,這裡沒有寫User類的完整路徑,是因為前面mybatis-config.xml檔案中配置了typeAliases的package節點的緣故: ```xml ``` 8. 再新增LogMapper.xml,如下所示,log表中的user_id欄位在Log.java中沒有同名的欄位,因此要新增resultMap來建立資料庫和實體類的欄位對映關係,再在select節點用上這個關係,注意要用resultMap屬性(UserMapper.xml中用的是resultType): ```xml ``` 9. 接下來是業務要用到的介面檔案,第一個是UserMapper.java: ```java package com.bolingcavalry.simple.mapper; import com.bolingcavalry.simple.entity.User; import org.springframework.stereotype.Repository; @Repository public interface UserMapper { User sel(int id); } ``` 10. 第二個是LogMapper.java: ```java package com.bolingcavalry.simple.mapper; import com.bolingcavalry.simple.entity.Log; import org.springframework.stereotype.Repository; @Repository public interface LogMapper { Log sel(int id); } ``` 11. 上述兩個類都使用了Repository註解,作用是避免在編碼過程中,IDEA給出紅線提示,如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075626670-1402549221.png) 12. 對映配置完畢,接下來就可以在應用中使用了,先為user做一個service類UserService.java,裡面通過Autowired註解注入UserMapper的實現: ```java package com.bolingcavalry.simple.service; import com.bolingcavalry.simple.entity.User; import com.bolingcavalry.simple.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired UserMapper userMapper; public User sel(int id){ return userMapper.sel(id); } } ``` 13. 再為log做service類LogService.java: ```java package com.bolingcavalry.simple.service; import com.bolingcavalry.simple.entity.Log; import com.bolingcavalry.simple.mapper.LogMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class LogService { @Autowired LogMapper logMapper; public Log sel(int id){ return logMapper.sel(id); } } ``` 14. 最後是響應web請求的controller類,第一個是UserController.java: ```java package com.bolingcavalry.simple.controller; import com.bolingcavalry.simple.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("user/{id}") public String GetUser(@PathVariable int id){ return userService.sel(id).toString(); } } ``` 15. 然後是LogController.java: ```java package com.bolingcavalry.simple.controller; import com.bolingcavalry.simple.service.LogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LogController { @Autowired private LogService logService; @RequestMapping("log/{id}") public String log(@PathVariable int id){ return logService.sel(id).toString(); } } ``` 16. 最後是引導類SimpleApplication.java,注意MapperScan註解會自動掃描包路徑下的所有介面,這樣UserMapper和LogMapper就不用加Mapper註解了: ```java package com.bolingcavalry.simple; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.bolingcavalry.simple.mapper") public class SimpleApplication { public static void main(String[] args) { SpringApplication.run(SimpleApplication.class, args); } } ``` - 至此,編碼完成,可以啟動驗證了; ### 驗證 1. 啟動SpringBoot應用的方式有兩種,最簡單的辦法是再IDEA中直接啟動,如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075627204-1088381405.png) 2. 第二種是simple的目錄下執行mvn clean package -U,就會在target目錄得到檔案simple-0.0.1-SNAPSHOT.jar,再執行java -jar simple-0.0.1-SNAPSHOT.jar即可啟動; 3. 在瀏覽器訪問http://localhost:8080/user/3,可以得到user表的查詢結果: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075627419-428758699.png) 4. 訪問http://localhost:8080/log/3,可以得到log表的查詢結果: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075627572-344691280.png) 5. 在控制檯可以看到日誌如下所示,這是我們開發期間除錯問題的重要線索: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202101/485422-20210115075628129-128641281.png) 至此,入門級SpringBoot整合MyBatis的實戰就完成了,接下來的系列內容會有更多實戰,咱們一起來學習和掌握MyBatis的基本用法; ### 你不孤單,欣宸原創一路相伴 1. [Java系列](https://xinchen.blog.csdn.net/article/details/105068742) 2. [Spring系列](https://xinchen.blog.csdn.net/article/details/105086498) 3. [Docker系列](https://xinchen.blog.csdn.net/article/details/105086732) 4. [kubernetes系列](https://xinchen.blog.csdn.net/article/details/105086794) 5. [資料庫+中介軟體系列](https://xinchen.blog.csdn.net/article/details/105086850) 6. [DevOps系列](https://xinchen.blog.csdn.net/article/details/105086920) ### 歡迎關注公眾號:程式設計師欣宸 > 微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界... [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blo