MyBatis學習筆記-08.MyBatis動態Sql語句foreach的collection的用法以及用foreach實現批量刪除與批量新增
阿新 • • 發佈:2019-02-02
本次將繼續記MyBatis動態Sql語句的choose和foreach:
一、choose(較少應用):
有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。這裡我們以mybatis官方文件中給出的例子簡單看。需搭配when標籤元素、otherwise標籤元素
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
二、foreach(重點):
動態 SQL 的另外一個常用的操作需求是對一個集合進行遍歷。繼續以學生表為例,附2個例子進行演示:
資料庫表結構:
資料庫表內容:
1.批量刪除(傳入array、傳入map、傳入list並且list中包含實體類)
- 將要刪除的學生的學號放到一個Integer數組裡,然後傳入實現批量刪除
(1)對映檔案內容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.yuan.model.Student"> <delete id="deleteByForeach"> delete from student where sno in <foreach collection="array" item="stuno" open="(" close=")" separator=","> #{stuno} </foreach> </delete> </mapper>
open在遍歷的開始加“(”,close在遍歷的結束加“)”,separator每次遍歷後加“,”
(2)測試程式及結果:
collection:相當於是el表示式的items,如果傳遞的是一個引數,並且這個引數是list或者array時,是list,collection只能寫list,是array,collection只能寫array,如案例傳遞的是陣列array。
- 如果傳遞的引數是map,collection寫的是map的key。以下用map傳遞引數,並在內使用list。
對映檔案內容:
- 如果傳遞的引數是list,list裡面有實體類或map,本例為實體類,collection寫的是list,#{}寫的是實體類的屬性。(如果list中是map,則#{}中寫的是map的key)
- 如果傳遞的引數是list,list裡面有實體類或map,本例為實體類,collection寫的是list,#{}寫的是實體類的屬性。(如果list中是map,則#{}中寫的是map的key)
- 對映檔案內容:
2.批量增加
(1)對映檔案內容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.model.Student">
<insert id="insertByForeach">
insert into student(sname,sex) values
<foreach collection="list" item="stu" separator=",">
(#{stu.sname},#{stu.sex})
</foreach>
</insert>
</mapper>
(2)測試程式及結果