前言
在現代的 Java Web 開發中,Spring Boot 和 MyBatis 已經成為主流框架組合。為了提升開發效率和簡化數據庫操作,MyBatis-Plus(簡稱 MP)應運而生。它是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
本文將詳細介紹如何在 Spring Boot 項目中集成并使用 MyBatis-Plus,包括:
- 環境搭建
- 基本 CRUD 操作
- 使用 Wrapper 構造查詢條件
- 注解的使用(如
@TableName
、@TableId
、@TableField
) - 分頁插件配置
- 多表關聯查詢示例
一、環境準備
1. 創建 Spring Boot 項目
你可以使用 Spring Initializr 創建一個基礎項目,選擇以下依賴:
- Spring Web
- MyBatis Framework
- MySQL Driver
或者使用 IDEA 或 Eclipse 插件創建。
2. 添加 MyBatis-Plus 依賴
在 pom.xml
文件中添加 MyBatis-Plus 的 Starter 依賴:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>
如果你需要使用代碼生成器,也可以加上:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version>
</dependency>
3. 配置數據庫連接
在 application.yml
中配置數據源:
spring:datasource:url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC&characterEncoding=utf8username: rootpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath*:mapper/**/*.xmltype-aliases-package: com.example.entity
二、實體類與注解
1. 表結構示例
假設我們有一個用戶表 user
:
CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,email VARCHAR(100)
);
2. 實體類定義
package com.example.entity;import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;@Data
@TableName("user") // 映射到 user 表
public class User {@TableId(value = "id", type = IdType.AUTO) // 主鍵映射private Long id;@TableField("name") // 字段映射,默認自動識別駝峰命名轉下劃線private String name;@TableField("age")private Integer age;@TableField("email")private String email;
}
說明:
@TableName
: 映射實體類與數據庫表名。@TableId
: 標識主鍵字段,可指定數據庫列名。@TableField
: 映射普通字段,若不寫則默認按字段名轉換成下劃線匹配數據庫列。IdType.AUTO
: 自動識別主鍵類型(自增、UUID 等),也可手動設置如IdType.NONE
,IdType.INPUT
等。
三、Mapper 接口與 Service 層
1. Mapper 接口
package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;public interface UserMapper extends BaseMapper<User> {
}
繼承 BaseMapper
后即可獲得基本的 CRUD 方法。
2. Service 層接口與實現
package com.example.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;public interface UserService extends IService<User> {
}
package com.example.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
四、Wrapper 查詢構造器詳解
MyBatis-Plus 提供了強大的查詢構造器 QueryWrapper
和 UpdateWrapper
,可以鏈式構建 SQL 條件。
示例:使用 QueryWrapper 查詢用戶
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;public List<User> getUsersByNameAndAge(String name, int minAge) {return userMapper.selectList(new QueryWrapper<User>().like("name", name) // LIKE '%name%'.ge("age", minAge)); // age >= minAge
}
更多常用方法:
方法 | 說明 |
---|---|
eq(column, value) | 等于 |
ne(column, value) | 不等于 |
gt(column, value) | 大于 |
ge(column, value) | 大于等于 |
lt(column, value) | 小于 |
le(column, value) | 小于等于 |
like(column, value) | LIKE |
in(column, collection) | IN 查詢 |
between(column, val1, val2) | BETWEEN 查詢 |
orderByAsc(column) / orderByDesc(column) | 排序 |
LambdaQueryWrapper(推薦)
避免字符串硬編碼錯誤,推薦使用 LambdaQueryWrapper
:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, "Tom").ge(User::getAge, 18));
五、分頁插件配置
1. 配置分頁插件
在配置類中啟用分頁功能:
package com.example.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
2. 使用分頁查詢
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;public Page<User> getUsersByPage(int pageNum, int pageSize) {return userMapper.selectPage(new Page<>(pageNum, pageSize), null);
}
你也可以結合 Wrapper:
Page<User> page = userMapper.selectPage(new Page<>(1, 10),new LambdaQueryWrapper<User>().ge(User::getAge, 20)
);
六、多表關聯查詢(以一對一為例)
1. 新建 Address 表及實體類
CREATE TABLE address (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT,detail VARCHAR(200)
);
package com.example.entity;import com.baomidou.mybatisplus.annotation.*;@Data
@TableName("address")
public class Address {@TableId(type = IdType.AUTO)private Long id;private Long userId;private String detail;
}
2. 修改 User 類(增加關聯字段)
package com.example.entity;import lombok.Data;@Data
public class UserVO extends User {private Address address;
}
3. 自定義 SQL 查詢(XML 方式)
<!-- UserMapper.xml -->
<select id="selectUserWithAddress" resultType="com.example.entity.UserVO">SELECT u.*, a.detail AS address_detailFROM user uLEFT JOIN address a ON u.id = a.user_idWHERE u.id = #{id}
</select>
4. Mapper 接口中聲明方法
UserVO selectUserWithAddress(Long id);
七、總結
通過本文,你應該已經掌握了:
- 如何在 Spring Boot 中集成 MyBatis-Plus;
- 使用
@TableName
、@TableId
、@TableField
注解進行 ORM 映射; - 使用
Wrapper
構建靈活查詢條件; - 使用分頁插件進行分頁;
- 多表關聯查詢的基本方式。
MyBatis-Plus 是一個非常實用的 MyBatis 擴展庫,能夠顯著提升開發效率,建議結合官方文檔進一步深入學習其高級特性,例如自動填充、樂觀鎖、邏輯刪除、多租戶等。
參考資料
- MyBatis-Plus 官方文檔
- Spring Boot 官方文檔