MyBatisPlus的使用最全實例詳解
一、MyBatis-Plus 是什么?
- ??定位??:MyBatis 的增強工具,簡化開發(fā),提高效率。
- ??特點??:內(nèi)置通用 Mapper、通用 Service、條件構造器、分頁插件等,無需編寫繁瑣的 XML。
- ??核心思想??:通過少量配置實現(xiàn)單表 CRUD 操作,復雜 SQL 仍可手寫。
二、快速開始(Spring Boot 環(huán)境)
1. 添加依賴
在 pom.xml 中引入:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本(如3.5.3)</version>
</dependency>
<!-- 數(shù)據(jù)庫驅(qū)動(如MySQL) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>2. 配置數(shù)據(jù)庫
在 application.yml 中:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver3. 創(chuàng)建實體類
@Data // Lombok 注解,自動生成 getter/setter
@TableName("user") // 對應數(shù)據(jù)庫表名
public class User {
@TableId(type = IdType.AUTO) // 主鍵自增
private Long id;
private String name;
private Integer age;
private String email;
}4. 創(chuàng)建 Mapper 接口
public interface UserMapper extends BaseMapper<User> {
// 無需寫 XML,直接繼承 BaseMapper 即具備 CRUD 方法
}5. 在啟動類添加注解
@SpringBootApplication
@MapperScan("com.example.mapper") // 掃描 Mapper 接口所在包
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}三、基本 CRUD 操作
1. 插入數(shù)據(jù)
User user = new User();
user.setName("張三");
user.setAge(25);
user.setEmail("zhangsan@example.com");
userMapper.insert(user); // 插入后自動回填主鍵2. 查詢操作
// 根據(jù) ID 查詢
User user = userMapper.selectById(1L);
// 條件查詢(查詢 name=張三且 age=25 的用戶)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "張三").eq("age", 25);
List<User> users = userMapper.selectList(queryWrapper);3. 更新操作
User user = new User(); user.setId(1L); user.setAge(30); userMapper.updateById(user); // 根據(jù) ID 更新
4. 刪除操作
userMapper.deleteById(1L); // 根據(jù) ID 刪除
// 條件刪除
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 25);
userMapper.delete(wrapper);四、條件構造器(Wrapper)
1.QueryWrapper詳解
(1)基本用法
QueryWrapper<User> wrapper = new QueryWrapper<>();
(2)常用條件方法
a. 等值條件
wrapper.eq("name", "張三") // name = '張三'
.ne("age", 20) // age != 20
.isNotNull("email"); // email IS NOT NULLb. 范圍條件
wrapper.gt("age", 18) // age > 18
.ge("age", 20) // age >= 20
.lt("age", 30) // age < 30
.le("age", 25) // age <= 25
.between("age", 20, 30) // age BETWEEN 20 AND 30
.notBetween("age", 20, 30); // age NOT BETWEEN 20 AND 30c. 模糊查詢
wrapper.like("name", "張") // name LIKE '%張%'
.likeLeft("name", "三") // name LIKE '%三'
.likeRight("name", "張") // name LIKE '張%'
.notLike("name", "李"); // name NOT LIKE '%李%'d. 邏輯條件
wrapper.and(w -> w.eq("name", "張三").gt("age", 20)) // AND (name = '張三' AND age > 20)
.or(w -> w.eq("name", "李四").lt("age", 30)); // OR (name = '李四' OR age < 30)e. 排序與分組
wrapper.orderByAsc("age") // ORDER BY age ASC
.orderByDesc("id") // ORDER BY id DESC
.groupBy("department"); // GROUP BY departmentf. 指定返回字段
wrapper.select("id", "name", "age"); // SELECT id, name, ageg. 子查詢
wrapper.inSql("id", "SELECT id FROM user WHERE age > 18") // id IN (SELECT id ...)
.notInSql("id", "SELECT id FROM user WHERE age < 10");(3)動態(tài)條件拼接
根據(jù)業(yè)務邏輯動態(tài)添加條件:
QueryWrapper<User> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(name)) {
wrapper.like("name", name);
}
if (age != null) {
wrapper.gt("age", age);
}
List<User> users = userMapper.selectList(wrapper);2.LambdaQueryWrapper詳解
(1)為什么用Lambda
- ??優(yōu)勢??:避免字段名硬編碼,編譯時檢查,重構友好。
- ??語法??:通過
User::getXxx引用字段。
(2)基本用法
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
(3)常用方法
lambdaWrapper.eq(User::getName, "張三")
.gt(User::getAge, 20)
.between(User::getAge, 20, 30)
.like(User::getName, "張")
.orderByAsc(User::getAge);(4)動態(tài)條件示例
lambdaWrapper
.eq(name != null, User::getName, name) // 僅當 name 不為空時生效
.gt(age != null, User::getAge, age);3.復雜條件組合
(1)嵌套條件
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.and(w -> w.eq("name", "張三").or().eq("name", "李四"))
.and(w -> w.gt("age", 20).lt("age", 30));生成的SQL:
WHERE (name = '張三' OR name = '李四') AND (age > 20 AND age < 30)
(2)多OR條件
wrapper.or(w -> w.eq("name", "張三").eq("name", "李四"));生成的SQL:
WHERE name = '張三' OR name = '李四'
4.條件構造器的鏈式調(diào)用優(yōu)化
(1)直接鏈式挑戰(zhàn)
List<User> users = userMapper.selectList(
new QueryWrapper<User>()
.eq("name", "張三")
.gt("age", 20)
.orderByDesc("id")
);(2)復用 Wrapper 對象
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1);
// 根據(jù)不同場景追加條件
if (isAdmin) {
wrapper.eq("is_admin", 1);
} else {
wrapper.eq("department", "IT");
}5.條件構造器的實際應用場景
(1)動態(tài)搜索功能
public List<User> searchUsers(String keyword, Integer minAge, Integer maxAge) {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(keyword), User::getName, keyword)
.or()
.like(StringUtils.isNotBlank(keyword), User::getEmail, keyword)
.ge(minAge != null, User::getAge, minAge)
.le(maxAge != null, User::getAge, maxAge);
return userMapper.selectList(wrapper);
}(2)多表聯(lián)查中的條件傳遞
// 假設聯(lián)查用戶表和訂單表
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id", "SELECT user_id FROM order WHERE amount > 1000");
List<User> users = userMapper.selectList(wrapper);6.總結(jié)表格
| 方法名 | 作用 | 示例 |
|---|---|---|
eq() / ne() | 等于 / 不等于 | eq("name", "張三") |
gt() / lt() | 大于 / 小于 | gt("age", 20) |
between() | 范圍查詢 | between("age", 20, 30) |
like() / notLike() | 模糊查詢 | like("name", "張") |
and() / or() | 邏輯與 / 或 | and(w -> w.eq(...)) |
orderByAsc() | 升序排序 | orderByAsc("age") |
select() | 指定返回字段 | select("id", "name") |
inSql() | 子查詢 | inSql("id", "SELECT id FROM ...") |
五、分頁查詢
1. 配置分頁插件
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}2. 使用分頁
// 第 2 頁,每頁 5 條
Page<User> page = new Page<>(2, 5);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20);
Page<User> result = userMapper.selectPage(page, wrapper);
// 獲取結(jié)果
List<User> users = result.getRecords();
long total = result.getTotal();六、常用注解
1.@TableName
- 指定實體類對應的表名。
- 示例:
@TableName("sys_user")
2.@TableId
- 標記主鍵字段。
- 可選主鍵策略:
IdType.AUTO:數(shù)據(jù)庫自增IdType.ASSIGN_ID:雪花算法生成 ID(默認)
3.@TableField
- 解決字段名與數(shù)據(jù)庫列名不一致問題。
- 示例:
@TableField("nick_name")
七、總結(jié)
- ??優(yōu)點??:減少樣板代碼,提高開發(fā)效率。
- ??適用場景??:單表操作、簡單查詢。
- ??復雜 SQL??:仍可通過 XML 或注解方式編寫。
到此這篇關于MyBatisPlus的使用的文章就介紹到這了,更多相關MyBatisPlus使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中使用標簽(label)來控制循環(huán)的執(zhí)行流程
java 和 label 兩個完全不相干的詞,今天我把他們連接在一起了,試想一個問題,雙循環(huán)在不使用 return 的情況下,如何停止外循環(huán)?所以本文給大家介紹了Java中使用標簽(label)來控制循環(huán)的執(zhí)行流程,需要的朋友可以參考下2024-06-06
Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)
XMLType是Oracle支持的一種基于XML格式存儲的數(shù)據(jù)類型,這里我們共同來探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)的方法:2016-07-07
Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南
Logback是一個可靠、通用且快速的Java日志框架,作為Log4j的繼承者,由Log4j創(chuàng)始人設計,這篇文章主要介紹了Spring Boot集成Logback終極指南之從基礎到高級配置實戰(zhàn)指南,需要的朋友可以參考下2025-05-05
SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解
這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09

