前言
我之前写动态sql 一直是手撸xml,拼接sql啥的,最近学习了mybatis-plus觉得里边的方法参数Wrapper函数式编程,一直在研究怎么自己写的xml文件能用上wrapper参数然后开始翻找源码,终于发现官方早给了教程,如下。
/**
* 获取自定义SQL 简化自定义XML复杂情况
* <p>
* 使用方法: `select xxx from table` + ${ew.customSqlSegment}
* <p>
* 注意事项:
* 1. 逻辑删除需要自己拼接条件 (之前自定义也同样)
* 2. 不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦)
* 3. 用法 ${ew.customSqlSegment} (不需要where标签包裹,切记!)
* 4. ew是wrapper定义别名,不能使用其他的替换
*/
public String getCustomSqlSegment() {
MergeSegments expression = getExpression();
if (Objects.nonNull(expression)) {
NormalSegmentList normal = expression.getNormal();
String sqlSegment = getSqlSegment();
if (StringUtils.isNotBlank(sqlSegment)) {
if (normal.isEmpty()) {
return sqlSegment;
} else {
return Constants.WHERE + StringPool.SPACE + sqlSegment;
}
}
}
return StringPool.EMPTY;
}
教程
- 自定义mapper.xml文件,手撸sql按照官方要求拼接
${ew.customSqlSegment}
,官方给出的解释:(不需要where标签包裹,切记!)
<select id="selectTableList" resultMap="BaseResultMap">
select goods_id from table ${ew.customSqlSegment}
</select>
- 绑定java接口文件,mapper.java,我们按照官方给的要求写接口:
@Param(Constants.WRAPPER)=ew是wrapper定义别名,不能使用其他的替换
List<Table> selectTableList(@Param(Constants.WRAPPER) Wrapper<Table> wrapper);
- 直接调用这个接口,就可以了,查询条件会自动拼接
List<Table> goodsList = goodsService.selectTableList(Wrappers.<Table>lambdaQuery()
.eq(Table::getId, '1610815700807454721')
);
- 查看sql执行日志
select goods_id from table where id='1610815700807454721'