文章目录
前言
我们在使用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进行实现相关语句设计,需要进行如下操作
- 新建相关的VO类
@Data
public class UserInfoVO extends UserInfo {
// 性别
private String sexText;
}
- Mapper层编写自定义分页方法,使用定义的VO类作为数据返回格式
IPage<UserInfoVO> list(Page<UserInfoVO> page, @Param(Constants.WRAPPER) Wrapper<UserInfoVO> queryWrapper);
- 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>
- 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 );
总结
愿我的文章对你有所帮助
更多的技巧后续会持续更新