省力写法 - 必看
这些都是作者推荐的省心、省力、省事写法
指定数据库类型
虽然 mybatis-mp 支持自动识别,但是具有一定损耗,能加尽量加上
mybatis:
configuration:
databaseId: MYSQL
select 、from、returnType 都可以省略
假如 只 select 当前 Mapper 的实体类:可不写 select
假如 from 的是当前 Mapper 的实体类:可不写 from
假如 返回的是当前 Mapper 的实体类:可不写 returnType
SysUser sysUser = QueryChain.of(sysUserMapper)
.eq(SysUser::getId,1)
.get();
一键忽略 null,忽略空字符串,自动对字符串进行去空格
SysUser sysUser = QueryChain.of(sysUserMapper)
// 忽略 null 条件参数
// 忽略 空字符串 条件参数
// 对字符串进行trim 去空格操作
.forSearch(true)
.eq(SysUser::getUserName, null )
.eq(SysUser::getUserName, "" )
.eq(SysUser::getUserName," admin ")
.get();
手动优雅忽略条件
Integer id= XXX;
String userName= YYY;
SysUser sysUser = QueryChain.of(sysUserMapper)
.select(SysUser.class,SysRole.class)
.from(SysUser.class)
.eq(SysUser::getId,id,Objects::nonNull)
.like(SysUser::getUserName,userName,StringUtils::isNotBlank)
.get();
join 可不用再写 on 条件
配合 @ForeignKey 注解 可以不用再写 on 条件
@Data
@Table
public class SysUser {
@TableId
private Integer id;
private String userName;
private String password;
@ForeignKey(SysRole.class)
private Integer roleId;
private LocalDateTime createTime;
}
public class Demo {
@Autowired
private SysUserMapper sysUserMapper;
public void page() {
Pager pager= QueryChain.of(sysUserMapper)
.select(SysUser.class)
.from(SysUser.class)
.join(SysUser.class,SysRole.class)
.like(SysUser::getUserName,"abc")
.returnType(SysUser.class)
.paging(Pager.of(1));
}
}
简单自动 select 列
select (实体类.class) 或 select (VO.class) 都可以自定帮你 select 所需要的列
public class Demo {
@Autowired
private SysUserMapper sysUserMapper;
public void page() {
Pager pager= QueryChain.of(sysUserMapper)
.select(SysUser.class) // or select(SysUserVO.class)
.from(SysUser.class)
.like(SysUser::getUserName,"abc")
.returnType(SysUser.class)
.paging(Pager.of(1));
}
}
结果映射 - VO 自动映射 - 如何得到不同的类型的结果?
使用 returnType (XX.class) 方法,设置你想要的结果的类型
XX 类型 可以是 简单的基本类型包装类,实体类,VO 类
VO 映射 - 构建复杂的结构类
mybatis-mp 实现
结果自动映射 (多复杂的都可以映射)
重复列名 根本无需担心
可以构建 多重内嵌结构 例如:
@ResultEntity(A对应实体类.class)
class A {
@NestedResultEntity(target=(B对应实体类.class)
B b;
}
class B {
@NestedResultEntity(target=(C对应实体类.class)
List cs;
}
class C {
Integer id;
}
链路操作 - connect 方法 - 拿到自己的句柄
List list=QueryChain.of(sysUserMapper)
.select(SysUser::getId,SysUser::getUserName,SysUser::getRole_id)
.from(SysUser.class)
.connect(query->{
query.exists(SubQuery.create()
.select1()
.from(SysUser.class)
.eq(SysUser::getId,query.$(SysUser::getId))
.isNotNull(SysUser::getPassword)
.limit(1)
);
})
.list();