LambdaQueryWrapper模拟实现

一、LambdaQueryWrapper?

LambdaQueryWrapper是Mybatis-Plus插件的对象,实现了使用lambda形式构造查询接口。
最初接触这个的时候,第一感觉就是,太方便了,因避免是用大量的字符串,对日后的维护有着很重要的作用。

二、类名::GET方法

在LambdaQueryWrapper构造语句的方法中使用了大量的这种方式作为查询数据库的字段名。这种方式还可指定具体的类。

类名::GET方法,这是lambda的调用Get方法,简化操作的,例:

List<String> list = new ArrayLiast();
list.add("Hello");
//化简前
list.forEach(item -> System.out.println(item));
//化简后
list.forEach(System.out::println);

具体使用可自行百度,:: 实现是其实使用的是Function<T, R>接口,该接口声明@FunctionalInterface,即这是函数式接口。


二、如何结合使用?

LambdaQueryWrapper 查询需要的是字段名,而::得到的是执行get方法。那么mybatis-plus到底是怎么将get方法转换为字段的呢。并不是执行呢?
IDEA调试方法可知如下:
在这里插入图片描述
类名::GET方法实际类型是Function<T,R>,而mybatis-plus使用新的接口SFunction<T,R>将Function序列化后,该Function接口会在运行时添加writeReplace方法,可以查看当前执行方法的类名、方法名等信息。然后通过方法名解析出字段名。

三、示例代码

@FunctionalInterface
public interface SFunction<T,R> extends Function<T,R>, Serializable {
}
public class User {
    private String username;
    private String password;
	// get、set略
}
public class Builder<T> {
    private T target;

    public Builder(Class<T> tClass) {
        try {
            target = tClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static <T> Builder<T> builder(Class<T> tClass) {
        return new Builder(tClass);
    }
    public <T,R> String getFunName(SFunction<T, R> sFunction) {
        try {
            // 直接调用writeReplace
            Method methods = sFunction.getClass().getDeclaredMethod("writeReplace");
            methods.setAccessible(true);
            //反射调用
            Object sl = methods.invoke(sFunction);
            SerializedLambda serializedLambda = (SerializedLambda) sl;
            // 获取类
            String implClass = serializedLambda.getImplClass();
            Class<?> aClass = Class.forName(implClass.replace("/", "."));
            // 获取方法名
            String methodName = serializedLambda.getImplMethodName();
            return methodName;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        // 获取值
        return null;
    }
}
public class Main {
    public static void main(String[] args) {
        Builder<User> builder = Builder.builder(User.class);
        String name = builder.getFunName(User::getUsername);
        System.out.println(name);
    }
}

运行结果:

getUsername

总结

通过上面的示例,轻而易举可获取到方法的名或字段名或者其他信息。上面的代码在业务需求方面没有什么用处。但是在构造条件情况下,结合设计模式,有很醒目的作用,能够给编程带来便利。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LambdaQueryWrapper是Mybatis-Plus插件的对象,它实现了使用lambda形式构造查询接口,可以方便地构建查询条件而避免大量的字符串拼接,对于代码的维护有很重要的作用。\[1\] 如果要使用LambdaQueryWrapper实现查询,可以按照以下步骤进行操作: 1. 首先,导入Mybatis-Plus的依赖,并配置好相关的数据库连接信息。 2. 创建一个实体类,用于映射数据库表的字段。 3. 在需要进行查询的地方,创建一个LambdaQueryWrapper对象,并指定要查询的实体类。 4. 使用LambdaQueryWrapper对象的方法,如eq、like等,来构建查询条件。 5. 调用Mybatis-Plus的查询方法,传入LambdaQueryWrapper对象,即可执行查询操作。 例如,如果要查询名字为"张三"的用户,可以按照以下方式使用LambdaQueryWrapper: ```java LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getName, "张三"); List<User> userList = userMapper.selectList(queryWrapper); ``` 上述代码中,创建了一个LambdaQueryWrapper对象,并使用eq方法指定了查询条件,即名字等于"张三"。然后,调用selectList方法执行查询操作,并将查询结果存储在userList中。 通过使用LambdaQueryWrapper,可以方便地构建复杂的查询条件,提高代码的可读性和维护性。\[1\] #### 引用[.reference_title] - *1* [LambdaQueryWrapper模拟实现](https://blog.csdn.net/qq_30385099/article/details/126932838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [LambdaQueryWrapper实现原理和lambda的序列化问题](https://blog.csdn.net/leisurelen/article/details/105980615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

£漫步 云端彡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值