什么是db?
db 是 mybatis-plus 3.5.4+ 提供的静态工具类,无需注入 service 或 mapper,直接通过静态方法操作数据库。本质上是对 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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论