Mybatis-Plus的LambdaWrapper
在MP中,Lambdawrapper是一种较为特殊的包装器,主要的功能是用于解耦sql语句。
比如,我们要查询一个表中,balance字段大于100的数据内容,返回为对应的字段a\b\c
那么在使用wrapper包装器的时候,我们的语句是:
QueryWrapper<Entity> wrapper = new QueryWrapper<Entity>();wrapper.select("a","b","c").gt("balance",100);List<Entity> list = selectList(wrapper);
而当我们使用LambdaWrapper时,效果是:
LambdaQueryWrapper<Entity> wrapper = new LambdaQueryWrapper<Entity>();wrapper.select(()->Entity.getA,()->Entity.getB,()->Entity.getC).gt("balance",100);List<Entity> list = selectList(wrapper);
注意在select中只能传递函数Function,目前对函数部分的理解并不深刻。
现在的理解是引入函数变成,相当于在面向对象编程中引入了面向过程编程的形式,免去了面向对象编程重复创建对象的开发成本。对于这部分只使用很少次数的行为,直接使用函数表达式来进行编程即可。
可以简单猜测一下底层干的事,用函数拿到了实体对应的属性内容,底层通过某种机制去反向窃取到表的字段名。(前提是:按照驼峰与下划线的约定编写实体属性与字段名)
2.MP用法的不规范
在企业开发中,MP很多的代码会出现在Service层,但按照基本规范来说,不应该在service层出现持久层的代码,应将这部分调用至Mapper层中。所以现在很多公司不太建议或者直接禁止使用MP
为了能够使用MP,可以将复杂的where语句用MP包装,其余语句使用标签的形式直接在mapper接口中书写,那么效率依然能提升。
下面的例子采用的是xml注解形式
@Testpublic void testMPSegment(){List<Long> ids= List.of(1L, 2L, 4L);int amount = 200;Wrapper<User> wrapper = new QueryWrapper<User>().in("id", ids);userMapper.updateBalanceByIds(wrapper,amount);}@Mapper
public interface UserMapper extends BaseMapper<User> {void updateBalanceByIds(@Param(Constants.WRAPPER) Wrapper<User> wrapper, @Param("amount") int amount);
}<update id="updateBalanceByIds">UPDATE user<set>balance = balance + #{amount}</set>${ew.customSqlSegment}</update>
这里需要注意的是必须在mapper方法中将参数用标签@Param("ew")进行标记,这里的Constant.wrapper对应的就是ew