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

MyBatisPlus靜態(tài)工具Db的實(shí)現(xiàn)方法

 更新時(shí)間:2026年03月04日 10:52:55   作者:ruleslol  
Db是MyBatis-Plus3.5.4+提供的靜態(tài)工具類,無需注入Service或Mapper,直接通過靜態(tài)方法操作數(shù)據(jù)庫,本文就來詳細(xì)的介紹一下MyBatisPlus靜態(tài)工具Db的實(shí)現(xiàn),感興趣的可以了解一下

什么是Db?

Db 是 MyBatis-Plus 3.5.4+ 提供的靜態(tài)工具類,無需注入 ServiceMapper直接通過靜態(tài)方法操作數(shù)據(jù)庫。本質(zhì)上是對(duì) IService 的靜態(tài)封裝。

// 傳統(tǒng)方式:需要注入
@Autowired
private UserService userService;
userService.getById(1);

// Db 靜態(tài)工具:直接調(diào)用
Db.getById(1, User.class);

一、靜態(tài)工具Db常用方法:

IService接口是非靜態(tài)的,需要自定義接口,并且繼承它,繼承它的過程中還要指定泛型(實(shí)體類的類型),目的:通過發(fā)射,得到實(shí)體類的字節(jié)碼,才能知道表信息,才能實(shí)現(xiàn)CRUD。

靜態(tài)方法是沒有辦法讀取到類上的泛型的,所以,Db上是沒有泛型的,它的方法都需要一個(gè)實(shí)體類的字節(jié)碼class<T>,才能通過反射拿到實(shí)體類的相關(guān)信息。

二、核心使用場(chǎng)景

場(chǎng)景一:解決循環(huán)依賴問題 ? 最常用

這是 Db 最重要的使用場(chǎng)景。當(dāng)兩個(gè) Service 互相依賴時(shí),用 Db 打破循環(huán)。

// ? 傳統(tǒng)方式:循環(huán)依賴,Spring 啟動(dòng)報(bào)錯(cuò)
@Service
public class OrderService {
    @Autowired
    private UserService userService; // OrderService 依賴 UserService
}

@Service
public class UserService {
    @Autowired
    private OrderService orderService; // UserService 又依賴 OrderService
}

示例:

【注意】:

service比mapper可用的方法更多!

場(chǎng)景二:在非 Service 層直接操作數(shù)據(jù)庫

Mapper、工具類、定時(shí)任務(wù)、事件監(jiān)聽器等無法方便注入 Service 的地方直接使用。

// 定時(shí)任務(wù)中直接操作數(shù)據(jù)庫
@Component
public class DataCleanTask {

    @Scheduled(cron = "0 0 2 * * ?")
    public void cleanExpiredData() {
        // 不需要注入任何 Service,直接靜態(tài)調(diào)用
        Db.remove(new LambdaQueryWrapper<Order>()
            .lt(Order::getExpireTime, LocalDateTime.now())
            .eq(Order::getStatus, "EXPIRED")
        );
        
        System.out.println("過期數(shù)據(jù)清理完成");
    }
}
// 事件監(jiān)聽器中使用
@Component
public class UserEventListener {

    @EventListener
    public void onUserRegister(UserRegisterEvent event) {
        // 直接保存初始積分記錄,無需注入 PointService
        UserPoint point = new UserPoint();
        point.setUserId(event.getUserId());
        point.setPoint(100);
        Db.save(point);
    }
}

場(chǎng)景三:實(shí)體類內(nèi)部直接關(guān)聯(lián)查詢

讓實(shí)體類自己完成關(guān)聯(lián)數(shù)據(jù)的獲取,VO 轉(zhuǎn)換更優(yōu)雅。

@Data
@TableName("order")
public class Order {
    private Long id;
    private Long userId;
    private Long productId;
    private Integer amount;

    // 實(shí)體類內(nèi)部直接查關(guān)聯(lián)數(shù)據(jù)
    @TableField(exist = false)
    public User getUser() {
        return Db.getById(this.userId, User.class);
    }

    @TableField(exist = false)
    public Product getProduct() {
        return Db.getById(this.productId, Product.class);
    }
}

場(chǎng)景四:批量操作

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public void batchInsert() {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            users.add(new User("name" + i, i));
        }
        // 靜態(tài)批量插入,batchSize 默認(rèn) 1000
        Db.saveBatch(users);
        // 也可以指定 batchSize
        Db.saveBatch(users, 500);
    }

    public void batchUpdateById() {
        List<User> users = Db.list(new LambdaQueryWrapper<User>()
            .eq(User::getStatus, 0));
        
        users.forEach(u -> u.setStatus(1));
        
        // 批量更新
        Db.updateBatchById(users);
    }
}

三、常用 API 速查

// ====== 查詢 ======
// 根據(jù) ID 查詢
User user = Db.getById(1L, User.class);

// 條件查詢單條
User user = Db.getOne(new LambdaQueryWrapper<User>()
    .eq(User::getName, "張三"));

// 查詢列表
List<User> users = Db.list(new LambdaQueryWrapper<User>()
    .eq(User::getStatus, 1));

// 查詢數(shù)量
long count = Db.count(new LambdaQueryWrapper<User>()
    .eq(User::getStatus, 1));

// 分頁查詢
Page<User> page = Db.page(new Page<>(1, 10), 
    new LambdaQueryWrapper<User>().eq(User::getStatus, 1));

// ====== 插入 ======
Db.save(user);
Db.saveBatch(userList);
Db.saveBatch(userList, 500);

// ====== 更新 ======
Db.updateById(user);
Db.update(user, new LambdaQueryWrapper<User>()
    .eq(User::getName, "張三"));
Db.updateBatchById(userList);

// 有則更新,無則插入
Db.saveOrUpdate(user);

// ====== 刪除 ======
Db.removeById(1L, User.class);
Db.remove(new LambdaQueryWrapper<User>()
    .eq(User::getStatus, 0));
Db.removeByIds(idList, User.class);

總結(jié)

對(duì)比項(xiàng)傳統(tǒng) Service 注入Db 靜態(tài)工具
使用方式需要 @Autowired 注入直接靜態(tài)調(diào)用
循環(huán)依賴容易出現(xiàn)完全避免
適用場(chǎng)景主業(yè)務(wù)邏輯層輔助查詢、工具類、監(jiān)聽器
版本要求無限制MP 3.5.4+

最佳實(shí)踐:主業(yè)務(wù)邏輯仍寫在 Service 中,跨 Service 的輔助查詢、關(guān)聯(lián)數(shù)據(jù)獲取用 Db 靜態(tài)工具,兩者配合使用效果最佳。

 到此這篇關(guān)于MyBatisPlus靜態(tài)工具Db的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)MyBatisPlus靜態(tài)工具Db內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中JDBC連接數(shù)據(jù)庫詳解

    Java中JDBC連接數(shù)據(jù)庫詳解

    本文主要介紹了JDBC連接數(shù)據(jù)庫的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解

    Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解

    這篇文章主要介紹了Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解,說到異步執(zhí)行,很多小伙伴首先想到Spring中提供的@Async注解,但是Spring提供的異步執(zhí)行任務(wù)能力并不足以解決我們當(dāng)前的需求,需要的朋友可以參考下
    2023-11-11
  • 基于CyclicBarrier和CountDownLatch的使用區(qū)別說明

    基于CyclicBarrier和CountDownLatch的使用區(qū)別說明

    這篇文章主要介紹了基于CyclicBarrier和CountDownLatch的使用區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring MVC創(chuàng)建項(xiàng)目踩過的bug

    Spring MVC創(chuàng)建項(xiàng)目踩過的bug

    這篇文章主要介紹了Spring MVC創(chuàng)建項(xiàng)目踩過的bug,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能

    基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能

    一般來說大模型的響應(yīng)速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結(jié)果,我們通常會(huì)使用流式輸出一點(diǎn)點(diǎn)將結(jié)果輸出給用戶,那么問題來了,想要實(shí)現(xiàn)流式結(jié)果輸出,后端和前端要如何配合?下來本文給出具體的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2025-02-02
  • java中原碼、反碼與補(bǔ)碼的問題分析

    java中原碼、反碼與補(bǔ)碼的問題分析

    本篇文章介紹了,在java中原碼、反碼與補(bǔ)碼的問題分析。需要的朋友參考下
    2013-04-04
  • JVM虛擬機(jī)的類加載機(jī)制詳解

    JVM虛擬機(jī)的類加載機(jī)制詳解

    這篇文章主要介紹了JVM虛擬機(jī)的類加載機(jī)制詳解,類是在運(yùn)行期間第一次使用時(shí)動(dòng)態(tài)加載的,而不是一次性加載所有類,因?yàn)槿绻淮涡约虞d,那么會(huì)占用很多的內(nèi)存,需要的朋友可以參考下
    2023-12-12
  • idea配置全局變量Jdk、maven倉庫以及maven詳解(全文圖解)

    idea配置全局變量Jdk、maven倉庫以及maven詳解(全文圖解)

    這篇文章主要給大家介紹了關(guān)于idea配置全局變量Jdk、maven倉庫以及maven的相關(guān)資料,在配置JDK和Maven之前,需要確保已經(jīng)正確安裝了JDK和Maven,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié))

    servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié))

    在利用servlet或Filter進(jìn)行url請(qǐng)求的匹配時(shí),很關(guān)鍵的一點(diǎn)就是匹配規(guī)則。這篇文章主要介紹了servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-07-07
  • maven中下載jar包源碼和javadoc的命令介紹

    maven中下載jar包源碼和javadoc的命令介紹

    這篇文章主要介紹了maven中下載jar包源碼和javadoc的命令介紹,本文講解了Maven命令下載源碼和javadocs、通過配置文件添加、配置eclipse等內(nèi)容,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

柳林县| 平陆县| 资阳市| 砚山县| 吉安市| 隆化县| 成武县| 普格县| 南昌县| 化隆| 长宁县| 柏乡县| 余姚市| 北流市| 定结县| 藁城市| 石楼县| 行唐县| 隆化县| 阿合奇县| 崇阳县| 黄冈市| 江达县| 南江县| 江津市| 湖北省| 信丰县| 庆安县| 介休市| 定州市| 兰州市| 枣阳市| 安吉县| 长兴县| 民勤县| 金平| 财经| 财经| 平乐县| 太白县| 秭归县|