mybatis 动态sql 语法示例

xiaoxiao2021-02-28  47

批量更新

方式1

trim标签的属性 suffixOverrides="," 表示去除多余的后缀内容,。 prefix="set" 表示设置前缀内容为set。 suffix="end," 表示设置前后缀内容为end,。

<update id="updateBatch" parameterType="java.util.List"> update t_item_priority <trim prefix="set" suffixOverrides=","> <trim prefix="item_random_score = case" suffix="end,"> <foreach collection="list" item="item" index="index"> when id=#{item.id} then #{item.item_random_score} </foreach> </trim> <trim prefix="update_time = case" suffix="end,"> <foreach collection="list" item="item" index="index"> when id=#{item.id} then #{item.update_time} </foreach> </trim> </trim> where id in <foreach collection="list" index="index" item="item" separator="," open="(" close=")"> #{item.id} </foreach> </update>

该SQL批量更新了表t_item_priority中满足id需求的数据记录的两个字段item_random_score和update_time。以下是一个对应的SQL语句

UPDATE t_item_priority SET item_random_score = CASE WHEN id = $id1 THEN $item_random_score1 WHEN id = $id2 THEN $item_random_score1 END, update_time = CASE WHEN id = $id1 THEN $update_time1 WHEN id = $id2 THEN $update_time2 END WHERE id IN ($id1, $id2)

mybatis调用代码示例片段:

List<Map<String,Object>> list = new ArrayList<>(); Random random = new Random(); Date now = new Date(); for (int i = 1; i <5 ; i++) { Map<String,Object> map = new HashMap<>(); map.put("id",i); map.put("item_random_score",random.nextFloat()); map.put("update_time",now); list.add(map); } sqlSession.update($sqlId, list);

方式2

参考自mybatis学习之路—-批量更新数据两种方法效率对比

<update id="batchUpdate" parameterType="java.util.Map"> <!-- 接收list参数,循环着组装sql语句,注意for循环的写法 separator=";" 代表着每次循环完,在sql后面放一个分号 item="cus" 循环List的每条的结果集 collection="list" list 即为 map传过来的参数key --> <foreach collection="list" separator=";" item="cus"> update t_customer set c_name = #{cus.name}, c_age = #{cus.age}, c_sex = #{cus.sex}, c_ceroNo = #{cus.ceroNo}, c_ceroType = #{cus.ceroType} where id = #{cus.id} </foreach> </update>

对于mysql数据库,url连接要设置&allowMultiQueries=true,否则报错。

foreach 实现in集合

只有一个数组或集合参数

批量删除多个用户,in查询

<delete id="deleteUsers" parameterType="list" > DELETE FROM user WHERE 1 = 1 <if test="list != null and list.size()>0"> AND id IN <foreach collection="list" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> </delete>

mybatis调用代码示例片段:

List<String> ids = new ArrayList<>(); ids.add("4"); ids.add("5"); int delete = sqlSession.delete($sqlId, ids);

当调用方使用数组参数时,foreach 标签的collection属性设置为array即可

参考文章

mybatis学习之路—-批量更新数据两种方法效率对比

转载请注明原文地址: https://www.6miu.com/read-2625412.html

最新回复(0)