MyBatis-Plus 全面介紹與Spring Boot 集成最佳實(shí)踐
MyBatis-Plus(簡(jiǎn)稱 MP)是基于 MyBatis 的增強(qiáng)工具,在 MyBatis 基礎(chǔ)上只做增強(qiáng)不做改變,提供了大量開箱即用的功能(如通用 CRUD、分頁、條件構(gòu)造器等),徹底簡(jiǎn)化了 MyBatis 的開發(fā),大幅減少重復(fù)的 SQL 編寫工作。
一、MyBatis-Plus 核心優(yōu)勢(shì)
| 特性 | 說明 |
|---|---|
| 通用 CRUD | 內(nèi)置 BaseMapper/IService,無需編寫基礎(chǔ)增刪改查 SQL |
| 條件構(gòu)造器 | 鏈?zhǔn)骄幊虡?gòu)建動(dòng)態(tài) SQL,替代 MyBatis 繁瑣的 XML 動(dòng)態(tài)標(biāo)簽 |
| 自動(dòng)分頁 | 內(nèi)置分頁插件,無需集成 PageHelper,分頁查詢更簡(jiǎn)單 |
| 代碼生成器 | 一鍵生成 Entity、Mapper、Service、Controller 全套代碼 |
| 主鍵生成策略 | 支持雪花算法、自增、UUID 等多種主鍵生成方式,無需手動(dòng)配置 |
| 邏輯刪除 | 自動(dòng)處理邏輯刪除(標(biāo)記刪除),無需手動(dòng)寫刪除 SQL |
| 樂觀鎖 | 內(nèi)置樂觀鎖插件,解決并發(fā)更新問題 |
| 多數(shù)據(jù)源 | 簡(jiǎn)單配置即可實(shí)現(xiàn)多數(shù)據(jù)源切換,無需復(fù)雜的代碼改造 |
| 注解式開發(fā) | 支持注解替代 XML,同時(shí)兼容 MyBatis 原有 XML 寫法 |
二、MyBatis-Plus 核心組件
1. 核心接口 / 類
- BaseMapper<T>:通用 Mapper 接口,封裝了單表 CRUD 操作,自定義 Mapper 繼承即可使用。
- IService<T> / ServiceImpl<M,T>:通用 Service 層接口 / 實(shí)現(xiàn),封裝了批量操作、分頁查詢等高級(jí) CRUD。
- QueryWrapper/LambdaQueryWrapper:條件構(gòu)造器,用于動(dòng)態(tài)構(gòu)建 WHERE 條件(Lambda 版更優(yōu)雅)。
- UpdateWrapper/LambdaUpdateWrapper:更新條件構(gòu)造器,用于動(dòng)態(tài)構(gòu)建更新語句。
- Page<T>:分頁對(duì)象,配合分頁插件實(shí)現(xiàn)自動(dòng)分頁。
2. 核心注解
| 注解 | 作用 |
|---|---|
| @TableName | 映射數(shù)據(jù)庫表名(實(shí)體類名與表名不一致時(shí)使用) |
| @TableId | 標(biāo)記主鍵字段,指定主鍵生成策略(如 IdType.ASSIGN_ID 雪花算法) |
| @TableField | 映射數(shù)據(jù)庫字段(字段名與屬性名不一致、忽略字段、填充字段等) |
| @TableLogic | 標(biāo)記邏輯刪除字段(如 deleted=0 未刪除,deleted=1 已刪除) |
| @Version | 標(biāo)記樂觀鎖字段(用于并發(fā)更新控制) |
| @TableFill | 標(biāo)記自動(dòng)填充字段(如創(chuàng)建時(shí)間、更新時(shí)間) |
三、Spring Boot 集成 MyBatis-Plus 實(shí)戰(zhàn)
1. 環(huán)境準(zhǔn)備
(1)依賴引入(Maven)
<!-- Spring Boot 父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/>
</parent>
<dependencies>
<!-- MyBatis-Plus 核心依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version> <!-- 最新穩(wěn)定版 -->
</dependency>
<!-- MySQL 驅(qū)動(dòng) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok(簡(jiǎn)化實(shí)體類) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Spring Boot 測(cè)試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>(2)核心配置(application.yml)
# 數(shù)據(jù)源配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: 123456
# 連接池配置(默認(rèn) HikariCP)
hikari:
maximum-pool-size: 10
minimum-idle: 5
# MyBatis-Plus 配置
mybatis-plus:
# 實(shí)體類別名包
type-aliases-package: com.example.mp.entity
# Mapper XML 文件位置(如需保留 XML 寫法)
mapper-locations: classpath:mapper/**/*.xml
# 全局配置
global-config:
db-config:
# 主鍵生成策略:雪花算法(分布式唯一ID)
id-type: assign_id
# 邏輯刪除配置
logic-delete-field: deleted # 邏輯刪除字段名
logic-delete-value: 1 # 已刪除值
logic-not-delete-value: 0 # 未刪除值
# 配置項(xiàng)(兼容 MyBatis 配置)
configuration:
map-underscore-to-camel-case: true # 自動(dòng)下劃線轉(zhuǎn)駝峰(默認(rèn)開啟)
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志2. 代碼實(shí)現(xiàn)
(1)數(shù)據(jù)庫表設(shè)計(jì)
CREATE DATABASE IF NOT EXISTS mp_demo; USE mp_demo; -- 用戶表(含邏輯刪除、自動(dòng)填充字段) CREATE TABLE `user` ( `id` BIGINT NOT NULL COMMENT '主鍵ID(雪花算法)', `user_name` VARCHAR(50) NOT NULL COMMENT '用戶名', `age` INT COMMENT '年齡', `email` VARCHAR(100) COMMENT '郵箱', `deleted` TINYINT DEFAULT 0 COMMENT '邏輯刪除(0-未刪,1-已刪)', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間', PRIMARY KEY (`id`) ) COMMENT '用戶表';
(2)實(shí)體類(Entity)
package com.example.mp.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("user") // 表名映射(實(shí)體名與表名一致時(shí)可省略)
public class User {
// 主鍵:雪花算法生成(IdType.ASSIGN_ID)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
// 字段映射(屬性名與字段名一致時(shí)可省略)
@TableField("user_name")
private String userName;
private Integer age;
private String email;
// 邏輯刪除字段
@TableLogic
private Integer deleted;
// 自動(dòng)填充字段:創(chuàng)建時(shí)間
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
// 自動(dòng)填充字段:更新時(shí)間
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}(3)自定義字段填充處理器(處理 createTime/updateTime)
package com.example.mp.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component // 必須交給 Spring 管理
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入時(shí)填充
@Override
public void insertFill(MetaObject metaObject) {
// 填充 createTime 和 updateTime
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
// 更新時(shí)填充
@Override
public void updateFill(MetaObject metaObject) {
// 只填充 updateTime
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}(4)Mapper 接口(繼承 BaseMapper)
package com.example.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mp.entity.User;
import org.apache.ibatis.annotations.Mapper;
// 無需編寫任何方法,BaseMapper 已封裝所有基礎(chǔ) CRUD
@Mapper // 或在啟動(dòng)類加 @MapperScan("com.example.mp.mapper")
public interface UserMapper extends BaseMapper<User> {
// 如需自定義 SQL,可在此編寫(兼容 MyBatis 注解/XML 方式)
// 示例:自定義查詢
// @Select("SELECT * FROM user WHERE user_name = #{userName}")
// List<User> selectByUserName(String userName);
}(5)Service 層(通用 Service)
① Service 接口(繼承 IService)
package com.example.mp.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mp.entity.User;
public interface UserService extends IService<User> {
// 如需自定義業(yè)務(wù)方法,在此擴(kuò)展
}② Service 實(shí)現(xiàn)類(繼承 ServiceImpl)
package com.example.mp.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mp.entity.User;
import com.example.mp.mapper.UserMapper;
import com.example.mp.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 通用 Service 方法已全部實(shí)現(xiàn),無需編寫代碼
}(6)啟動(dòng)類
package com.example.mp;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 批量掃描 Mapper 接口(替代每個(gè) Mapper 加 @Mapper)
@MapperScan("com.example.mp.mapper")
@SpringBootApplication
public class MpDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MpDemoApplication.class, args);
}
}3. 核心功能使用示例
(1)通用 CRUD(Mapper 層)
package com.example.mp;
import com.example.mp.entity.User;
import com.example.mp.mapper.UserMapper;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class MapperCrudTest {
@Resource
private UserMapper userMapper;
// 新增
@Test
public void testInsert() {
User user = new User();
user.setUserName("張三");
user.setAge(25);
user.setEmail("zhangsan@example.com");
// insert 方法返回受影響行數(shù)
int rows = userMapper.insert(user);
System.out.println("新增行數(shù):" + rows + ",用戶ID:" + user.getId()); // 雪花算法生成ID
}
// 根據(jù)ID查詢
@Test
public void testSelectById() {
User user = userMapper.selectById(176928745896704L);
System.out.println("查詢結(jié)果:" + user);
}
// 查詢所有
@Test
public void testSelectList() {
List<User> userList = userMapper.selectList(null); // null 表示無條件
userList.forEach(System.out::println);
}
// 根據(jù)ID更新
@Test
public void testUpdateById() {
User user = new User();
user.setId(176928745896704L);
user.setAge(26); // 只更新age字段
int rows = userMapper.updateById(user);
System.out.println("更新行數(shù):" + rows);
}
// 根據(jù)ID刪除(邏輯刪除)
@Test
public void testDeleteById() {
int rows = userMapper.deleteById(176928745896704L);
System.out.println("刪除行數(shù):" + rows); // 實(shí)際執(zhí)行 UPDATE user SET deleted=1 WHERE id=?
}
}(2)條件構(gòu)造器(QueryWrapper/LambdaQueryWrapper)
@Test
public void testQueryWrapper() {
// 1. 普通 QueryWrapper(需手動(dòng)寫字段名,易出錯(cuò))
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25) // 等于
.like("user_name", "張") // 模糊查詢
.orderByDesc("create_time"); // 排序
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println("普通條件查詢:" + userList);
// 2. LambdaQueryWrapper(類型安全,推薦)
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getAge, 25)
.like(User::getUserName, "張")
.orderByDesc(User::getCreateTime);
List<User> lambdaList = userMapper.selectList(lambdaQuery);
System.out.println("Lambda條件查詢:" + lambdaList);
}(3)自動(dòng)分頁查詢
@Test
public void testPage() {
// 1. 構(gòu)建分頁對(duì)象(第1頁,每頁10條)
Page<User> page = new Page<>(1, 10);
// 2. 分頁查詢(條件為null表示無條件)
Page<User> resultPage = userMapper.selectPage(page, null);
// 3. 分頁結(jié)果解析
System.out.println("總條數(shù):" + resultPage.getTotal());
System.out.println("總頁數(shù):" + resultPage.getPages());
System.out.println("當(dāng)前頁數(shù)據(jù):" + resultPage.getRecords());
System.out.println("當(dāng)前頁碼:" + resultPage.getCurrent());
System.out.println("每頁條數(shù):" + resultPage.getSize());
}
// 自定義SQL分頁(如需自定義查詢)
// 1. Mapper 接口添加方法
// Page<User> selectUserPage(Page<User> page, @Param("ew") LambdaQueryWrapper<User> queryWrapper);
// 2. XML 編寫 SQL(無需寫 LIMIT,MP 自動(dòng)拼接)
// <select id="selectUserPage" resultType="User">
// SELECT * FROM user ${ew.customSqlSegment}
// </select>
// 3. 調(diào)用
// Page<User> page = new Page<>(1, 10);
// LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>().gt(User::getAge, 20);
// Page<User> result = userMapper.selectUserPage(page, query);(4)通用 Service 層使用(批量操作、分頁)
package com.example.mp;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mp.entity.User;
import com.example.mp.service.UserService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.List;
@SpringBootTest
public class ServiceCrudTest {
@Resource
private UserService userService;
// 批量新增
@Test
public void testSaveBatch() {
User user1 = new User();
user1.setUserName("李四");
user1.setAge(24);
User user2 = new User();
user2.setUserName("王五");
user2.setAge(26);
boolean success = userService.saveBatch(Arrays.asList(user1, user2));
System.out.println("批量新增是否成功:" + success);
}
// 分頁查詢(Service 層)
@Test
public void testServicePage() {
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>().gt(User::getAge, 20);
IPage<User> resultPage = userService.page(page, query);
System.out.println("Service分頁總條數(shù):" + resultPage.getTotal());
}
// 批量刪除
@Test
public void testRemoveBatchByIds() {
boolean success = userService.removeBatchByIds(Arrays.asList(176928745896704L, 176928745896705L));
System.out.println("批量刪除是否成功:" + success);
}
// 條件查詢單個(gè)結(jié)果
@Test
public void testGetOne() {
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>().eq(User::getUserName, "張三");
User user = userService.getOne(query, false); // false 表示不拋出多條結(jié)果異常
System.out.println("單個(gè)結(jié)果:" + user);
}
}四、MyBatis-Plus 高級(jí)功能
1. 樂觀鎖插件(解決并發(fā)更新)
(1)添加樂觀鎖字段
ALTER TABLE `user` ADD COLUMN `version` INT DEFAULT 1 COMMENT '樂觀鎖版本號(hào)';
(2)實(shí)體類添加注解
@Version // 標(biāo)記樂觀鎖字段 private Integer version;
(3)配置樂觀鎖插件
package com.example.mp.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
// 配置插件(分頁 + 樂觀鎖)
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分頁插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
// 樂觀鎖插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}(4)使用示例
@Test
public void testOptimisticLocker() {
// 1. 查詢用戶(獲取當(dāng)前版本號(hào))
User user = userMapper.selectById(176928745896704L);
// 2. 更新用戶
user.setAge(27);
int rows = userMapper.updateById(user);
// 并發(fā)場(chǎng)景下,若版本號(hào)不匹配,rows=0(更新失?。?
System.out.println("更新行數(shù):" + rows);
}2. 代碼生成器(AutoGenerator)
MP 提供了強(qiáng)大的代碼生成器,可一鍵生成全套代碼,減少重復(fù)勞動(dòng)。
(1)引入代碼生成器依賴
<!-- MyBatis-Plus 代碼生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 模板引擎(默認(rèn) Velocity) -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>(2)生成代碼示例
package com.example.mp;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import java.util.Collections;
public class CodeGenerator {
public static void main(String[] args) {
// 數(shù)據(jù)源配置
String url = "jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "123456";
// 快速生成代碼
FastAutoGenerator.create(url, username, password)
// 全局配置
.globalConfig(builder -> {
builder.author("mp-demo") // 設(shè)置作者
.outputDir(System.getProperty("user.dir") + "/src/main/java") // 輸出目錄
.enableSwagger() // 開啟 Swagger(如需)
.commentDate("yyyy-MM-dd") // 注釋日期格式
.disableOpenDir(); // 生成后不打開目錄
})
// 包配置
.packageConfig(builder -> {
builder.parent("com.example.mp") // 父包名
.moduleName("") // 模塊名(無則空)
.entity("entity") // 實(shí)體類包名
.mapper("mapper") // Mapper 包名
.service("service") // Service 包名
.controller("controller") // Controller 包名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml,
System.getProperty("user.dir") + "/src/main/resources/mapper")); // Mapper XML 路徑
})
// 策略配置
.strategyConfig(builder -> {
builder.addInclude("user") // 生成指定表(多個(gè)表用逗號(hào)分隔)
.addTablePrefix("t_", "sys_") // 過濾表前綴(如 t_user → User)
// 實(shí)體類策略
.entityBuilder()
.enableLombok() // 開啟 Lombok
.enableTableFieldAnnotation() // 生成字段注解
.idType(com.baomidou.mybatisplus.annotation.IdType.ASSIGN_ID) // 主鍵策略
// Mapper 策略
.mapperBuilder()
.enableBaseResultMap() // 生成 BaseResultMap
.enableBaseColumnList() // 生成 BaseColumnList
// Service 策略
.serviceBuilder()
.formatServiceFileName("%sService") // Service 命名格式
.formatServiceImplFileName("%sServiceImpl") // ServiceImpl 命名格式
// Controller 策略
.controllerBuilder()
.enableRestStyle(); // 開啟 RestController 風(fēng)格
})
// 執(zhí)行生成
.execute();
}
}3. 多數(shù)據(jù)源配置
MP 支持簡(jiǎn)單配置實(shí)現(xiàn)多數(shù)據(jù)源,適用于讀寫分離、分庫等場(chǎng)景。
(1)引入多數(shù)據(jù)源依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>(2)配置多數(shù)據(jù)源(application.yml)
spring:
datasource:
dynamic:
primary: master # 默認(rèn)數(shù)據(jù)源
strict: false # 關(guān)閉嚴(yán)格模式
datasource:
# 主庫
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo_master?useSSL=false
username: root
password: 123456
# 從庫
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo_slave?useSSL=false
username: root
password: 123456(3)使用多數(shù)據(jù)源(注解指定)
// Service 層指定數(shù)據(jù)源
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 主庫(默認(rèn))
public List<User> selectMaster() {
return baseMapper.selectList(null);
}
// 從庫
@DS("slave") // 指定從庫數(shù)據(jù)源
public List<User> selectSlave() {
return baseMapper.selectList(null);
}
}五、MyBatis-Plus 與 MyBatis 對(duì)比
| 維度 | MyBatis | MyBatis-Plus |
|---|---|---|
| 基礎(chǔ) CRUD | 需手動(dòng)編寫 XML / 注解 SQL | 繼承 BaseMapper/IService 直接用 |
| 動(dòng)態(tài) SQL | XML 標(biāo)簽(if/where/foreach) | 條件構(gòu)造器(鏈?zhǔn)骄幊蹋?/td> |
| 分頁 | 需集成 PageHelper | 內(nèi)置分頁插件,一鍵分頁 |
| 主鍵生成 | 需手動(dòng)配置 | 內(nèi)置多種策略(雪花算法 / 自增等) |
| 邏輯刪除 | 需手動(dòng)寫 SQL | 注解 + 自動(dòng)處理 |
| 代碼生成 | 無原生支持 | 一鍵生成全套代碼 |
| 兼容性 | 原生 MyBatis 語法 | 完全兼容 MyBatis,可混用 XML / 注解 |
六、最佳實(shí)踐
- 優(yōu)先使用 Lambda 條件構(gòu)造器:避免硬編碼字段名,減少拼寫錯(cuò)誤。
- 通用 CRUD 用 MP,復(fù)雜 SQL 用 XML:簡(jiǎn)單操作依賴 MP 通用方法,復(fù)雜關(guān)聯(lián)查詢?nèi)杂?MyBatis XML 更清晰。
- 合理使用邏輯刪除:避免物理刪除數(shù)據(jù),便于數(shù)據(jù)恢復(fù)和審計(jì)。
- 樂觀鎖用于并發(fā)更新:如庫存扣減、訂單狀態(tài)更新等場(chǎng)景。
- 代碼生成器提升效率:新項(xiàng)目初始化時(shí),用代碼生成器一鍵生成基礎(chǔ)代碼。
- 分頁查詢必用 Page 對(duì)象:避免手動(dòng)拼接 LIMIT,MP 自動(dòng)適配不同數(shù)據(jù)庫方言。
- 字段自動(dòng)填充統(tǒng)一處理:創(chuàng)建時(shí)間、更新時(shí)間等字段通過填充處理器統(tǒng)一管理,避免重復(fù)代碼。
七、總結(jié)
MyBatis-Plus 是 MyBatis 的 “黃金搭檔”,在保留 MyBatis 靈活性的同時(shí),大幅降低了開發(fā)成本:
- 核心價(jià)值:通用 CRUD 省去 80% 重復(fù) SQL 編寫,條件構(gòu)造器簡(jiǎn)化動(dòng)態(tài) SQL,內(nèi)置功能覆蓋大部分業(yè)務(wù)場(chǎng)景。
- Spring Boot 集成:僅需引入依賴 + 簡(jiǎn)單配置,即可快速使用所有增強(qiáng)功能,完全兼容 MyBatis 原有代碼。
- 適用場(chǎng)景:中小項(xiàng)目可完全基于 MP 開發(fā),大型項(xiàng)目可混合使用 MP 通用方法 + MyBatis 復(fù)雜 SQL,兼顧效率與靈活性。
掌握 MyBatis-Plus 的關(guān)鍵是理解通用 CRUD 接口和條件構(gòu)造器,在此基礎(chǔ)上結(jié)合分頁、樂觀鎖、代碼生成器等高級(jí)功能,可極大提升開發(fā)效率。
到此這篇關(guān)于MyBatis-Plus 全面介紹與Spring Boot 集成最佳實(shí)踐的文章就介紹到這了,更多相關(guān)MyBatis-Plus Spring Boot 集成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot集成Mybatis-plus-join-boot-start詳解
- SpringBoot同時(shí)集成Mybatis和Mybatis-plus框架
- SpringBoot與MyBatis-Plus的高效集成方式
- springboot集成mybatis-plus全過程
- Springboot集成Mybatis-plus、ClickHouse實(shí)現(xiàn)增加數(shù)據(jù)、查詢數(shù)據(jù)功能
- 解決springboot3.2集成mybatis-plus3.5.4.1報(bào)錯(cuò)的問題
- 一文詳解Springboot集成mybatis-plus
- springBoot集成mybatis 轉(zhuǎn)換為 mybatis-plus方式
- springboot快速集成mybatis-plus的詳細(xì)教程
相關(guān)文章
解析springBoot-actuator項(xiàng)目構(gòu)造中health端點(diǎn)工作原理
這篇文章主要介紹了springBoot-actuator中health端點(diǎn)工作原理,對(duì)spring-boot-actuator的項(xiàng)目構(gòu)造,工作原理進(jìn)行了全面的梳理,側(cè)重health健康檢查部分2022-02-02
java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07

