使用 MyBatis-tk 和 pagehelper
1. 前言
在 spring-boot 集成 MyBatis小節(jié) 中,我們介紹了如何在 spring-boot 中集成 MyBatis,MyBatis 雖然靈活,但是對(duì)于業(yè)務(wù)開(kāi)發(fā)還略顯不夠。tk.mapper 和 pagehelper 是國(guó)內(nèi)開(kāi)發(fā)者為 MyBatis 定制的兩款業(yè)務(wù)增強(qiáng)庫(kù),tk.mapper 可以讓開(kāi)發(fā)者從基本的增刪查改中解放,pagehelper 則提供了高度易用的分頁(yè)功能。
有了它們,MyBatis 可謂是如虎添翼,本小節(jié)我們將介紹這兩款庫(kù)的使用。
TIPS: 提示,本小節(jié)建立在 spring-boot 集成 MyBatis小節(jié) 基礎(chǔ)之上,如果你還沒(méi)有閱讀該小節(jié),請(qǐng)務(wù)必閱讀了解。
2. tk.mapper
2.1 簡(jiǎn)介
在 tk.mapper 項(xiàng)目的首頁(yè)有關(guān)于它最精確的介紹。
通用 mapper 是一個(gè)可以實(shí)現(xiàn)任意 MyBatis 通用方法的框架,項(xiàng)目提供了常規(guī)的增刪改查操作以及 example 相關(guān)的單表操作。通用 mapper 是為了解決 MyBatis 使用中 90% 的基本操作,使用它可以很方便的進(jìn)行開(kāi)發(fā),可以節(jié)省開(kāi)發(fā)人員大量的時(shí)間。
總結(jié)來(lái)說(shuō),tk.mapper 可以為 MyBatis 開(kāi)發(fā)節(jié)省大量的時(shí)間,精簡(jiǎn)的 90% 的基本操作。
2.2 依賴(lài)
tk.mapper 的使用也十分簡(jiǎn)單,我們只需引入相應(yīng)的 starter 即可。如下:
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
TIPS: 注意,引入了 mapper starter 后,雖然和 MyBatis 官方的 starter 沒(méi)有沖突,但是官方的自動(dòng)配置不會(huì)生效!
2.3 使用
簡(jiǎn)單地說(shuō),tk.mapper 會(huì)給普通的 mapper 做一些增強(qiáng),讓 mapper 具有基本的增刪查改的能力。如下:
import tk.mybatis.mapper.common.BaseMapper;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM imooc_user")
List<User> getUsers();
}
UserMapper 是原有的 mapper,只需繼承 tk.mapper 中的 BaseMapper 就完成的增強(qiáng)。
UserMapper 繼承 BaseMapper 后就擁有了基礎(chǔ)的增刪查改功能,而無(wú)需寫(xiě) SQL。BaseMapper 必須指定一個(gè)與 UserMapper 對(duì)應(yīng)的模型類(lèi),即 User 類(lèi)。
package com.imooc.mybatis.springbootmybatisexample.model;
import javax.persistence.Table;
import java.io.Serializable;
@Table(name = "imooc_user")
public class User implements Serializable {
private Long id;
private String username;
private Integer age;
private Integer score;
// 省略 getter 和 setter 方法
}
數(shù)據(jù)表的名稱(chēng)為 imooc_user,這里我們通過(guò) Table 注解來(lái)告訴 tk User 模型所對(duì)應(yīng)的數(shù)據(jù)表。
mapper 增強(qiáng)后,我們還需要給 SpringbootMybatisExampleApplication 啟動(dòng)類(lèi)添加上一個(gè)注解:
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.imooc.mybatis.springbootmybatisexample.mapper")
public class SpringbootMybatisExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisExampleApplication.class, args);
}
}
MapperScan 是 tk 提供的一個(gè) mapper 掃描注解,在注解中我們需要填入 mapper 所在的包路徑,即 com.imooc.mybatis.springbootmybatisexample.mapper。
到此 UserMapper 增強(qiáng)已經(jīng)完成了,我們嘗試在 UserController 中使用。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping
public List<User> getUsers() {
// return userMapper.getUsers();
return userMapper.selectAll();
}
}
在這里,我們替換 getUsers 方法,而是使用了 selectAll 方法,selectAll 是 BaseMapper 提供的方法,也就是增強(qiáng)的方法,我們無(wú)需去為這個(gè)方法添加相應(yīng)的 SQL,tk 會(huì)自動(dòng)幫我們搭理好一切。
再次運(yùn)行程序,并測(cè)試接口:
# 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}]
我們得到了與之前一樣的結(jié)果,可以看到在我們并未書(shū)寫(xiě)任何 SQL 的前提下, tk.mapper 自動(dòng)幫我們生成了需要的 SQL 查詢(xún),這就是 tk.mapper 所帶來(lái)的簡(jiǎn)化開(kāi)發(fā)能力。
3. pagehelper
3.1 簡(jiǎn)介
pagehelper 是一個(gè) 方便好用的 MyBatis 分頁(yè)插件,支持復(fù)雜的單表、多表分頁(yè),是目前 MyBatis 中使用最為廣泛的插件之一。
3.2 依賴(lài)
和其它一樣,pagehelper 也只需導(dǎo)入相應(yīng)的啟動(dòng)器即可。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
3.3 使用
pagehelper 充分的簡(jiǎn)單易用,在 UserController 中只需添加一行代碼即可。
import com.github.pagehelper.PageHelper;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping
public List<User> getUsers() {
PageHelper.startPage(1, 2);
return userMapper.selectAll();
}
}
PageHelper.startPage(1, 2)
會(huì)自動(dòng)攔截后面將要執(zhí)行的 SQL,然后處理該 SQL 并添加分頁(yè)參數(shù)。startPage 接收兩個(gè)參數(shù),第一個(gè)參數(shù)表示當(dāng)前分頁(yè),第二個(gè)參數(shù)表示分頁(yè)數(shù)目,如這里的 1,2 表示第一頁(yè)且該頁(yè)最多有兩條記錄。
運(yùn)行程序,并測(cè)試接口:
# curl 127.0.0.1:8080/user/
[{"id":1,"username":"peter","age":18,"score":100},{"id":2,"username":"pedro","age":24,"score":200}]
與上面的結(jié)果相比,結(jié)果的數(shù)目只有兩條,顯然分頁(yè)插件已經(jīng)生效。
TIPS: 提示,pagehelper 的分頁(yè)是從
1
開(kāi)始的,而有些分頁(yè)插件分頁(yè)是從0
開(kāi)始的。
4. 小結(jié)
-
有了 spring-boot 后,很多項(xiàng)目的開(kāi)發(fā)都將變得簡(jiǎn)單,mapper 和 pagehelper 都只需添加一個(gè)依賴(lài)即可使用。
-
本小節(jié)簡(jiǎn)單的介紹了 mapper 和 pagehelper,如果你想深入了解它們,可以閱讀它們的文檔:pagehelper,mapper。