Spring面試總結
實驗介紹
1.1 實驗內容
我們將在這一節學習 Spring Boot 如何與 MyBatis 進行整合,並對其進行設定和功能講解,最終實現對於 tb_user 表的增刪改查操作。
1.2 實驗知識點
- mybatis-spring-boot-starter
- MyBatis 配置
- 增刪改查操作
1.3 實驗環境
- JDK 1.8 或者更高版本
- Spring Boot 2.1.0-RELEASE
- Maven 3+
- MySQL
1.4 程式碼獲取
wget https://labfile.oss.aliyuncs.com/courses/1244/lou-springboot-07.zip unzip lou-springboot-07.zip cd lou-springboot
MyBatis 簡介
MyBatis 的前身是 Apache 社群的一個開源專案 iBatis,於 2010 年更名為 MyBatis。MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架,避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集,使得開發人員更加關注 SQL 本身和業務邏輯,不用再去花費時間關注整個複雜的 JDBC 操作過程。
MyBatis 的優點如下:
- 封裝了 JDBC 大部分操作,減少開發人員工作量;
- 相比一些自動化的 ORM 框架,“半自動化”使得開發人員可以自由的編寫 SQL 語句,靈活度更高;
-Java 程式碼與 SQL 語句分離,降低維護難度; - 自動對映結果集,減少重複的編碼工作;
- 開源社群十分活躍,文件齊全,學習成本不高。
雖然前文中已經介紹了 JdbcTemplate 的自動配置及使用,鑑於 MyBatis 框架受眾更廣且後續實踐課程的技術選型包含 MyBatis,因此會在本章節內容中對它做一個詳細的介紹,以及如何使用 Spring Boot 整合 MyBatis 框架對資料層進行功能開發。
mybatis-springboot-starter 介紹
Spring Boot 的核心特性包括簡化配置並快速開發,當我們需要整合某一個功能時,只需要引入其特定的場景啟動器 ( starter ) 即可,比如 web 模組整合、jdbc 模組整合,我們在開發時只需要在 pom.xml 檔案中引入對應的場景依賴即可。Spring 官方並沒有提供 MyBatis 的場景啟動器,但是 MyBatis 官方卻緊緊的抱住了 Spring 的大腿,他們提供了 MyBatis 整合 Spring Boot 專案時的場景啟動器,也就是 mybatis-springboot-starter,大家通過命名方式也能夠發現其中的區別,Spring 官方提供的啟動器的命名方式為 spring-boot-starter-*,與它還是有一些差別的,接下來我們來介紹一下 mybatis-springboot-starter 場景啟動器。
其官網地址為 mybatis-spring-boot,感興趣的朋友可以去檢視更多內容,官網對 mybatis-springboot-starter 的介紹如下所示:
The MyBatis-Spring-Boot-Starter help you build quickly MyBatis applications on top of the Spring Boot.
MyBatis-Spring-Boot-Starter 可以幫助開發者快速建立基於 Spring Boot 的 MyBatis 應用程式,那麼使用 MyBatis-Spring-Boot-Starter可以做什麼呢?
- 構建獨立的 MyBatis 應用程式
- 零模板
- 更少的 XML 配置程式碼甚至無 XML 配置
Spring Boot 整合 MyBatis 過程
新增依賴
如果要將其整合到當前專案中,首先我們需要將其依賴配置增加到 pom.xml 檔案中,mybatis-springboot-starter 的最新版本為 1.3.2,需要 Spring Boot 版本達到 1.5 或者以上版本,同時,我們需要將資料來源依賴和 jdbc 依賴也新增到配置檔案中(如果不新增的話,將會使用預設資料來源和 jdbc 配置),由於前文中已經將這些配置放入 pom.xml 配置檔案中,因此只需要將 mybatis-springboot-starter 依賴放入其中即可,更新後的 pom 檔案如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lou.springboot</groupId>
<artifactId>springboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 引入 MyBatis 場景啟動器,包含其自動配置類及 MyBatis 3 相關依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
這樣,MyBatis 的場景啟動器也整合進來專案中了。
新建相關目錄
分別新建存放實體類的包、存放 Dao 介面的包,以及存放 Mapper 檔案的目錄,如下圖所示:
application.properties 配置
Spring Boot 整合 MyBatis 時幾個比較需要注意的配置引數:
-
mybatis.config-location
配置 mybatis-config.xml 路徑,mybatis-config.xml 中配置 MyBatis 基礎屬性,如果專案中配置了 mybatis-config.xml 檔案需要設定該引數 -
mybatis.mapper-locations
配置 Mapper 檔案對應的 XML 檔案路徑 -
mybatis.type-aliases-package
配置專案中實體類包路徑
mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*Dao.xml
mybatis.type-aliases-package=com.lou.springboot.entity
啟動類增加 Mapper 掃描
在啟動類中新增對 Mapper 包掃描 @MapperScan,Spring Boot 啟動的時候會自動載入包路徑下的 Mapper 介面:
package com.lou.springboot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.lou.springboot.dao")
public class Application {
public static void main(String[] args) {
System.out.println("啟動 Spring Boot...");
SpringApplication.run(Application.class, args);
}
}
當然也可以直接在每個 Mapper 介面上面新增 @Mapper 註解,但是如果 Mapper 介面數量較多,在每個 Mapper 加註解是挺繁瑣的,建議使用掃描註解。
Spring Boot 整合 MyBatis 例項
本次實驗我們依然使用前一個實驗中的 tb_user 表結構,並使用 MyBatis 進行增刪改查操作,接下來是功能實現步驟。
新建實體類和 Mapper 介面
在 entity 包下新建 User 類,將 tb_user 中的欄位對映到該實體類中:
package com.lou.springboot.entity;
public class User {
private Integer id;
private String name;
private String password;
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在 dao 包中新建 UserDao 介面,並定義增刪改查四個介面:
package com.lou.springboot.dao;
import com.lou.springboot.entity.User;
import java.util.List;
import java.util.Map;
public interface UserDao {
/**
* 返回資料列表
*
* @return
*/
List<User> findAllUsers();
/**
* 新增
*
* @param User
* @return
*/
int insertUser(User User);
/**
* 修改
*
* @param User
* @return
*/
int updUser(User User);
/**
* 刪除
*
* @param id
* @return
*/
int delUser(Integer id);
}
建立 Mapper 介面的對映檔案
在 resources/mapper 目錄下新建 Mapper 介面的對映檔案 UserDao.xml,之後進行對映檔案的編寫。
1、首先,定義對映檔案與 Mapper 介面的對應關係,比如該示例中,需要將 UserDao.xml 的與對應的 UserDao 介面類之間的關係定義出來:
<mapper namespace="com.lou.springboot.dao.UserDao">
2、之後,配置表結構和實體類的對應關係:
<resultMap type="com.lou.springboot.entity.User" id="UserResult">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
</resultMap>
3、最後,針對對應的介面方法,編寫具體的 SQL 語句:
<select id="findAllUsers" resultMap="UserResult">
select id,name,password from tb_user
order by id desc
</select>
<insert id="insertUser" parameterType="com.lou.springboot.entity.User">
insert into tb_user(name,password)
values(#{name},#{password})
</insert>
<update id="updUser" parameterType="com.lou.springboot.entity.User">
update tb_user
set
name=#{name},password=#{password}
where id=#{id}
</update>
<delete id="delUser" parameterType="int">
delete from tb_user where id=#{id}
</delete>
功能測試
為了對 MyBatis 進行功能測試,新建 MyBatisController 類,並新增 4 個方法分別接收對於 tb_user 表的增刪改查請求,程式碼如下:
package com.lou.springboot.controller;
import com.lou.springboot.dao.UserDao;
import com.lou.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@RestController
public class MyBatisController {
@Resource
UserDao userDao;
// 查詢所有記錄
@GetMapping("/users/mybatis/queryAll")
public List<User> queryAll() {
return userDao.findAllUsers();
}
// 新增一條記錄
@GetMapping("/users/mybatis/insert")
public Boolean insert(String name, String password) {
if (StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {
return false;
}
User user = new User();
user.setName(name);
user.setPassword(password);
return userDao.insertUser(user) > 0;
}
// 修改一條記錄
@GetMapping("/users/mybatis/update")
public Boolean insert(Integer id, String name, String password) {
if (id == null || id < 1 || StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {
return false;
}
User user = new User();
user.setId(id);
user.setName(name);
user.setPassword(password);
return userDao.updUser(user) > 0;
}
// 刪除一條記錄
@GetMapping("/users/mybatis/delete")
public Boolean insert(Integer id) {
if (id == null || id < 1) {
return false;
}
return userDao.delUser(id) > 0;
}
}
啟動 MySQL
如果 MySQL 資料庫服務沒有啟動的話需要進行這一步操作。
進入實驗樓線上開發環境,首先開啟一個命令視窗,點選 File -> Open New Terminal 即可,之後在命令列中輸入以下命令:
sudo service mysql start
因為使用者許可權的關係,需要增加在命令前增加 sudo 取得 root 許可權,不然在啟動時會報錯,之後等待 MySQL 正常啟動即可
線上環境中啟動 Spring Boot 專案
由於預設是在 project 目錄下,因此想要啟動咱們的專案,首先需要切換到 lou-springboot 目錄下,之後可以通過 Maven 外掛的方式啟動 Spring Boot 專案,命令為 mvn spring-boot:run ,之後就可以等待專案啟動。
開啟 Web 服務
在專案啟動成功後,可以點選頁面上方的 Web 服務直接在顯示檢視網站效果。
之後會在瀏覽器中彈出 https://****.simplelab.cn 頁面,我們可以在瀏覽器中輸入如下地址進行驗證:
- 查詢:https://98f4763a578a.simplelab.cn/users/mybatis/queryAll
- 新增:https://98f4763a578a.simplelab.cn/users/mybatis/insert?name=mybatis1&password=1233333
- 修改:https://98f4763a578a.simplelab.cn/users/mybatis/update?id=3&name=mybatis2&password=1233222
- 刪除:https://98f4763a578a.simplelab.cn/users/mybatis/delete?id=3
如果能夠正常獲取到記錄以及正確向 tb_user 表中新增和修改記錄就表示功能整合成功!結果如下所示:
驗證 MySQL 中的資料
最後,我們登入實驗樓演示環境中的 MySQL 資料庫,查看錶中的資料是否與前一步驟中的資料一致,如果最後得到的資料確實與 web 頁面中看到的資料一致則表示功能整合一切正常,本次實驗到此結束!
實驗總結
這節實驗課程介紹了 MyBatis 框架相關知識點介紹以及如何整合 Spring Boot 與 MyBatis,並以 tb_user 表為例演示瞭如何使用 MyBatis 進行增、刪、改、查操作,也希望大家能夠在課後自行學習原始碼並根據文中的實驗步驟進行練習,程式碼也需要多寫,這樣的話進步才會更加明顯。