1. 程式人生 > >MyBatis學習筆記-08.MyBatis動態Sql語句foreach的collection的用法以及用foreach實現批量刪除與批量新增

MyBatis學習筆記-08.MyBatis動態Sql語句foreach的collection的用法以及用foreach實現批量刪除與批量新增

本次將繼續記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)
        • 對映檔案內容:

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)測試程式及結果