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>
就是這樣子了.沒啥的.