【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 进行如下的条件构造:文章来源:https://www.toymoban.com/news/detail-645844.html
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 连接起来。文章来源地址https://www.toymoban.com/news/detail-645844.html
(3)使用or之后接and和括号,且设置非空前提判断
LambdaQueryWrapper<ProjMemberPO> objectLambdaQueryWrapper = Wrappers.lambdaQuery();
List<ProjMemberPO> projMemberPOS = projMemberMapper.selectList(objectLambdaQueryWrapper
.eq(ProjMemberPO::getProjId, Long.parseLong(projId))
.eq(domainId != null, ProjMemberPO::getDomainId, domainId)
.and(userNmOrAcct != null,qw->qw.like(ProjMemberPO::getProjMemberNm,userNmOrAcct).or().like(ProjMemberPO::getLoginAcct,userNmOrAcct))
);
到了这里,关于mybatis-plus的一些使用案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!