MyBatisPlus静态工具Db的实现方法

 更新时间:2026年03月04日 10:52:55   作者:ruleslol  
Db是MyBatis-Plus3.5.4+提供的静态工具类,无需注入Service或Mapper,直接通过静态方法操作数据库,本文就来详细的介绍一下MyBatisPlus静态工具Db的实现,感兴趣的可以了解一下

什么是Db?

Db 是 MyBatis-Plus 3.5.4+ 提供的静态工具类,无需注入 ServiceMapper直接通过静态方法操作数据库。本质上是对 IService 的静态封装。

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

// Db 静态工具:直接调用
Db.getById(1, User.class);

一、静态工具Db常用方法:

IService接口是非静态的,需要自定义接口,并且继承它,继承它的过程中还要指定泛型(实体类的类型),目的:通过发射,得到实体类的字节码,才能知道表信息,才能实现CRUD。

静态方法是没有办法读取到类上的泛型的,所以,Db上是没有泛型的,它的方法都需要一个实体类的字节码class<T>,才能通过反射拿到实体类的相关信息。

二、核心使用场景

场景一:解决循环依赖问题 ⭐ 最常用

这是 Db 最重要的使用场景。当两个 Service 互相依赖时,用 Db 打破循环。

// ❌ 传统方式:循环依赖,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、工具类、定时任务、事件监听器等无法方便注入 Service 的地方直接使用。

// 定时任务中直接操作数据库
@Component
public class DataCleanTask {

    @Scheduled(cron = "0 0 2 * * ?")
    public void cleanExpiredData() {
        // 不需要注入任何 Service,直接静态调用
        Db.remove(new LambdaQueryWrapper<Order>()
            .lt(Order::getExpireTime, LocalDateTime.now())
            .eq(Order::getStatus, "EXPIRED")
        );
        
        System.out.println("过期数据清理完成");
    }
}
// 事件监听器中使用
@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 转换更优雅。

@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));
        }
        // 静态批量插入,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 静态工具
使用方式需要 @Autowired 注入直接静态调用
循环依赖容易出现完全避免
适用场景主业务逻辑层辅助查询、工具类、监听器
版本要求无限制MP 3.5.4+

最佳实践:主业务逻辑仍写在 Service 中,跨 Service 的辅助查询、关联数据获取用 Db 静态工具,两者配合使用效果最佳。

 到此这篇关于MyBatisPlus静态工具Db的实现方法的文章就介绍到这了,更多相关MyBatisPlus静态工具Db内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot项目Redis统计在线用户的实现示例

    springboot项目Redis统计在线用户的实现示例

    最近做个项目需要统计在线用户,本文主要介绍了springboot项目Redis统计在线用户的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 详解Java线程堆栈

    详解Java线程堆栈

    本篇文章主要给大家讲了Java线程堆栈的详细原理以及用法,需要的朋友跟着学习下吧。
    2017-12-12
  • Springboot获取文件内容如何将MultipartFile转File

    Springboot获取文件内容如何将MultipartFile转File

    本文给大家介绍Springboot获取文件内容,将MultipartFile转File方法,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • Java并发编程中使用Executors类创建和管理线程的用法

    Java并发编程中使用Executors类创建和管理线程的用法

    这篇文章主要介绍了Java并发编程中使用Executors类创建和管理线程的用法,文中举了用其启动线程和设置线程优先级的例子,需要的朋友可以参考下
    2016-03-03
  • Spring的事件监听机制示例详解

    Spring的事件监听机制示例详解

    这篇文章主要给大家介绍了关于Spring的事件监听机制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Elasticsearch常用DSL语法巧记

    Elasticsearch常用DSL语法巧记

    这篇文章主要为大家介绍了Elasticsearch常用DSL语法巧记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • springboot中报错Invalid character found in the request的解决

    springboot中报错Invalid character found in 

    这篇文章主要介绍了springboot中报错Invalid character found in the request的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Java struts2 validate用户登录校验功能实现

    Java struts2 validate用户登录校验功能实现

    这篇文章主要为大家详细介绍了Java struts2 validate用户登录校验功能实现的具体步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java中ArrayList与顺序表的定义与实现方法

    Java中ArrayList与顺序表的定义与实现方法

    ArrayList是一个实现List接口的类,底层是动态类型顺序表,本质也就是数组,动态主要体现在它的扩容机制,下面这篇文章主要给大家介绍了关于Java中ArrayList与顺序表的定义与实现的相关资料,需要的朋友可以参考下
    2022-07-07
  • Springboot如何加载静态图片

    Springboot如何加载静态图片

    这篇文章主要介绍了Springboot如何加载静态图片,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论