1. 程式人生 > >mybatis的批量更新

mybatis的批量更新

關於批量更新,方式有很多,可以使用batch進行批處理,也可以直接自己使用jdbc進行批處理,今天我們要寫的是mybatis 的語法組裝成批處理的方式:

所用到的表結構如下:

CREATE TABLE `student` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `no` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

資料如下:

藉口方法:

void uptateTable(@Param("lists") List<Map<String,Object>> lists);


void uptateTable2(@Param("lists")List<Map<String, Object>> maps);

void uptateTable3(@Param("lists")List<Map<String, Object>> maps);

void uptateTable4(@Param("lists")List<Map<String, Object>> maps);

呼叫方法:

@GetMapping("hello3")
public String hello3(){
    List<Map<String, Object>> maps = new ArrayList<>();
    for (int i = 1; i < 3; i++) {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("id",i);
        hashMap.put("name","name"+i);
        maps.add(hashMap);
    }
    foundationDataDao.uptateTable(maps);
    foundationDataDao.uptateTable2(maps);
    return  "hello ZhaoJun333";
}


@GetMapping("hello4")
public String hello4(){
    List<Map<String, Object>> maps = new ArrayList<>();
    for (int i = 1; i < 5; i++) {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("id",i);
        hashMap.put("name","name"+i);
        hashMap.put("age",i*100);
        hashMap.put("my_no",i+""+i);
        maps.add(hashMap);
    }
    foundationDataDao.uptateTable5(maps);
    return  "hello ZhaoJun333";
}

就是因為懶,就會直接寫了

1.根據id去更新一個值, 根據id去更新name值

第一種寫法

<update id="uptateTable" parameterType="java.util.Map">
    update `student`
    <trim prefix="set" suffixOverrides=",">
        <foreach collection="lists" separator="" item="list" open="name = case id" close="end, ">
            when #{list.id} then #{list.name}
        </foreach>
    </trim>
    <where>
        <foreach collection="lists" separator="or" item="list">
            id = #{list.id}
        </foreach>
    </where>
</update>
第二種寫法
<update id="uptateTable2" parameterType="java.util.Map">
    update `student`
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="name =case" suffix="end,">
            <foreach collection="lists" item="cus">
                <if test="cus.name!=null">
                    when id=#{cus.id} then #{cus.name}
                </if>
            </foreach>
        </trim>
    </trim>
    <where>
        <foreach collection="lists" separator="or" item="list">
            id = #{list.id}
        </foreach>
    </where>
</update>

2.根據id去更新name和age值

第一種寫法

<update id="uptateTable3" parameterType="java.util.Map">
    update `student`
    <trim prefix="set" suffixOverrides=",">
            <foreach collection="lists" separator="" item="list" open="name = case id" close="end, ">
                when #{list.id} then #{list.name}
            </foreach>
            <foreach collection="lists" separator="" item="list" open="age = case id" close="end, ">
                when #{list.id} then #{list.age}
            </foreach>
    </trim>
    <where>
        <foreach collection="lists" separator="or" item="list">
            id = #{list.id}
        </foreach>
    </where>
</update>

第二種寫法

<update id="uptateTable4" parameterType="java.util.Map">
    update `student`
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="name =case" suffix="end,">
            <foreach collection="lists" item="cus">
                <if test="cus.name!=null">
                    when id=#{cus.id} then #{cus.name}
                </if>
            </foreach>
        </trim>
        <trim prefix="age =case" suffix="end,">
            <foreach collection="lists" item="cus">
                when id=#{cus.id} then #{cus.age}
            </foreach>
        </trim>
    </trim>
    <where>
        <foreach collection="lists" separator="or" item="list">
            id = #{list.id}
        </foreach>
    </where>
</update>

當然了大家也可以去使用mybatis的batch批量更新.

這種方式不用調節任何資料庫的引數,是屬於語法層面的.

就寫這麼多了,祝願大家端午節快樂

還有一種更新的方式,因為一些原因不能改配置,所以才使用了上面的方式,下面這個就簡單多了,不過這種方式只是批量執行SQL而已,沒其他的.只是需要在jdbc的連結的後面加上&allowMultiQueries=true  就行了

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/specialt_cons_room?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true   就可以使用了,xml中的SQL寫法是:

<update id="updateStatus">
  <foreach collection="list" item="item" index="index" separator=";">
    UPDATE user t
    <set>
      t.name = #{item.name},
      t.age = #{item.age}
    </set>
    WHERE t.id = #{item.id}
  </foreach>
</update>

就是這樣子了.沒啥的.