最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus 全面介紹與Spring Boot 集成最佳實(shí)踐

 更新時(shí)間:2025年12月17日 16:12:04   作者:阿拉斯攀登  
MyBatis-Plus是MyBatis的增強(qiáng)工具,提供了通用CRUD、分頁、條件構(gòu)造器等功能,簡(jiǎn)化了開發(fā),減少重復(fù)SQL編寫,它支持多種主鍵生成策略,內(nèi)置樂觀鎖和邏輯刪除,且兼容MyBatis原有代碼,本文介紹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ì)比

維度MyBatisMyBatis-Plus
基礎(chǔ) CRUD需手動(dòng)編寫 XML / 注解 SQL繼承 BaseMapper/IService 直接用
動(dòng)態(tài) SQLXML 標(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í)踐

  1. 優(yōu)先使用 Lambda 條件構(gòu)造器:避免硬編碼字段名,減少拼寫錯(cuò)誤。
  2. 通用 CRUD 用 MP,復(fù)雜 SQL 用 XML:簡(jiǎn)單操作依賴 MP 通用方法,復(fù)雜關(guān)聯(lián)查詢?nèi)杂?MyBatis XML 更清晰。
  3. 合理使用邏輯刪除:避免物理刪除數(shù)據(jù),便于數(shù)據(jù)恢復(fù)和審計(jì)。
  4. 樂觀鎖用于并發(fā)更新:如庫存扣減、訂單狀態(tài)更新等場(chǎng)景。
  5. 代碼生成器提升效率:新項(xiàng)目初始化時(shí),用代碼生成器一鍵生成基礎(chǔ)代碼。
  6. 分頁查詢必用 Page 對(duì)象:避免手動(dòng)拼接 LIMIT,MP 自動(dòng)適配不同數(shù)據(jù)庫方言。
  7. 字段自動(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java編譯器和JVM的區(qū)別

    java編譯器和JVM的區(qū)別

    在本篇文章里小編給大家整理的是一篇關(guān)于java編譯器和JVM的區(qū)別的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Java 求解如何把二叉搜索樹轉(zhuǎn)換為累加樹

    Java 求解如何把二叉搜索樹轉(zhuǎn)換為累加樹

    這篇文章主要介紹了Java 求解把二叉搜索樹轉(zhuǎn)換為累加樹的代碼,總之需要觀察示例節(jié)點(diǎn)的規(guī)律,需要記錄上個(gè)節(jié)點(diǎn)的情況,注意引入前驅(qū)節(jié)點(diǎn)pre,具體實(shí)例代碼跟隨小編一起看看吧
    2021-11-11
  • 解析springBoot-actuator項(xiàng)目構(gòu)造中health端點(diǎ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)

    這篇文章主要介紹了java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • spring中的注解事務(wù)演示和添加步驟詳情

    spring中的注解事務(wù)演示和添加步驟詳情

    這篇文章主要介紹了spring中的注解事務(wù)演示和添加步驟詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • SpringIoC與SpringDI詳解

    SpringIoC與SpringDI詳解

    本文介紹了Spring框架中的IoC(控制反轉(zhuǎn))和DI(依賴注入)概念,以及如何在Spring中使用這些概念來管理對(duì)象和依賴關(guān)系,感興趣的朋友一起看看吧
    2025-03-03
  • 詳解Java并發(fā)包基石AQS

    詳解Java并發(fā)包基石AQS

    Java并發(fā)包(JUC)中提供了很多并發(fā)工具,這其中,很多我們耳熟能詳?shù)牟l(fā)工具,譬如ReentrangLock、Semaphore,它們的實(shí)現(xiàn)都用到了一個(gè)共同的基類--AbstractQueuedSynchronizer,簡(jiǎn)稱AQS。本文將從幾個(gè)方面來詳細(xì)介紹:基本實(shí)現(xiàn)原理、自定義同步器、源碼分析
    2021-06-06
  • jsp中存取session值簡(jiǎn)單介紹

    jsp中存取session值簡(jiǎn)單介紹

    這篇文章主要介紹了jsp中存取session值簡(jiǎn)單介紹,涉及request和session的域操作等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 淺談Slf4j與其他日志系統(tǒng)兼容的使用方法

    淺談Slf4j與其他日志系統(tǒng)兼容的使用方法

    下面小編就為大家分享一篇淺談Slf4j與其他日志系統(tǒng)兼容的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Netty與NIO超詳細(xì)講解

    Netty與NIO超詳細(xì)講解

    Netty本質(zhì)上是一個(gè)NIO的框架,適用于服務(wù)器通訊相關(guān)的多種應(yīng)用場(chǎng)景。底層是NIO,NIO底層是Java?IO和網(wǎng)絡(luò)IO,再往下是TCP/IP協(xié)議,下面我們跟隨文章來詳細(xì)了解
    2022-08-08

最新評(píng)論

静安区| 大同市| 长汀县| 翁源县| 阳新县| 隆安县| 垦利县| 苗栗市| 舟曲县| 舞钢市| 琼结县| 九江县| 冷水江市| SHOW| 墨竹工卡县| 辽宁省| 贵阳市| 景东| 竹溪县| 乌兰县| 云南省| 山丹县| 娄烦县| 瑞昌市| 隆昌县| 合江县| 涞水县| 仁化县| 宜城市| 井陉县| 清徐县| 大邑县| 江津市| 勐海县| 昌吉市| 肥东县| 重庆市| 武陟县| 商河县| 勃利县| 永宁县|