阅读完需:约 2 分钟
前言:以前都是使用QueryWrapper的情况多一点,其余三种也没怎么涉及。
首先准备一个对应的实体类:
@Data
@TableName("house")
public class HouseEntity {
@TableId(type = IdType.AUTO)
private Integer houseId;
private String houseOwner;
private String houseArea;
}
分别测试使用代码测试,都以查询所有的数据为目的。都注入
@Autowired
private HouseMapper houseMapper;
QueryWrapper
@Test
public void test1() {
List<HouseEntity> list=houseMapper.selectList(new QueryWrapper<HouseEntity>()
.orderByDesc("house_area"));
System.out.println("QueryWrapper:"+list);
}
执行结果:QueryWrapper:[HouseEntity(houseId=2, houseOwner=LS, houseArea=72), HouseEntity(houseId=1, houseOwner=ZS, houseArea=70)]
最基础的使用方式是这样
// 查询条件构造器
QueryWrapper<HouseEntity> wrapper = new QueryWrapper<>();
wrapper.eq("houseOwner",house);
// 查询操作
List<HouseEntity> house = houseMapper.selectList(wrapper);
然后我们可以引入lambda,避免我们在代码中写类似的于banner_id
的硬编码
QueryWrapper<HouseEntity> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(HouseEntity::houseOwner, house);
List<HouseEntity> house = houseMapper.selectList(wrapper);
LambdaQueryWrapper
为了简化lambda的使用,我们可以改写成LambdaQueryWrapper构造器,语法如下:
@Test
public void test3() {
List<HouseEntity> list=houseMapper.selectList(new LambdaQueryWrapper<HouseEntity>()
.orderByDesc(HouseEntity::getHouseArea));
System.out.println("LambdaQueryWrapper:"+list);
}
执行结果:LambdaQueryWrapper:[HouseEntity(houseId=2, houseOwner=LS, houseArea=72), HouseEntity(houseId=1, houseOwner=ZS, houseArea=70)]
或者
LambdaQueryWrapper<HouseEntity> wrapper = new QueryWrapper<HouseEntity>().lambda();
wrapper.eq(HouseEntity:: getHouseArea,house);
List<HouseEntity> house = houseMapper.selectList(wrapper);
我们可以再次将QueryWrapper<BannerItem>.lambda()
简化,变成这个样子
LambdaQueryWrapper<HouseEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BannerItem::getBannerId, id);
List<HouseEntity> house = houseMapper.selectList(wrapper);
QueryChainWrapper
MyBatis-Plus还提供了一种链式查询的方式,和上面的代码效果一样。 但是这种写法偏向于炫技,可读性没有上面的代码强。
@Test
public void test() {
List<HouseEntity> list2=new QueryChainWrapper<>(houseMapper)
.orderByDesc("house_area").list();
System.out.println("QueryChainWrapper:"+list);
}
执行结果:QueryChainWrapper:[HouseEntity(houseId=2, houseOwner=LS, houseArea=72), HouseEntity(houseId=1, houseOwner=ZS, houseArea=70)]
LambdaQueryChainWrapper
@Test
public void test3() {
List<HouseEntity> list = new LambdaQueryChainWrapper<>(houseMapper)
.orderByDesc(HouseEntity::getHouseArea).list();
System.out.println("LambdaQueryChainWrapper:"+list);
}
执行结果:LambdaQueryChainWrapper:[HouseEntity(houseId=2, houseOwner=LS, houseArea=72), HouseEntity(houseId=1, houseOwner=ZS, houseArea=70)]
总结:
-
QueryWrapper
、QueryChainWrapper
只能都只能指定需要的数据库列名 -
LambdaQueryWrapper
、LambdaQueryChainWrapper
可以通过获取Lambda数据库列名 -
QueryWrapper
、LambdaQueryWrapper
不能使用链式查询的方式,必须借助BaseMapper来执行 -
QueryChainWrapper
、LambdaQueryChainWrapper
可以使用链式查询的方式,如list(),one()