又来总结了,不然我写这一行的时候,只有上帝和我知道我当时写什么~~
1、条件查询的三种写法,现在我只用了第一种
1)通常写法
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 20);
2)QueryWrapper 的 lambda 表达式写法,这样能够避免写字段名写错,或者未转换驼峰写法导致 SQL 错误
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(UserInfo::getAge, 20);
3)LambdaQueryWrapper 与 QueryWrapper 的 lambda 写法基本一致
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getAge, 20);
2、or()用法的注意点
where status =0 and phone =? or email =?
等价于
QueryWrapper<TUserinfo> userWrapper = new QueryWrapper();
userWrapper.eq("status",0).or("phone",loginId).or().eq("email",loginId);
带括号的or拼接用下面的写法,箭头函数 (输入参数) ->(输出值) ,J8的lambda表达式
where status =0 and (phone =? or email =?)
等价于
QueryWrapper<TUserinfo> userWrapper = new QueryWrapper();
userWrapper.eq("status", 0);
userWrapper.and(use -> use.eq("phone", loginId).or().eq("email",loginId));
3、去除多余的and或or
别写where 1=1 了 用<where>
和<if>
标签去除第一个多余的and,但是<if>
里面又包含<if>
的条件存在多余的系统是去不掉的,例如
<if test="map.smsType != null and map.smsType != ''">
and C.TYPE = #{map.smsType}
</if>
<if test="map.channelType != null and map.channelType != ''">
AND (
<trim prefixOverrides="OR">
<if test="map.channelType.contains('MD1')">
OR(C.CHANNEL = 'MD1' OR (C.CHANNEL = 'all' AND C.RESULT LIKE concat('%','MD1','%')))
</if>
<if test="map.channelType.contains('MD2')">
OR(C.CHANNEL = 'MD2' OR (C.CHANNEL = 'all' AND C.RESULT LIKE concat('%','MD2','%')))
</trim>
)
</if>
trim标签内sql语句加前缀
suffix 加后缀 prefixOverrides 去除多余的前缀 (可解决上面所说问题) suffixOverrides 去除多余的后缀