需求
项目中需要实现自定义的查询,但是仍然想用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} 可以调用的原因了