lambda四种表达形式
前言使用了lambda表达式 可以通过方法引用的方式来使用实体字段名的操作,避免直接写数据库表字段名时的错写名字;
一、LambdaQueryWrapper<>
@Test
public void selectLambda() {
//创建lambda 条件构造器 的三种方法
// LambdaQueryWrapper lambda2 = new LambdaQueryWrapper<>();
// LambdaQueryWrapper lambda = new QueryWrapper().lambda();
LambdaQueryWrapper lambda3 = Wrappers.lambdaQuery();
lambda3.like(User::getName, "雨").lt(User::getAge, 40);
List users = userMapper.selectList(lambda3);
users.forEach(System.out::println);
}
二、QueryWrapper<实体>().lambda()
@Test
public void selectLambda2() {
LambdaQueryWrapper lambda3 = Wrappers.lambdaQuery();
lambda3.likeRight(User::getName, "王").and(qw -> qw.lt(User::getAge, 40).or().isNotNull(User::getEmail));
List users = userMapper.selectList(lambda3);
users.forEach(System.out::println);
}
三、Wrappers.<实体>lambdaQuery(),Wrappers.lambdaQuery(实体.class)
Wrappers.<实体>lambdaQuery()
@Test
public void selectLambda4my() {
LambdaQueryWrapper lambda3 = Wrappers.lambdaQuery();
lambda3.likeRight(User::getName, "王").and(qw -> qw.lt(User::getAge, 40).or().isNotNull(User::getEmail));
List users = userMapper.selectAll(lambda3);
users.forEach(System.out::println);
}
Wrappers.lambdaQuery(实体.class)
@Test
public void selectLambda3() {
List users = new LambdaQueryChainWrapper(userMapper)
.like(User::getName, "雨").ge(User::getAge, 20).list();
users.forEach(System.out::println);
}
QueryWrapper、LambdaQueryWrapper以及LambdaQueryChainWrapper用法
一、QueryWrapper
.like("email", "24252") //email对应数据库中列名
@Test
void TestQueryWrapperSelect() {
//1、条件用法
List userList = userMapper.selectList(new QueryWrapper()
.like("email", "24252")
.between("age", 20, 22)
.or()
.eq("name", "zcx")
);
System.out.println("userList:" + userList);
//2、排序用法
List users = userMapper.selectList(new QueryWrapper()
.eq("nick_name", "xx")
.orderByAsc("age") //升序
// .orderByDesc("age") //降序
.last("limit 0,3") //last用法:在sql末尾添加sql语句,有sql注入风险
);
System.out.println("users:"+users);
}
二、LambdaQueryWrapper
queryWrapper.eq(User::getName,"liangd1"); //可以通过Lambda获取数据库列名
@Test
void TestLambdaQueryWrapper() {
//1、查询单条
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName,"liangd1");
User selectOne = userMapper.selectOne(queryWrapper);
System.out.println(selectOne);
//2、查询list以及统计条数
queryWrapper.eq(User::getName, "zcx");
List userList = userMapper.selectList(queryWrapper);
System.out.println("userList:" + userList);
Integer result = userMapper.selectCount(queryWrapper);
System.out.println("result:" + result);
}
三、LambdaQueryChainWrapper
//链式查询方式
User one = new LambdaQueryChainWrapper<>(userMapper)
.eq(User::getName, "liangd1")
.one();
@Test
void TestLambdaQueryChainWrapper() {
//1、eq查询单条
User one = new LambdaQueryChainWrapper<>(userMapper)
.eq(User::getName, "liangd1")
.one();
System.out.println("UserOne:" + one);
//2、查询list
List users = new LambdaQueryChainWrapper<>(userMapper)
.eq(User::getName, "zcx")
.list();
System.out.println("UserList:" + users);
//3、模糊查询
List LikeList = new LambdaQueryChainWrapper<>(userMapper)
.like(User::getEmail, "test")
.list();
System.out.println("LikeUser:" + LikeList);
}
QueryWrapper及LambdaQueryWrapper
实体类
@Data
public class BannerItem {
private Long id;
private String name;
private String img;
private String keyword;
private Integer type;
private Long bannerId;
}
QueryWrapper
最基础的使用方式是这样
// 查询条件构造器 QueryWrapperwrapper = new QueryWrapper<>(); wrapper.eq("banner_id", id); // 查询操作 List bannerItems = bannerItemMapper.selectList(wrapper);
然后我们可以引入lambda,避免我们在代码中写类似的于banner_id的硬编码
QueryWrapperLambdaQueryWrapperwrapper = new QueryWrapper<>(); wrapper.lambda().eq(BannerItem::getBannerId, id); List bannerItems = bannerItemMapper.selectList(wrapper);
为了简化lambda的使用,我们可以改写成LambdaQueryWrapper构造器,语法如下:
两种写法
new QueryWrapper().lambda();
Wrappers.lambdaQuery();
LambdaQueryWrapperwrapper = new QueryWrapper ().lambda(); // LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); // 两种写法 wrapper.eq(BannerItem::getBannerId, id); List bannerItems = bannerItemMapper.selectList(wrapper);
我们可以再次将QueryWrapper.lambda()简化,变成这个样子
BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
.eq(BannerItem::getId, id)
.one();
链式查询
MyBatis-Plus还提供了一种链式查询的方式,和上面的代码效果一样。
但是这种写法偏向于炫技,可读性没有上面的代码强,大家可以根据需要自行选择方式。
ListbannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper) .eq(BannerItem::getBannerId, id) .list();
如果只想查询一条记录,例如通过id查询某条记录的详情,使用.one()即可,例如
BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
.eq(BannerItem::getId, id)
.one();
lambdaQueryWrapper中常用方法



