Mybatis-Plus之四种lambda方式LambdaQueryWrapper,QueryWrapper<实体>().lambda(),LambdaQueryChainWrapper<实体>

x33g5p2x  于2022-05-27 转载在 其他  
字(5.7k)|赞(0)|评价(0)|浏览(6743)

Mybatis-Plus之四种lambda方式

lambda四种表达形式

前言

使用了lambda表达式 可以通过方法引用的方式来使用实体字段名的操作,避免直接写数据库表字段名时的错写名字;

一、LambdaQueryWrapper<>

  1. /**
  2. * lambda 条件构造器
  3. * 生成的sql语句 SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ?
  4. */
  5. @Test
  6. public void selectLambda() {
  7. //创建lambda 条件构造器 的三种方法
  8. // LambdaQueryWrapper<User> lambda2 = new LambdaQueryWrapper<>();
  9. // LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
  10. LambdaQueryWrapper<User> lambda3 = Wrappers.<User>lambdaQuery();
  11. lambda3.like(User::getName, "雨").lt(User::getAge, 40);
  12. List<User> users = userMapper.selectList(lambda3);
  13. users.forEach(System.out::println);
  14. }

二、QueryWrapper<实体>().lambda()

  1. /**
  2. * 名字为王姓并且(年龄小于40并且邮箱不为空)
  3. * name like '王%' and (age <40 or email in not null)
  4. * 生成的sql语句 SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ?
  5. */
  6. @Test
  7. public void selectLambda2() {
  8. LambdaQueryWrapper<User> lambda3 = Wrappers.<User>lambdaQuery();
  9. lambda3.likeRight(User::getName, "王").and(qw -> qw.lt(User::getAge, 40).or().isNotNull(User::getEmail));
  10. List<User> users = userMapper.selectList(lambda3);
  11. users.forEach(System.out::println);
  12. }

三、Wrappers.<实体>lambdaQuery(),Wrappers.lambdaQuery(实体.class)

Wrappers.<实体>lambdaQuery()

  1. /**
  2. * 自定义sql 使用
  3. * Dao层 代码:
  4. *
  5. * @Select("select * from ${ew.customSqlSegment}")
  6. * List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
  7. */
  8. @Test
  9. public void selectLambda4my() {
  10. LambdaQueryWrapper<User> lambda3 = Wrappers.<User>lambdaQuery();
  11. lambda3.likeRight(User::getName, "王").and(qw -> qw.lt(User::getAge, 40).or().isNotNull(User::getEmail));
  12. List<User> users = userMapper.selectAll(lambda3);
  13. users.forEach(System.out::println);
  14. }

Wrappers.lambdaQuery(实体.class)

四、LambdaQueryChainWrapper<实体>(xxxxMapper)

  1. /**
  2. * lambda 条件构造器第四种创建方式 MP 3.0.7 新增的方式
  3. * 生成的sql语句 SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age >= ?
  4. * 这个例子可以看出 代码更简洁了
  5. * 生成的sql语句 SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age >= ?
  6. */
  7. @Test
  8. public void selectLambda3() {
  9. List<User> users = new LambdaQueryChainWrapper<User>(userMapper)
  10. .like(User::getName, "雨").ge(User::getAge, 20).list();
  11. users.forEach(System.out::println);
  12. }

QueryWrapper、LambdaQueryWrapper以及LambdaQueryChainWrapper用法

一、QueryWrapper

  1. .like("email", "24252") //email对应数据库中列名
  1. /**
  2. * 条件构造器 查询操作
  3. */
  4. @Test
  5. void TestQueryWrapperSelect() {
  6. //1、条件用法
  7. List<User> userList = userMapper.selectList(new QueryWrapper<User>()
  8. .like("email", "24252")
  9. .between("age", 20, 22)
  10. .or()
  11. .eq("name", "zcx")
  12. );
  13. System.out.println("userList:" + userList);
  14. //2、排序用法
  15. List<User> users = userMapper.selectList(new QueryWrapper<User>()
  16. .eq("nick_name", "xx")
  17. .orderByAsc("age") //升序
  18. // .orderByDesc("age") //降序
  19. .last("limit 0,3") //last用法:在sql末尾添加sql语句,有sql注入风险
  20. );
  21. System.out.println("users:"+users);
  22. }

二、LambdaQueryWrapper

  1. queryWrapper.eq(User::getName,"liangd1"); //可以通过Lambda获取数据库列名
  1. @Test
  2. void TestLambdaQueryWrapper() {
  3. //1、查询单条
  4. LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
  5. queryWrapper.eq(User::getName,"liangd1");
  6. User selectOne = userMapper.selectOne(queryWrapper);
  7. System.out.println(selectOne);
  8. //2、查询list以及统计条数
  9. queryWrapper.eq(User::getName, "zcx");
  10. List<User> userList = userMapper.selectList(queryWrapper);
  11. System.out.println("userList:" + userList);
  12. Integer result = userMapper.selectCount(queryWrapper);
  13. System.out.println("result:" + result);
  14. }

三、LambdaQueryChainWrapper

  1. //链式查询方式
  2. User one = new LambdaQueryChainWrapper<>(userMapper)
  3. .eq(User::getName, "liangd1")
  4. .one();
  1. @Test
  2. void TestLambdaQueryChainWrapper() {
  3. //1、eq查询单条
  4. User one = new LambdaQueryChainWrapper<>(userMapper)
  5. .eq(User::getName, "liangd1")
  6. .one();
  7. System.out.println("UserOne:" + one);
  8. //2、查询list
  9. List<User> users = new LambdaQueryChainWrapper<>(userMapper)
  10. .eq(User::getName, "zcx")
  11. .list();
  12. System.out.println("UserList:" + users);
  13. //3、模糊查询
  14. List<User> LikeList = new LambdaQueryChainWrapper<>(userMapper)
  15. .like(User::getEmail, "test")
  16. .list();
  17. System.out.println("LikeUser:" + LikeList);
  18. }

QueryWrapper及LambdaQueryWrapper

实体类

  1. @Data
  2. public class BannerItem {
  3. private Long id;
  4. private String name;
  5. private String img;
  6. private String keyword;
  7. private Integer type;
  8. private Long bannerId;
  9. }

QueryWrapper

最基础的使用方式是这样

  1. // 查询条件构造器
  2. QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
  3. wrapper.eq("banner_id", id);
  4. // 查询操作
  5. List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

然后我们可以引入lambda,避免我们在代码中写类似的于banner_id的硬编码

  1. QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
  2. wrapper.lambda().eq(BannerItem::getBannerId, id);
  3. List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

LambdaQueryWrapper

为了简化lambda的使用,我们可以改写成LambdaQueryWrapper构造器,语法如下:
两种写法
new QueryWrapper().lambda();
Wrappers.lambdaQuery();

  1. LambdaQueryWrapper<BannerItem> wrapper = new QueryWrapper<BannerItem>().lambda();
  2. // LambdaQueryWrapper<BannerItem> wrapper = Wrappers.lambdaQuery(); // 两种写法
  3. wrapper.eq(BannerItem::getBannerId, id);
  4. List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

我们可以再次将QueryWrapper.lambda()简化,变成这个样子

  1. BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
  2. .eq(BannerItem::getId, id)
  3. .one();

链式查询

MyBatis-Plus还提供了一种链式查询的方式,和上面的代码效果一样。
但是这种写法偏向于炫技,可读性没有上面的代码强,大家可以根据需要自行选择方式。

  1. List<BannerItem> bannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper)
  2. .eq(BannerItem::getBannerId, id)
  3. .list();

如果只想查询一条记录,例如通过id查询某条记录的详情,使用.one()即可,例如

  1. BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
  2. .eq(BannerItem::getId, id)
  3. .one();

lambdaQueryWrapper中常用方法

相关文章