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

Spring?Boot?3.0?+?MyBatis-Plus全家桶實(shí)戰(zhàn)詳細(xì)代碼

 更新時(shí)間:2025年10月29日 11:50:13   作者:云起川南  
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,是國(guó)內(nèi)人員開(kāi)發(fā)的MyBatis增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,這篇文章主要介紹了Spring?Boot?3.0?+?MyBatis-Plus全家桶的相關(guān)資料,需要的朋友可以參考下

概要

從依賴、配置、實(shí)體/Mapper、分頁(yè)、常用插件(邏輯刪除、樂(lè)觀鎖)、以及簡(jiǎn)單的示例接口講起。代碼可直接復(fù)制到項(xiàng)目里跑通。文中引用 MyBatis-Plus 官方與社區(qū)資料以保證兼容性與最佳實(shí)踐。

1. 項(xiàng)目說(shuō)明與目標(biāo)

目標(biāo):在 Spring Boot 3.0 項(xiàng)目中集成 MyBatis-Plus,實(shí)現(xiàn)標(biāo)準(zhǔn)的增刪改查、分頁(yè)與常見(jiàn)插件(邏輯刪除、樂(lè)觀鎖),并演示一個(gè)可運(yùn)行的示例接口供快速上手。MyBatis-Plus 官方提供 Spring Boot 3 的 starter,且社區(qū)維護(hù)活躍

2. 快速依賴(Maven)

pom.xml 關(guān)鍵依賴(只展示最重要的部分):

<properties>
    <java.version>17</java.version>
    <spring-boot.version>3.0.8</spring-boot.version> <!-- 任選 Spring Boot 3.0.x -->
    <mybatis-plus.version>3.5.12</mybatis-plus.version> <!-- 官方 Maven 中央庫(kù)示例版本 -->
</properties>

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter JDBC / DataSource -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <!-- MyBatis-Plus Spring Boot 3 starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>${mybatis-plus.version}</version>
    </dependency>

    <!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng)(示例用 MySQL) -->
    <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>

    <!-- 測(cè)試 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

注:使用 mybatis-plus-spring-boot3-starter 是推薦方式,官方/中央倉(cāng)庫(kù)有發(fā)布包可用。

3. 配置文件 application.yml

示例(MySQL):

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    # 駝峰映射:數(shù)據(jù)庫(kù) user_name -> Java userName
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      logic-delete-field: deleted     # 邏輯刪除字段名(可選)
      logic-delete-value: 1
      logic-not-delete-value: 0
  # mapper xml 路徑(若使用 xml)
  mapper-locations: classpath:/mapper/**/*.xml
  type-aliases-package: com.example.demo.entity

解釋:

  • map-underscore-to-camel-case:開(kāi)啟下劃線->駝峰映射;
  • mapper-locations:若使用 XML 映射文件需要設(shè)置路徑;
  • global-config.db-config.logic-delete-field:配置邏輯刪除字段(如果你使用邏輯刪除插件/注解)。

4. 實(shí)體、Mapper、Mapper XML(或注解)

4.1 數(shù)據(jù)庫(kù)表(示例)

CREATE TABLE user (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(100),
  email VARCHAR(200),
  age INT,
  version INT DEFAULT 0,
  deleted TINYINT DEFAULT 0,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

4.2 實(shí)體類(lèi) User.java

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;
    private String email;
    private Integer age;

    @Version
    private Integer version; // 樂(lè)觀鎖字段,@Version 標(biāo)注

    @TableLogic
    private Integer deleted; // 邏輯刪除,0 未刪除,1 已刪除

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
}

說(shuō)明:

  • @TableId:主鍵策略;
  • @Version:開(kāi)啟樂(lè)觀鎖支持(需配合插件);
  • @TableLogic:邏輯刪除字段(MyBatis-Plus 會(huì)在 DELETE 時(shí)改寫(xiě)成更新已刪除標(biāo)志)。

4.3 Mapper 接口 UserMapper.java

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // BaseMapper 已經(jīng)包含常見(jiàn) CRUD 方法(insert, deleteById, updateById, selectById, selectList...)
    // 可擴(kuò)展自定義方法
}

MyBatis-Plus 提供 BaseMapper<T>,大幅減少重復(fù) DAO 代碼。

5. Service + Controller 快速 CRUD 示例

5.1 Service(直接使用 MP 的 Service 接口)

如果你喜歡 Service 層抽象,可以使用 MyBatis-Plus 的 IService 與 ServiceImpl:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;

public interface IUserService extends IService<User> {
    // 自定義業(yè)務(wù)方法可以在這里擴(kuò)展
}

實(shí)現(xiàn)類(lèi):

package com.example.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.IUserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    // 使用內(nèi)置的 save/update/getById/list 等方法
}

5.2 Controller 示例

package com.example.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.service.IUserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    @Resource
    private IUserService userService;

    @GetMapping("/{id}")
    public User get(@PathVariable Long id) {
        return userService.getById(id);
    }

    @GetMapping
    public Page<User> list(@RequestParam(defaultValue = "1") long page,
                           @RequestParam(defaultValue = "10") long size,
                           @RequestParam(required = false) String name) {
        Page<User> p = new Page<>(page, size);
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        if (name != null && !name.isEmpty()) {
            wrapper.like(User::getUsername, name);
        }
        return userService.page(p, wrapper);
    }

    @PostMapping
    public boolean create(@RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping("/{id}")
    public boolean update(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return userService.updateById(user);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Long id) {
        // 若啟用了邏輯刪除,則會(huì)被標(biāo)記為已刪除
        return userService.removeById(id);
    }
}

說(shuō)明:

  • userService.page(page, wrapper):內(nèi)置分頁(yè)接口,配合分頁(yè)插件使用;
  • LambdaQueryWrapper:類(lèi)型安全的條件構(gòu)造器(避免寫(xiě)錯(cuò)字段名)。

6. 分頁(yè)與條件構(gòu)造器重點(diǎn)說(shuō)明

  • MyBatis-Plus 的分頁(yè)是插件驅(qū)動(dòng):需要配置分頁(yè)插件(下一節(jié)會(huì)展示)。分頁(yè)查詢只要傳入 Page 對(duì)象即可自動(dòng)分頁(yè)并返回 IPage/Page 對(duì)象。
  • QueryWrapper 和 LambdaQueryWrapper 是常用的條件構(gòu)造器,Lambda 方式優(yōu)點(diǎn)是重命名/重構(gòu)字段更安全。
    示例(復(fù)合條件):
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(User::getAge, 18)
       .le(User::getAge, 40)
       .like(User::getUsername, "張");

7. 常見(jiàn)插件配置(分頁(yè) / 樂(lè)觀鎖 / 邏輯刪除 / 自動(dòng)填充)

在 Spring Boot 的配置類(lèi)中注冊(cè)插件。

package com.example.demo.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分頁(yè)(針對(duì) MySQL)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        // 樂(lè)觀鎖
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 其他插件(如防止全表更新等)可在此追加
        return interceptor;
    }
}

說(shuō)明要點(diǎn):

  • PaginationInnerInterceptor:負(fù)責(zé)分頁(yè)攔截;
  • OptimisticLockerInnerInterceptor:?jiǎn)⒂?@Version 樂(lè)觀鎖注解支持;
  • 邏輯刪除在實(shí)體上加 @TableLogic,并在 application.yml 做對(duì)齊配置(見(jiàn)上文)。
  • 官方文檔對(duì)這些功能有說(shuō)明,建議參考官方快速入門(mén)與配置章節(jié)。

8. 常見(jiàn)問(wèn)題與調(diào)試技巧

1. SQL 不打???

  • 配置日志級(jí)別(application.yml):
logging:
  level:
    com.baomidou.mybatisplus: debug
    org.mybatis: debug
    com.example.demo: debug

或使用 mybatis-plus.configuration.log-impl 指定 Slf4jImpl(部分版本需要)。查看日志可以幫助定位 SQL 與參數(shù)

2. 分頁(yè)不起作用

  • 確認(rèn)注冊(cè)了 MybatisPlusInterceptor 與 PaginationInnerInterceptor。
  • 確認(rèn)調(diào)用 page(new Page<>(page, size), wrapper) 而不是自己寫(xiě) limit。

3. 樂(lè)觀鎖失敗卻無(wú)異常

  • 需要在實(shí)體上標(biāo)注 @Version 并在更新時(shí)使用 updateById / update,MP 會(huì)自動(dòng)帶上版本條件(WHERE version = ?),如果更新條數(shù)為 0表示沖突。

4. 邏輯刪除仍能被查詢到

  • 確認(rèn)實(shí)體字段有 @TableLogic,同時(shí) global-config.db-config 的logic-delete-field/值是否對(duì)應(yīng)。MP 會(huì)在查詢時(shí)自動(dòng)過(guò)濾被標(biāo)記的行。

5. Mapper XML 與 注解 混用

  • 若使用 XML,確保 mapperLocations 指向 XML 路徑,且 @MapperScan 或 @Mapper 在 mapper
    接口上生效。

9. 小結(jié)(為什么選 MyBatis-Plus)

  • MyBatis-Plus 在 MyBatis 基礎(chǔ)上做了大量“零侵入”增強(qiáng),提供了 BaseMapper、條件構(gòu)造器、分頁(yè)、代碼生成器等常用工具,大幅減少模板 CRUD 代碼。官方和社區(qū)對(duì) Spring Boot 3 有專門(mén)的 starter,方便集成

10. 參考 & 延伸閱讀

  • MyBatis-Plus 官方文檔(快速開(kāi)始 / 插件 / 分頁(yè) / 代碼生成等)。
  • MyBatis-Plus 在 Maven 中央倉(cāng)庫(kù)的 artifact 列表(查看可用版本)。
  • GitHub 源碼和示例倉(cāng)庫(kù)(官方/社區(qū))。
  • Baeldung 的 MyBatis-Plus 入門(mén)文章(英文參考)

到此這篇關(guān)于Spring Boot 3.0 + MyBatis-Plus全家桶實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Spring Boot 3.0+MyBatis-Plus全家桶內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson

    Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson

    這篇文章主要介紹了Java中對(duì)象?和?json?互轉(zhuǎn)?四種方式?json-lib、Gson、FastJson、Jackson,需要的朋友可以參考下
    2023-11-11
  • Java代碼實(shí)現(xiàn)微信頁(yè)面滾動(dòng)防露底(核心代碼)

    Java代碼實(shí)現(xiàn)微信頁(yè)面滾動(dòng)防露底(核心代碼)

    這篇文章主要介紹了Java代碼實(shí)現(xiàn)微信頁(yè)面滾動(dòng)防露底的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • 如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件

    如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件

    這篇文章主要介紹了如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 解決使用@ResponseBody后返回500錯(cuò)誤的問(wèn)題

    解決使用@ResponseBody后返回500錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了解決使用@ResponseBody后返回500錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP

    Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP

    這篇文章主要介紹了如何用Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP,幫助大家為了更好的理解和學(xué)習(xí)AOP的思想,感興趣的朋友可以了解下
    2020-08-08
  • Java死鎖產(chǎn)生原因及示例

    Java死鎖產(chǎn)生原因及示例

    本文主要介紹了Java死鎖產(chǎn)生原因及示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java實(shí)現(xiàn)TCP互發(fā)消息

    Java實(shí)現(xiàn)TCP互發(fā)消息

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)TCP互發(fā)消息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • java之Objects.nonNull用法代碼解讀

    java之Objects.nonNull用法代碼解讀

    這篇文章主要介紹了java之Objects.nonNull用法代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java動(dòng)態(tài)代理和反射機(jī)制詳解

    Java動(dòng)態(tài)代理和反射機(jī)制詳解

    這篇文章主要介紹了Java動(dòng)態(tài)代理和反射機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中EnumMap代替序數(shù)索引代碼詳解

    Java中EnumMap代替序數(shù)索引代碼詳解

    這篇文章主要介紹了Java中EnumMap代替序數(shù)索引代碼詳解,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

襄樊市| 淅川县| 阿图什市| SHOW| 富源县| 山东| 永康市| 云南省| 金寨县| 儋州市| 蓬莱市| 长垣县| 韶关市| 阳城县| 克东县| 河西区| 英超| 乌鲁木齐市| 江城| 开鲁县| 神池县| 香河县| 马公市| 油尖旺区| 南投市| 黔南| 黄石市| 四平市| 宽城| 淮北市| 大英县| 涡阳县| 融水| 佛山市| 金门县| 榆中县| 芜湖县| 贵港市| 奉新县| 舒兰市| 杭州市|