构造器查询(ModelWrapper)
ModelWrapper 是 quickjava-orm 的核心查询构造器,提供类型安全的 Lambda 链式调用 API。
创建 Wrapper
lambda 方式
ModelWrapper.lambda(User.class)
带别名
ModelWrapper.lambda(User.class, "u")
ModelWrapper.of(User.class, "u")
of 方式
ModelWrapper.of(User.class)
指定返回值类型
ModelResultWrapper.lambda(User.class, UserVO.class)
条件查询
等值条件
// eq - 等于
wrapper.eq(User::getId, 1)
wrapper.eq(User::getStatus, "0")
// neq - 不等于
wrapper.neq(User::getId, 0)
wrapper.neq(User::getStatus, "1")
比较条件
// 大于 / 大于等于
wrapper.gt(User::getTenantId, 0)
wrapper.gte(User::getTenantId, 1)
// 小于 / 小于等于
wrapper.lt(User::getId, 1000)
wrapper.lte(User::getId, 999)
模糊匹配
wrapper.like(User::getNickName, "%admin%")
wrapper.notLike(User::getNickName, "%test%")
wrapper.likeLeft(User::getNickName, "admin") // LIKE '%admin'
wrapper.likeRight(User::getNickName, "admin") // LIKE 'admin%'
范围条件
wrapper.in(User::getId, 1, 2, 3)
wrapper.notIn(User::getId, 999, 1000)
wrapper.between(AllTypeEntity::getId, 1, 100)
wrapper.notBetween(AllTypeEntity::getId, -1, 0)
空值判断
wrapper.isNull(User::getLoginIp)
wrapper.isNotNull(User::getLoginIp)
条件开关(带 boolean)
boolean enabled = true;
wrapper.eq(enabled, User::getStatus, "0") // enabled=true 时生效
wrapper.eq(!enabled, User::getId, 99999) // enabled=false 时跳过
wrapper.neq(enabled, User::getId, 0)
wrapper.gt(enabled, User::getTenantId, 0)
wrapper.like(enabled, User::getNickName, "%admin%")
wrapper.in(enabled, User::getId, 1, 2, 3)
条件组合(AND / OR)
简单 AND
wrapper.and(w -> w
.eq(User::getStatus, "0")
.neq(User::getId, 0)
.gt(User::getTenantId, 0)
)
简单 OR
wrapper.or(w -> w
.eq(User::getId, 1)
.eq(User::getId, 2)
.eq(User::getId, 3)
)
多层嵌套
wrapper
.and(w -> w
.eq(User::getStatus, "0")
.or(w2 -> w2
.eq(User::getId, 1)
.eq(User::getId, 2)
)
.or(w3 -> w3
.eq(User::getId, 3)
.eq(User::getId, 4)
)
)
.or(w -> w
.eq(User::getStatus, "1")
.neq(User::getId, 0)
)
深层嵌套
wrapper
.and(w -> w
.neq(User::getId, 0)
.neq(User::getStatus, 0)
.or(o -> o
.eq(User::getId, 1)
.eq(User::getId, 2)
.and(a -> a
.neq(User::getStatus, "1")
.neq(User::getSex, "0")
)
)
)
字段选择
选择指定字段
wrapper.field(User::getId, User::getNickName, User::getEmail)
选择全部字段
wrapper.field(User.class)
混合选择
wrapper
.field(User::getId, User::getNickName)
.field(User.class)
排序
升序 / 降序
wrapper.order(User::getCreateTime) // ASC
wrapper.order(User::getCreateTime, false) // DESC
多字段排序
wrapper
.order(User::getStatus) // ASC
.order(User::getCreateTime, false) // DESC
.orderByAsc(User::getId)
.orderByDesc(User::getTenantId)
分组聚合
分组
wrapper.group(User::getStatus) // 单字段
wrapper.group(User::getStatus, User::getSex) // 多字段
Having
wrapper
.group(AllTypeEntity::getIntVal)
.having(AllTypeEntity::getIntVal)
分页
page + pagination
IPagination<User> page = wrapper
.page(1, 10)
.pagination();
直接 pagination
wrapper.pagination() // 默认 1, 20
wrapper.pagination(1) // 第 1 页
wrapper.pagination(1, 10) // 第 1 页,每页 10 条
wrapper.pagination(1L, 10L) // Long 版本
获取分页数据
IPagination<User> page = wrapper.pagination(1, 10);
long total = page.getTotal(); // 总记录数
long pages = page.getPages(); // 总页数
long current = page.getPage(); // 当前页码
long size = page.getPageSize(); // 每页条数
List<User> rows = page.getRows(); // 数据行
Limit 限制
wrapper.limit(10) // 前 10 条
wrapper.limit(0, 5) // offset 0, limit 5
执行查询
查询单条
User user = wrapper
.eq(User::getId, 1)
.find();
// 结果不存在返回 null
查询列表
List<User> list = wrapper
.eq(User::getStatus, "0")
.select();
// 结果不存在返回空 List
数据操作
插入
// 通过 ModelWrapper.create
Long id = ModelWrapper.create(entity);
// 通过 insertGetId
Long id = wrapper.insertGetId(entity);
// 通过 Map 数据
Map<String, Object> data = new LinkedHashMap<>();
data.put("int_val", 777);
data.put("string_val", "test");
Long id = wrapper.data(data).insertGetId();
// 批量插入
int rows = wrapper.insertAll(Arrays.asList(e1, e2));
更新
// 更新单个字段
wrapper
.eq(AllTypeEntity::getIntVal, 999)
.update(AllTypeEntity::getStringVal, "updated");
// 通过 Map 更新
Map<String, Object> data = new LinkedHashMap<>();
data.put("string_val", "updated");
wrapper
.eq(AllTypeEntity::getIntVal, 888)
.update(data);
删除
wrapper
.eq(AllTypeEntity::getId, id)
.delete();
Save(自动判断 insert/update)
// 主键不存在则 insert,存在则 update
int rows = wrapper.save(entity);
其他功能
Soft Delete
// 默认 @ModelLogic 注解的模型会自动过滤已删除记录
// 如需包含已删除:
wrapper.includeSoftDelete()
Union
wrapper
.union("SELECT * FROM other_table")
Distinct
wrapper.distinct(true)
Lock
wrapper.lock(true) // SELECT ... FOR UPDATE
where 简写
wrapper.where(User::getId, 1)
wrapper.where(User::getId, Operator.GT, 0)
完整示例
@RunWith(TestRunner.class)
public class UserTest {
@Test
public void testQuery() {
List<User> list = ModelWrapper.lambda(User.class)
.eq(User::getStatus, "0")
.neq(User::getId, 0)
.like(User::getNickName, "%admin%")
.in(User::getId, 1, 2, 3)
.between(User::getCreateTime, startDate, endDate)
.orderByDesc(User::getId)
.page(1, 10)
.select();
}
@Test
public void testInsert() {
User user = new User();
user.setUserName("test");
user.setNickName("测试");
user.setStatus("0");
Long id = ModelWrapper.create(user);
}
@Test
public void testUpdate() {
ModelWrapper.lambda(User.class)
.eq(User::getId, 1)
.update(User::getNickName, "新昵称");
}
@Test
public void testDelete() {
ModelWrapper.lambda(User.class)
.eq(User::getId, 1)
.delete();
}
}
