mybatis-plus的一些使用案例

mybatis-plus的一些使用案例

  • 【1】queryWrapper的eq忽略字段的大小写
  • 【2】分页查询
    • (1)案例一
    • (2)案例二
    • (3)案例三
  • 【3】mybatis-plus使用updateBatchById()方法无法更新为null的字段
  • 【4】LambdaQueryWrapper使用or逻辑
    • (1)使用or
    • (2)使用or之后接and和括号

【1】queryWrapper的eq忽略字段的大小写

(1)需求分析
在创建和修改的时候,需要判断库名是否重复,而库名是全英文,所以要忽略字母大小写,大小写不同被认为是相同的字母

(2)解决思路
把数据库里的字段,还有要查的条件字段,都转成小写或者大写,然后再判断是否相同

(3)代码案例

@Override
public int checkName(String schemaNm, Long id) {
    // 使用QueryWrapper查询,忽略库名大小写
    return (int) super.count(new QueryWrapper<DbXClusterPO>()
            .eq("LOWER(SCHEMA_NM)", schemaNm.toLowerCase())
            .ne(id != null, "id", id));
}

【2】分页查询

(1)案例一

(1)Api接口层
参数为Pagination,返回结果为ApiPageResponse

@GetMapping(value = "/list")
@Operation(summary = "分页查询评审项目", description = "分页查询评审项目")
public ApiPageResponse<ReviewProjQueryPageResponse> query(@Valid Pagination  pagination, @Valid  ReviewProjQueryRequest queryRequest) {
    return reviewProjAppService.query(pagination, queryRequest);
}

(2)应用业务层

ApiPageResponse<ReviewProjQueryPageResponse> query(Pagination pagination, ReviewProjQueryRequest  queryRequest) {
    // 调用评审项目读模型资源库分页查询
    List<ReviewProjQueryPageResponse> list = reviewProjService.query(pagination,  queryRequest);
    return ApiPageResponse.ok(pagination, list);
}

(3)

public List<ReviewProjQueryPageResponse> query(Pagination pagination, ReviewProjQueryRequest queryRequest) {
	List<ReviewProjQueryPageResponse> list = reviewProjReadModelRepo.query(pagination, queryRequest);
	return list;
}

(4)

List<ReviewProjQueryPageResponse> query(Pagination pagination, ReviewProjQueryRequest queryRequest);

(5)

@Override
public List<ReviewProjQueryPageResponse> query(Pagination pagination,  ReviewProjQueryRequest queryRequest) {
    Page<ReviewProjQueryPageResponse> page = getBaseMapper().getByPage(Page.of(pagination.getPageNumber(), pagination.getPageSize()),  queryRequest);
    pagination.setTotal(page.getTotal());
    return page.getRecords();
}

(6)

Page<ReviewProjQueryPageResponse> getByPage(Page page, ReviewProjQueryRequest request);

(7)

<select id="getByPage" parameterType="com.nbcb.bids.workspace.application.api.request.ReviewProjQueryRequest" resultMap="responseResult">
    SELECT
    <include refid="responseColumn">include>
    FROM
    review_proj T
    <where>
        1=1
        <if test=" request.projId != null and request.projId !=''">
            AND T.PROJ_ID = #{request.projId}
        if>
        <if test=" request.projId == null or request.projId ==''">
            AND T.PROJ_ID is NULL
        if>
        <if test=" request.proj != null and request.proj != ''">
            AND T.PROJ like '%${request.proj}%'
        if>
        <if test=" request.projType != null and request.projType != ''">
            AND T.PROJ_TYPE like '%${request.projType}%'
        if>
    where>
select>

(2)案例二

除了使用xml配置的sql来实现自定义逻辑sql以外,还可以使用mybatis-plus提供的包装类条件查询,这里就不像案例一使用getBaseMapper().getByPage了

@Override
public List<ProjXDbQueryResponse> query(Pagination pagination, ProjXDbQueryRequest queryRequest) {
    // 构造查询条件
    LambdaQueryWrapper<ProjXDbPO> lambdaQueryWrapper = Wrappers.lambdaQuery();


    // 如果 工程id 不为空
    if (ObjectUtils.isNotEmpty(queryRequest.getProjId())) {
        lambdaQueryWrapper.eq(ProjXDbPO::getProjId, queryRequest.getProjId());
    }
    // 如果 数据库名 不为空
    if (ObjectUtils.isNotEmpty(queryRequest.getSchemaNm())) {
        lambdaQueryWrapper.eq(ProjXDbPO::getSchemaNm, queryRequest.getSchemaNm());
    }


    // 默认按照主键倒序排序
    lambdaQueryWrapper.orderByDesc(ProjXDbPO::getId);


    // 分页查询
    Page<ProjXDbPO> page = super.page(Page.of(pagination.getPageNumber(),
            pagination.getPageSize()), lambdaQueryWrapper);
    pagination.setTotal(page.getTotal());
    // 工程数据库关系表持久化对象 转 工程数据库关系表查询响应对象
return projXDbPOAssembler.toQueryResponse(page.getRecords());
}

(3)案例三

(1)

@GetMapping(value = "/myTaskList")
@Operation(summary = "分页查询我的开发任务", description = "分页查询我的开发任务")
public ApiResponse<IPage<DevelopTaskQueryResponse>> query(@Valid Pagination pagination, @Valid DevelopTaskQueryRequest queryRequest) {
    PageSearchRequest<DevelopTaskQueryRequest> request = new PageSearchRequest<>();
    request.setPageSize(pagination.getPageSize());
    request.setPageNum(pagination.getPageNumber());
    request.setSearch(queryRequest);
    return developTaskAppService.query(request);
}

(2)

public ApiResponse<IPage<DevelopTaskQueryResponse>>  query(PageSearchRequest<DevelopTaskQueryRequest> request) {
    // 调用开发任务表读模型资源库分页查询
    return ApiResponse.ok(developTaskService.query(request));
}

(3)

public IPage<DevelopTaskQueryResponse>  query(PageSearchRequest<DevelopTaskQueryRequest> request) {
    //获取当前登陆人
    IPage<DevelopTaskQueryResponse> page = null;
    page = developTaskRepo.selectTaskList(request.getPage(),  request.getSearch());
    List<DevelopTaskQueryResponse> list = page.getRecords();
    return page;
}

(4)

IPage<DevelopTaskQueryResponse> selectTaskList(IPage<Object> page, DevelopTaskQueryRequest param);

(5)

@Override
public IPage<DevelopTaskQueryResponse> selectTaskList(IPage<Object> page,  DevelopTaskQueryRequest param) {
    return super.baseMapper.selectTaskList(page, param);
}

(6)

IPage<DevelopTaskQueryResponse> selectTaskList(IPage<Object> page, @Param("param") DevelopTaskQueryRequest param);

(7)接下来就又是xml配置sql了

【3】mybatis-plus使用updateBatchById()方法无法更新为null的字段

(1)需求分析
当我使用mybatisplus的updateBatchById方法时,我将表的某一个属性值赋null,然后调用updateBatchById方法,返回true,去数据库一查数据,却发现数据还是原来的值,并没有被更新为null。

该问题其实是MyBatis-Plus对字段的验证策略导致的,MyBatis-Plus默认进行了不是全量更新的策略,如果对某字段赋值为null了,那么updateBatchById()更新时自动忽略该字段。

(2)解决思路
解决方法就是通过注解来去掉忽略,但是由于MyBatis-Plus版本更新,因此不同版本使用的注解形式不同。

1-3.1.2版本之前使用: @TableField(strategy = FieldStrategy.IGNORED)
2-3.1.2版本后使用:@TableField(updateStrategy = FieldStrategy.IGNORED)

(3)代码案例

@TableField(value = "DOMAIN_ID", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
private Long domainId;

【4】LambdaQueryWrapper使用or逻辑

(1)使用or

在使用MyBatis-Plus的LambdaQueryWrapper时,可以使用or逻辑来构建多个条件之间的“或”关系。

以下是一个示例代码:

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getAge, 20)
        .or()
        .eq(User::getGender, "female");

List<User> userList = userMapper.selectList(queryWrapper);

在上述示例中,我们创建了一个LambdaQueryWrapper对象,并使用eq方法设置了一个查询条件,即年龄等于20。接着使用or方法,表示下一个条件与前一个条件之间的关系是“或”。然后使用eq方法设置了第二个查询条件,即性别等于"female"。最后通过selectList方法执行查询,将符合条件的用户列表返回。

这样构建的查询条件将会生成类似于以下SQL语句:

SELECT * FROM user WHERE age = 20 OR gender = 'female';

通过使用or方法,可以在LambdaQueryWrapper中构建多个条件之间的“或”关系,从而实现更灵活的查询。

(2)使用or之后接and和括号

例如,我们有以下的查询需求:查询年龄大于 18 岁并且性别为男性或者职业为工程师的用户。可以使用 lambdaQueryWrapper 进行如下的条件构造:

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 18)
        .and(wrapper -> wrapper.eq(User::getGender, "男性")
                .or()
                .eq(User::getOccupation, "工程师"));

在这个例子中,使用了两边加括号的方式将 eq(User::getGender, “男性”).or().eq(User::getOccupation, “工程师”) 部分括起来,表示这部分条件是一个整体,它与年龄大于 18 岁的条件使用 and 连接起来。

你可能感兴趣的:(mybatis)