如何優雅的使用 MyBatis 之 MyBatis-Plus

MyBatis-Plus 是 MyBatis 的第三方使用插件。

前兩天有朋友留言說能不能寫一下整合 MyBatis-Plus 的教程。

在這之前我對 MyBatis-Plus 其實瞭解不是很多,一般情況下也不太願意使用第三方的組件。找時間瞭解了一下 MyBatis-Plus 發現還是國人出品的開源項目,並且在 Github 上有 5000 多個關注,說明在國內使用的用戶已經不少。

這篇文章就給大家介紹一下,如何在 Spring Boot 中整合 MyBatis-Plus 使用 MyBatis。

MyBatis-Plus 介紹

MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。

官方願景:成為 MyBatis 最好的搭檔,就像 魂鬥羅 中的 1P、2P,基友搭配,效率翻倍。

根據願景甚至還設置了一個很酷的 Logo。

如何優雅的使用 MyBatis 之 MyBatis-Plus

官網地址:https://mybatis.plus/,本文大部分內容參考自官網。

特性

官網說的特性太多了,挑了幾個有特點的分享給大家。

  • 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
  • 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
  • 強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
  • 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
  • 支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數據庫
  • 內置分頁插件:基於 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同於普通 List 查詢

快速上手

準備數據

我們首先設計一個這樣的用戶表,如下:

[email protected]@[email protected]@[email protected]

我們要創建兩個 Sql 文件,以便項目啟動的時候,將表結構和數據初始化到數據庫。

表結構文件(schema-h2.sql)內容:

<code>DROP TABLE IF EXISTS user;

CREATE TABLE user
(
\tid BIGINT(20) NOT NULL COMMENT '主鍵ID',
\tname VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
\tage INT(11) NULL DEFAULT NULL COMMENT '年齡',
\temail VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
\tPRIMARY KEY (id)
);
/<code>

表數據文件(data-h2.sql)內容:

<code>INSERT INTO user (id, name, age, email) VALUES
(1, 'neo', 18, '[email protected]'),
(2, 'keep', 36, '[email protected]'),
(3, 'pure', 28, '[email protected]'),
(4, 'smile', 21, '[email protected]'),
(5, 'it', 24, '[email protected]');
/<code>

在示例項目的 resources 目錄下創建 db 文件夾,將兩個文件放入其中。

添加依賴

添加相關依賴包,pom.xml 中的相關依賴內容如下:

<code><dependencies>
\t<dependency>
\t\t<groupid>org.projectlombok/<groupid>
\t\t<artifactid>lombok/<artifactid>
\t\t<optional>true/<optional>
\t/<dependency>
\t<dependency>
\t\t<groupid>com.baomidou/<groupid>
\t\t<artifactid>mybatis-plus-boot-starter/<artifactid>
\t\t<version>3.1.1/<version>
\t/<dependency>
\t<dependency>
\t\t<groupid>com.h2database/<groupid>
\t\t<artifactid>h2/<artifactid>
\t\t<scope>runtime/<scope>
\t/<dependency>
\t<dependency>
\t\t<groupid>org.springframework.boot/<groupid>
\t\t<artifactid>spring-boot-starter-test/<artifactid>
\t\t<scope>test/<scope>
\t/<dependency>
/<dependencies>
/<code>
  • lombok,幫忙省略掉 Get/Set 方法,具體可以參考這篇文章
  • mybatis-plus-boot-starter,MyBatis Plus 的依賴包
  • h2,本次測試我們使用內存數據庫 h2 來演示。
  • spring-boot-starter-test,Spring Boot 的測試包

配置文件

<code># DataSource Config
spring:
datasource:
driver-class-name: org.h2.Driver
schema: classpath:db/schema-h2.sql
data: classpath:db/data-h2.sql
url: jdbc:h2:mem:test
username: root

password: test

# Logger Config
logging:
level:
com.neo: debug
/<code>

配置了 h2 數據庫,已經項目的日誌級別。配置 schema 和 data 後,項目啟動時會根據配置的文件地址來執行數據。

業務代碼

創建 MybatisPlusConfig 類,指定 Mapper 地址,啟用分頁功能。

<code>@Configuration
@MapperScan("com.neo.mapper")
public class MybatisPlusConfig {

/**
* 分頁插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
/<code>

創建實體類 User

<code>@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
/<code>

@Data 為 lombok 語法,自動注入 getter/setter 方法。

接下來創建對象對於的 Mapper。

<code>public interface UserMapper extends BaseMapper<user> {
}
/<user>/<code>

以上業務代碼就開發完成了,是不是很簡單。

測試

創建 MyBatisPlusTest 類,注入上面創建的 UserMapper 類。

<code>@RunWith(SpringRunner.class)
@SpringBootTest
public class MyBatisPlusTest {
@Autowired
private UserMapper userMapper;
}
/<code>

測試查詢單挑數據,並輸出

<code>@Test
public void testSelectOne() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
/<code>

測試添加數據

<code>@Test
public void testInsert() {
User user = new User();
user.setName("微笑");
user.setAge(3);
user.setEmail("[email protected]");
assertThat(userMapper.insert(user)).isGreaterThan(0);
// 成功直接拿會寫的 ID
assertThat(user.getId()).isNotNull();
}
/<code>

assertThat() 是 Assert 的一個精通方法,用來比對返回結果,包來自import static org.assertj.core.api.Assertions.assertThat;。

測試刪除數據

<code>@Test
public void testDelete() {
assertThat(userMapper.deleteById(3L)).isGreaterThan(0);
assertThat(userMapper.delete(new QueryWrapper<user>()
.lambda().eq(User::getName, "smile"))).isGreaterThan(0);
}
/<user>/<code>

QueryWrapper 是 MyBatis-Plus 內部輔助查詢類,可以使用 lambda 語法,也可以不使用。利用 QueryWrapper 類可以構建各種查詢條件。

測試更新數據

<code>@Test
public void testUpdate() {
User user = userMapper.selectById(2);
assertThat(user.getAge()).isEqualTo(36);
assertThat(user.getName()).isEqualTo("keep");

userMapper.update(
null,
Wrappers.<user>lambdaUpdate().set(User::getEmail, "123@123").eq(User::getId, 2)
);
assertThat(userMapper.selectById(2).getEmail()).isEqualTo("123@123");
}
/<user>/<code>

測試查詢所有數據

<code>@Test
public void testSelect() {
List<user> userList = userMapper.selectList(null);
Assert.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
/<user>/<code>

測試非分頁查詢

<code>@Test
public void testPage() {
System.out.println("----- baseMapper 自帶分頁 ------");

Page<user> page = new Page<>(1, 2);
IPage<user> userIPage = userMapper.selectPage(page, new QueryWrapper<user>()
.gt("age", 6));
assertThat(page).isSameAs(userIPage);
System.out.println("總條數 ------> " + userIPage.getTotal());
System.out.println("當前頁數 ------> " + userIPage.getCurrent());
System.out.println("當前每頁顯示數 ------> " + userIPage.getSize());
print(userIPage.getRecords());
System.out.println("----- baseMapper 自帶分頁 ------");
}
/<user>/<user>/<user>/<code>

查詢大於 6 歲的用戶,並且分頁展示,每頁兩條數據,展示第一頁。

總結

簡單使用了一下 MyBatis-Plus 感覺是一款挺不錯的 MyBatis 插件,使用 MyBatis-Plus 操作數據庫確實可以少寫一些代碼,另外 MyBatis-Plus 的功能比較豐富,文中僅展示了常用的增刪改查和分頁查詢,如果想進一步學習可以關注官網示例。

示例代碼

全網最全的 Spring Boot 學習示例項目,擊下方鏈接即可獲取。


分享到:


相關文章: