LambdaQueryWrapper -使用说明

前言
本篇博文是关于LambdaQueryWrapper -的使用说明,希望你能够喜欢

个人主页:晨犀主页
个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力

欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦

文章目录

  • LambdaQueryWrapper -使用说明
    • 使用和解读
    • 模拟实现
    • 总结

LambdaQueryWrapper -使用说明

使用和解读

    //我们编写方法,使用LambdaQueryWrapper封装查询条件,完成检索
 
    @GetMapping("/furnsBySearchPage2")
    public Result listFurnsByConditionPage2(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize,
            @RequestParam(defaultValue = "") String search) {
 
        //说明:关于lambda表达式, 我们这里使用的是 类名::实例方法
        //是lambda方法引用中一个不太容易理解的知识点
        //后面我们使用到每个lambda表达式式时候,就会有针对性进行讲解-这样理解的就非常深刻的心得体会: 多用几次,就熟悉了,不用背
 
        //解读
 
        //1. Furn::getName 就是通过lambda表达式引用实例方法 getName
        //2. 这里就是把  Furn::getName 赋给 SFunction 函数式接口 ? 函数式接口一会再说明
        //3. 看看  SFunction 源码
        /**
         * @FunctionalInterface
         * public interface SFunction extends Function, Serializable {
         * }
         * 父接口
         * @FunctionalInterface
         * public interface Function {
         *    R apply(T t); //抽象方法: 表示根据类型T的参数,获取类型R的结果
         *
         *    //后面还有默认实现方法
         * }
         *4. 传入 Furn::getName 后, 就相当于实现了 SFunction 的apply方法
         *5. 底层会根据 传入的 Furn::getName 去得到该方法的对应的属性映射的表的字段, 可以更加灵活
         *6. 回顾一下mybatis 在xxMapper.xml 中有 ResultMap 会体现 Bean的属性和表的字段的映射关系
         * 
         *         
         */
 
 
        //创建LambdaQueryWrapper,封装检索询件
        LambdaQueryWrapper<Furn> lambdaQueryWrapper = Wrappers.<Furn>lambdaQuery();
 
        //判断search
        if (StringUtils.hasText(search)) {
            //lambdaQueryWrapper.like(Furn::getName,search);
 
            //换一个写法-小伙伴可能会清晰, 这时使用依然是正确
            SFunction<Furn, Object> sf = Furn::getName;
            lambdaQueryWrapper.like(sf, search);
        }
 
        Page<Furn> page = furnService.page(new Page<>(pageNum, pageSize), lambdaQueryWrapper);
        log.info("page={}", page.getRecords());
        return Result.success(page);
    }
 

模拟实现

public class Test {
    public static void main(String[] args) {
 
        //传统的方式来实现NlcFunction/得到一个实现接口的对象 可以使用
        //匿名内部类
        //NlcFunction hf = new NlcFunction() {
        //    @Override
        //    public String apply(Desk desk) {
        //        return "hello desk";
        //    }
        //};
        //String val = hf.apply(new Desk());
        //System.out.println("val-" + val);
 
        NlcFunction<Desk,String> hf2 = Desk::getBrand;
 
        String val2 = hf2.apply(new Desk());
        System.out.println("val2-" + val2);
 
        NlcFunction<Desk,Object> hf3 = Desk::getId;
    }
}
 
//定义一个函数式接口: 有且只有一个抽象方法的接口
//我们可以使用@FunctionalInterface 来标识一个函数式接口
//NlcFunction是一个函数式接口 (是自定义泛型接口)
 
@FunctionalInterface
interface NlcFunction<T, R> {
    R apply(T t); //抽象方法: 表示根据类型T的参数,获取类型R的结果
 
    //public void hi();
 
    //函数式接口,依然可以有多个默认实现方法
    default public void ok() {
        System.out.println("ok");
    }
}
 
@FunctionalInterface
interface HspInterface {
    public void hi();
}
 
class Desk { //Bean
    private String name = "wyx desk";
    private String brand = "北京牌";
    private Integer id = 10;
 
    public Integer getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    public String getBrand() {
        return brand;
    }
 
 
}

总结

  1. 函数式接口: 有且只有一个抽象方法的接口。
  2. R apply(T t);是抽象方法: 表示根据类型T的参数,获取类型R的结果

热门专栏推荐
Thymeleaf快速入门及其注意事项

Spring Initailizr–快速入门–SpringBoot的选择

带你了解SpringBoot支持的复杂参数–自定义对象参数-自动封装

Rest 优雅的url请求处理风格及注意事项

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力

你可能感兴趣的:(SpringBoot,spring,boot,后端,java)