Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询和具体实现

本文揭秘如何在MyBatis中通过${ew.customSqlSegment}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

项目中需要实现自定义的查询,但是仍然想用QueryWrapper对象里面的那些查询,

解决

在接口中方法中:@Param(Constants.WRAPPER) QueryWrapper<T> queryWrapper;   里面的Constants.WRAPPER其实就是:"ew"

在我们的Mapper.xml文件中:

直接使用:${ew.customSqlSegment} 就可以调用QueryWrapper对象的条件sql

<select id="selectCustExtraInfoPage">
        SELECT * FROM cust_info ${ew.customSqlSegment}
</select>

这里为什么用${} 就不用再说了吧

分析

就上面就可以直接用了,下面来分析怎么调用的

首先我们看到${ew.customSqlSegment} 这里,我们首先猜测Query Wrapper里面是不是有这个属性,因为我们用过mybaits都知道, 传入一个对象之后,直接对象.属性就可以获取值

附上Query Wrapper的关系图

我在Wrapper类中找到了getCustomSqlSegment()方法,所以我猜测肯定是调用了这个get方法,

但是奇怪的是这个类里面并没有customSqlSegment属性字段

 

所以我就猜测难道是直接调用的这个get方法,根据我们传入的属性名称,拼接成get+属性名称,这样来调用的吗?

扩展

所以我就写了一个demo 

1、没有属性值

2、但是有一个getUserForId()的方法,

3、在mapper.xml文件中 :对象.userForId   但是注意:我的类里面并没有这个属性

试一下是否可以成功查询出数据!

实体类:

xml文件

调用:居然真的查询成功了!!!!!!!!!!!!!

end 查看源码中:

Reflector类中:

构造方法里面,根据该类名获取所有的get方法

到这里大家应该就明白了,

是根据所有的get方法,经过处理

保存到:getMethods中

最后得到的结果就是:

调用的时候:根据xml里面的属性名称,在我们上面初始化的getMethods的map中找到对应的方法,执行方法的调用

总结

所以这就是为啥 ${ew.customSqlSegment} 可以调用的原因了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值