mybatis-mp 之简单省力方法,超实用!!!
2024-07-28 09:07 阅读(323)

省力写法 - 必看

这些都是作者推荐的省心、省力、省事写法


指定数据库类型

虽然 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();