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

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

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

什么是Db?

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

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

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

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

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

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

二、核心使用場景

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

這是 Db 最重要的使用場景。當兩個 Service 互相依賴時,用 Db 打破循環(huán)。

// ? 傳統方式:循環(huán)依賴,Spring 啟動報錯
@Service
public class OrderService {
    @Autowired
    private UserService userService; // OrderService 依賴 UserService
}

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

示例:

【注意】:

service比mapper可用的方法更多!

場景二:在非 Service 層直接操作數據庫

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

// 定時任務中直接操作數據庫
@Component
public class DataCleanTask {

    @Scheduled(cron = "0 0 2 * * ?")
    public void cleanExpiredData() {
        // 不需要注入任何 Service,直接靜態(tài)調用
        Db.remove(new LambdaQueryWrapper<Order>()
            .lt(Order::getExpireTime, LocalDateTime.now())
            .eq(Order::getStatus, "EXPIRED")
        );
        
        System.out.println("過期數據清理完成");
    }
}
// 事件監(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);
    }
}

場景三:實體類內部直接關聯查詢

讓實體類自己完成關聯數據的獲取,VO 轉換更優(yōu)雅。

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

    // 實體類內部直接查關聯數據
    @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);
    }
}

場景四:批量操作

@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 默認 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 速查

// ====== 查詢 ======
// 根據 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));

// 查詢數量
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);

總結

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

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

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

相關文章

  • Java中JDBC連接數據庫詳解

    Java中JDBC連接數據庫詳解

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

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

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

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

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

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

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

    基于SpringAI+DeepSeek實現流式對話功能

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

    java中原碼、反碼與補碼的問題分析

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

    JVM虛擬機的類加載機制詳解

    這篇文章主要介紹了JVM虛擬機的類加載機制詳解,類是在運行期間第一次使用時動態(tài)加載的,而不是一次性加載所有類,因為如果一次性加載,那么會占用很多的內存,需要的朋友可以參考下
    2023-12-12
  • idea配置全局變量Jdk、maven倉庫以及maven詳解(全文圖解)

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

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

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

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

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

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

最新評論

佛教| 景德镇市| 蚌埠市| 稷山县| 蒙阴县| 昌江| 游戏| 南昌市| 美姑县| 昭平县| 绥棱县| 庄河市| 容城县| 丹阳市| 嫩江县| 永春县| 尤溪县| 出国| 迁安市| 左权县| 新和县| 眉山市| 新丰县| 晴隆县| 永安市| 比如县| 皋兰县| 峡江县| 西安市| 天水市| 云浮市| 延津县| 梁山县| 桦川县| 彭阳县| 新兴县| 科技| 岳阳县| 扶余县| 太和县| 阜阳市|