Mybatis-Plus使用技巧总结篇


前言

我们在使用Mybatis-Plus进行增强的时候,往往使用的都只是其最基础最简单的功能,而其丰富的SQL语句构造更是我们应该学习和掌握的技能

条件查询

1、QueryWrapper lambda和LambdaQueryWrapper

  • QueryWrapper.lambda().eq等同于LambdaQueryWrapper.eq()
    这两种写法,前者的lambda函数方法等同于后者,这两种方式都利于开发,不用担心写错字段名

分页查询

1、分页查询(联表)

当我们需要镜像多张表联合查询时,就会用到
例如:
当我们的查询语句需要如下设计时

# 查询用户信息
SELECT
 a.*,
 b.`name` AS sex_text 
FROM
 user_info a
 LEFT JOIN user_sex b ON ( a.sex = b.id ) 
WHERE
 a.enable=true 
 AND a.age > 20;

我们想要通过mybatis-plus进行实现相关语句设计,需要进行如下操作

  1. 新建相关的VO类
@Data
public class UserInfoVO extends UserInfo {
    // 性别
    private String sexText;
}
  1. Mapper层编写自定义分页方法,使用定义的VO类作为数据返回格式
IPage<UserInfoVO> list(Page<UserInfoVO> page, @Param(Constants.WRAPPER) Wrapper<UserInfoVO> queryWrapper);
  1. xml文件中构造相关语句
<select id="list" resultType="UserInfoVO">
    SELECT
  a.*,
  b.`name` AS sex_text 
 FROM
  user_info a
  LEFT JOIN user_sex b ON ( a.sex = b.id ) 
    ${ew.customSqlSegment}
</select>
  1. service层构造相关wrapper
// 条件查询
LambdaQueryWrapper<UserInfoVO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getAge, 20);
// 分页对象
Page<UserInfoVO> queryPage = new Page<>(page, limit);
// 分页查询
IPage<UserInfoVO> iPage = userInfoMapper.list(queryPage , queryWrapper);

连接查询

1、AND和OR

通常mybatis的连接词是and,我们的and和or使用的都是一级状态,那么直接在wrapper上使用相关的连接词即可

LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
// AND a.id = 1 
queryWrapper.eq(UserInfo::getId, "1");
//OR a.id = 3
queryWrapper.or().eq(UserInfo::getId, "1");

但是当我们想要在二级状态下使用and或者or连接词时,就可以使用如下的方式

LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
// AND ( a.`name` = 'jack' OR a.phone = '13888888888' )
queryWrapper.and(i -> i.eq(UserInfo::getName, "jack").or().eq(UserInfo::getPhone, "13888888888"));

后续当我们需要设计更深层次的or使用时,可以继续嵌套使用

LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
// AND a.id <> 1 
queryWrapper.ne(UserInfo::getId, "1");
// AND ( (a.`name` = 'jack' AND a.category = 1) OR (a.phone = '13888888888' OR a.category = 2) )
queryWrapper.and(i -> (i.and(j -> j.eq(UserInfo::getName, "jack").eq(UserInfo::getCategory, 1))).or(j -> j.eq(UserInfo::getPhone, "13888888888").eq(UserInfo::getCategory, 2)));

// 查询结果
生成的语句如下

SELECT
 a.* 
FROM
 user_info a 
WHERE
 a.id <> 1 
 AND ( (a.`name` = 'jack' AND a.category = 1) OR (a.phone = '13888888888' OR a.category = 2) )

指定查询

1、使用wrapper.select()指定查询字段

当我们只是需要表中数据的某几个字段时,我们可以使用select()进行指定需要的字段
例如: 只需要查询出用户的id,name,phone字段
我们只需要如下即可

LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
// 只查询 id,name,phone
queryWrapper.select(UserInfo::getId, UserInfo::getName, UserInfo::getPhone);
// 查询条件为:age = 20
queryWrapper.eq(UserInfo::getAge, 20);
List<UserInfo> list = userInfoMapper.selectList(queryWrapper );

总结

愿我的文章对你有所帮助
更多的技巧后续会持续更新

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值