使用 MyBatis-plus
1. 前言
在spring-boot 集成 MyBatis小節中,我們介紹了如何在 spring-boot 中集成 MyBatis,MyBatis 雖然靈活,但是對于業務開發還略顯不夠。MyBatis-Plus 是國內開發者為 MyBatis 定制的一款增強工具,在不侵入 MyBatis 的基礎上能夠快速地提升 MyBatis 的開發能力,為開發者節省大量的時間。
提示: 本小節建立在spring-boot 集成 MyBatis小節基礎之上,如果你還沒有閱讀該小節,請務必閱讀了解。
2. 簡介
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
MyBatis-Plus 內置豐富的基礎 mapper 和插件,是目前國內使用最為廣泛的開源項目之一。
3. 依賴
在 spring-boot 的基礎上,使用 MyBatis-Plus 也十分簡單,只需在 pom 文件中添加上對應的 starter 即可。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
4. 準備
MP 提供了十分方便的 BaseMapper 供項目 mapper 繼承,如下:
package com.imooc.mybatis.springbootmybatisexample.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.imooc.mybatis.springbootmybatisexample.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM imooc_user")
List<User> getUsers();
}
UserMapper 繼承 BaseMapper 后就擁有了基礎的增刪查改功能,而無需寫 SQL。BaseMapper 必須指定一個與 UserMapper 對應的模型類,即 User 類。
package com.imooc.mybatis.springbootmybatisexample.model;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
@TableName("imooc_user")
public class User implements Serializable {
@TableId("id")
private Long id;
private String username;
private Integer age;
private Integer score;
// 省略諸多 getter 和 setter 方法
}
在模型類中,我們需要通過 TableName 注解指定模型對于的數據表名稱,并通過 TableId 注解指定數據表字段。
并在 SpringbootMybatisExampleApplication 啟動類上添加 MapperScan 注解來掃描 mapper,如下:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.imooc.mybatis.springbootmybatisexample.mapper")
public class SpringbootMybatisExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisExampleApplication.class, args);
}
}
MapperScan 中需填入 mapper 所在的包路徑,即 com.imooc.mybatis.springbootmybatisexample.mapper。
5. 使用
5.1 基礎使用
接下來,我們在 UserController 中來使用增強后的 UserMapper。
package com.imooc.mybatis.springbootmybatisexample.controller;
import com.imooc.mybatis.springbootmybatisexample.mapper.UserMapper;
import com.imooc.mybatis.springbootmybatisexample.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping
public List<User> getUsers() {
// return userMapper.getUsers();
return userMapper.selectList(null);
}
}
這里,我們替換了之前使用的 getUsers 方法,而是使用了 BaseMapper 提供的 selectList 方法,該方法接收一個參數,這里我們暫時定為 null。
運行程序,并通過 curl 測試接口:
# curl 127.0.0.1:8080/user/
[{"id":1,"username":"peter","age":18,"score":100},{"id":2,"username":"pedro","age":24,"score":200},{"id":3,"username":"jerry","age":28,"score":500},{"id":4,"username":"mike","age":12,"score":300}]
我們仍然取得了與之前一樣的結果??梢钥吹?,MP 在增強 UserMapper 后,我們無需再寫多余的 SQL,MP 自動的為我們生成了對應的 SQL 語句。
5.2 進階使用
MP 的功能遠不止如此簡單,我們還可以通過 Java API 給 selectList 函數傳入 SQL 篩選條件。如,我們只想獲取分數大于 200 分的用戶。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping
public List<User> getUsers() {
QueryWrapper<User> condition = new QueryWrapper<>();
condition.lambda().gt(User::getScore, 200);
return userMapper.selectList(condition);
}
}
QueryWrapper 是 MP 提供的查詢條件包裝器,通過 Java API 的方式我們就可以構造 SQL 過濾條件。如這里我們通過 lamdba 表示式構造了用戶積分需大于200的過濾條件,然后將包裝器以參數的形式傳遞給 selectList 函數。
再次運行程序,并通過 curl 測試接口:
# curl 127.0.0.1:8080/user/
[{"id":3,"username":"jerry","age":28,"score":500},{"id":4,"username":"mike","age":12,"score":300},{"id":5,"username":"tom","age":27,"score":1000}]
從結果中,可以看出積分小于200的用戶都已經被過濾掉了。
5.3 分頁插件
MP 內置提供了分頁插件,只需幾行代碼我們就可直接引入。
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
@SpringBootApplication
@MapperScan("com.imooc.mybatis.springbootmybatisexample.mapper")
public class SpringbootMybatisExampleApplication {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisExampleApplication.class, args);
}
}
在 SpringbootMybatisExampleApplication 啟動類中,我們添加了一個帶有 Bean 注解的 paginationInterceptor 方法,該方法返回一個 PaginationInterceptor 對象,這樣插件就配置完成了。
接下來,我們來使用它。
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping
public List<User> getUsers() {
Page page = userMapper.selectPage(new Page<>(1, 3), null);
return page.getRecords();
}
}
UserMapper 的 selectPage 方法接受兩個參數,第一個參數是分頁配置,第二個參數是查詢條件包裝器。這里第一個參數,我們直接通過 Page 構造函數來構造,1 表示當前頁,3 表示分頁最大的記錄數,即第一頁且最多返回三條記錄;第二個參數我們直接設置為 null。
運行程序,并通過 curl 測試接口:
# curl 127.0.0.1:8080/user/
[{"id":1,"username":"peter","age":18,"score":100},{"id":2,"username":"pedro","age":24,"score":200},{"id":3,"username":"jerry","age":28,"score":500}]
從結果可以看出,分頁生效了,記錄總數卻是為 3 條。
6. 小結
- MyBatis-Plus 是國內使用十分廣泛的一款 ORM 庫,極大的節省了開發者的開發時間,功能強大且使用簡單。
- MyBatis-Plus 的內容還是較多的,如果你感興趣,不妨訪問它的官網看一看。