mybatis怎么根据多个条件对指定字段进行内容修改?

根据用户编号,日期,类型条件进行查询此用户某天数据,在对指定字段进行内容修改,sql要怎么写?测试方法怎么写?

// 接口
void updateId(QshGfConsData qshGfConsData);



//接口实现
<update id="updateId">
update QSH_S_GFCONS_DATA
<set>
<if test="rap_el=null">
rap_e =# rap_e
</if>
and
<if test="data_value!=null">
data_value =# data_value
</if>
</set>
WHERE CONS_NO = # CONS_NO]
AND DATA_DATE =#DATA_DATE
AND USAGE_TYPE_CODE =# USAGE_TYPE_CODE
</update>

//测试方法
@Test
public void updateQsh() throws ParseException 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat( pattern:"yyyy-MM-dd");

Date date = simpleDateFormat.parse( source:"2022-08-01");
QshGfConsData qshGfConsData1 = qshGfConsData.updateId(ashGfConsData: 12.2 12.2);

简单记录下:想要修改一张表,是联合主键,也就是where后两个以上条件才能唯一确定一条数据。
如果有唯一键,那么foreach中 用in就可以解决。
现在没办法用in,不然 A in (#{})and B in (#{})感觉成笛卡尔了。
简单点就是要实现执行多条语句。对update做循环。传入参数为 List,ATest类中字段A,B为联合主键,修改C的值

update table_ABC C = #{val.C}, where A=#{val.A} and B= #{val.B} 1 2 3 4 5 6 7 8 9 执行出来效果为: begin update table_ABC set C = '2' where A = '1' and B= '1'; update table_ABC set C = '2' where A = '1' and B= '2'; update table_ABC set C = '4' where A = '3' and B= '2'; end; 这里使用的数据库为oracle,oracle执行认为begin和end之前为一条语句

当然,也可以用or 的形式拼接,不过还没测试。
网上查有的说是mysql数据库 mybatis一次执行一条语句。支持多条,可以MySQL连接数据库时,添加语句:“allowMultiQueries=true”
作用:
1.可以在sql语句后携带分号,实现多语句执行。
2.可以执行批处理,同时发出多个SQL语句。

首先

img

略作修改

img

如果是单表的增删改查可以考虑使用 mybatis plus 。避免使用xml sql脚本

img


mybatis支持sql拼接,传入的参数可用通过${}或#{}进行获取,前者可能导致sql注入,慎用

在mapper中,通过@Param注解可以指定参数的别名,针对多个对象显示声明一下,更不容易出错。
字符型判空时,不光要和null比较,最后也和空串比较一下

set和where中间的and去掉,并且变量加大括号像#{rap_e},大括号后面跟上逗号

transportMapper.update(null,new LambdaUpdateWrapper<Transport>().in(Transport::getId,ids).set(Transport::getOrderStatus,OrderStatusEnum.ORDERED));