1. 程式人生 > >【MyBatis】動態SQL——foreach使用 /批量更新或批量插入

【MyBatis】動態SQL——foreach使用 /批量更新或批量插入

1.foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合

2.可以傳遞一個 List 例項或者陣列作為引數物件傳給 MyBatis。當你這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中,用名稱作為鍵。List 例項將會以“list”作為鍵,而陣列例項將會以“array”作為鍵

3.foreach的collection能夠支援的三種集合型別list,array以及map

4.foreach元素的屬性主要有 item,index,collection,open,separator,close。

  • item:集合中每一個元素進行迭代時的別名
  • index:指定一個名字,用於表示在迭代過程中,每次迭代到的位置
  • collection:若傳遞的是集合,則為list;若傳遞的是陣列,則為array;若傳入的引數是多個的時候,我們就需要把它們封裝成一個Map或者Object,則為傳入引數map的key即就是引數名
  • open:該語句以什麼開始
  • close:以什麼結束
  • separator:在每次進行迭代之間以什麼符號作為分隔符

以下是批量更新

一:傳遞單個集合(鍵值是pojo)

UPDATE	t_user
SET	solary=2000
WHERE
	id IN 
	<foreach item="item" index="index" collection="list" separator="," open="(" close=")"> 
		#{item.id}
	</foreach>

二:傳遞單個數組(陣列中是pojo)

UPDATE	t_user
SET	solary=2000
WHERE
	id IN 
	<foreach item="item" index="index" collection="array" separator="," open="(" close=")"> 
		#{item.id}
	</foreach>

三:傳遞多個引數

UPDATE	t_user
SET	solary=2000
WHERE
	id IN 
	<foreach item="item" index="index" collection="ids" separator="," open="(" close=")"> 
		#{item.id}
	</foreach>

  三者唯一區別就是collection值不同
  以上時提前把要跟新的值查出來放到集合或陣列中,但可不可以IN中放查詢語句那,如:

UPDATE t_user 
	SET solary = 2000 
WHERE
	id IN ( SELECT id FROM t_user WHERE end_time < NOW( ) )

  但是這樣是不行的,mysql不允許這樣寫(我猜可能是查的同時不同更改,就如list集合在做查詢錯做時是不能刪除的),但是可以在查詢時查詢,如:

SELECT	* 
	FROM	t_user
WHERE
	id IN ( SELECT id FROM t_user WHERE end_time < NOW( ) )

以下是批量插入(插入兩條資料記錄)

第一次嘗試:

INSERT t_usr ( NAME )
VALUES
	< foreach collection = "list" item = "user" OPEN = "(" CLOSE = ")" SEPARATOR = "," >
		#{user.name}
	</ foreach>

  解析的sql為: INSERT t_usr (name ) VALUES ( ? , ? )
  報如下錯誤: Cause: java.sql.SQLException: Column count doesn’t match value count at row 1

第二次嘗試:

INSERT t_usr (NAME )
VALUES
	< foreach collection = "list" item = "user" OPEN = "" CLOSE = "" SEPARATOR = "," > 
			(#{user.name})
	</ foreach>

  解析的sql為: INSERT t_usr (id,name ) VALUES (?) , (?)
  正確插入

相關推薦

MyBatis動態SQL——foreach使用 /批量更新批量插入

1.foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合 2.可以傳遞一個 List 例項或者陣列作為引數物件傳給 MyBatis。當你這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中,用名稱作為鍵。List 例項將會以“l

Mybatis動態SQL之choose、when、otherwise

Mybatis中沒有if-else的寫法,取而代之的是choose-when-otherwise。choose在最外面,when相當於if,otherwise則相當於else。 <choose> <wh

MyBatis動態sql

我們需要知道的是,使用mybatis重點是對sql的靈活解析和處理。在原先的UserMappser.xml中,我們這樣查詢表中滿足條件的記錄 : <select id="findUserList" parameterType="userQueryVo" r

mybatis動態SQL操作之更新

1)  更新條件不確定,需要根據情況產生SQL語法,這種情況叫動態SQL /** * 持久層*/ public class StudentDao { /** * 動態SQL--更新 */ public void dynaSQLwithUpda

PB動態SQL語句

所謂動態SQL語句是指部分或者整個SQL語句在執行時才能確定,這樣的SQL語句可以用來設計能和使用者進行更好互動的介面。因為引數的確定留給使用者總比程式設計時由開發人員規定死要好得多。另外, PowerBuilder不支援有些SQL語句的嵌入執行,例如Create Tabl

javamybatis在使用mybatis進行批量插入批量更新批量操作時,切割In集合List進行分批批量操作的java中的切割代碼

lse span ati 批量更新 次數 sublist 調用 size ==       紅字部分代表mybatis的批量操作調用方法:       int num = 0; int maxLength = 200; in

mybatis mybatis foreach操作動態

1.傳入的資料key為表的欄位,value為值。Map<String, String>。 int saveDatalist(@Param("params")Map<String, String> params); <!-- 儲存新增資料 --> &l

Mybatis(六)動態SQL

在【Mybatis】(一)第一個mybatis例項中已經建立了資料庫和基本的執行環境,接下來將介紹Mybatis動態SQL。 1、定義EmployeeMapperDynamicSQL介面 package com.lhk.mybatis.dao; import c

MybatisMyBatis動態SQL(六)

aslist 當前 public 不能 var int nts email tle   MyBatis 的強大特性之一便是它的動態 SQL,本章介紹動態 SQL   查看本章,請先閱讀【Mybatis】MyBatis對表執行CRUD操作(三)。   本例表結構 1 CRE

Mybatis深入淺出Mybatis(八)——動態SQL

一、前言       前一篇部落格中介紹了Mybatis的別名的使用,這個方法也是非常方便的。下面小編向大家介紹一下Mybatis的最精彩的亮點——動態SQL。通過mybatis提供的各種標籤方法實現

MyBatis基礎入門《二十》動態SQL(foreach)

MyBatis基礎入門《二十》動態SQL(foreach) 1. 迭代一個集合,通常用於in條件 2. 屬性   > item   > index   > collection : 必須指定     > list     > array     > map-

Mybatis動態SQL使用foreach遍歷

在之前資料庫中用sql語句批量刪除的操作    使用sql多條刪除語句delete from person where name in ('a','b'); 現在改用mybatis中批量資料庫語句刪除 <delete id="deletePerson"&g

mybatismybatis oracle批量插入資料

參考:mybatis 對 oracle 的批量操作:https://blog.csdn.net/dzhuqiaolun/article/details/54864521 寫法一: <insert id="insertAttractionsBatch" parameterType="ja

SparkSpark SQL, DataFrames and Datasets Guide(翻譯文,持續更新)

本文主要是翻譯Spark官網Spark SQL programming guide 。只能保證大概意思,儘量保證細節。英文水平有限,如果有錯誤的地方請指正,輕噴。目錄導航在右上角 概述   Spark SQL 是一個結構化資料處理的 Spark 模組 。 與基礎的 Spark RDD API 不同的是

javaEE Mybatis動態sql,if標籤、where標籤、foreach標籤,sql片段

UserMapper.xml(實體類的Sql配置檔案,動態sql(標籤),sql片段): <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org

Mybatismapper動態代理和對映檔案配置標籤

提要:主要演示了mybatis中,在類中的其他自定義類,在sql語句中如何取值。sql語句中,範圍sql與集合的對應   一、目錄結構 二、相關實體類 QueryVo package com.test.domain; import java.io.Seria

Mybatismapper動態代理和sqlMapconfig.xml配置標籤

1.mapper動態代理 使用mapper對映來,聯絡sql語句和程式碼函式。 步驟一:在上一篇基礎的上,新增一個介面,要求與UserMapper的xml配置檔案同名,加入在xml中的所有sql的id相同的方法,即方法名相同,入參和返回值都相同 步驟二:修改usermapper的名稱

OraclePL/SQL 儲存過程 顯式遊標、隱式遊標、動態遊標

  【Oracle】PL/SQL 顯式遊標、隱式遊標、動態遊標 2013年06月17日 09:02:51 AlphaWang 閱讀數:13009更多 個人分類: 【Database】 在PL/SQL塊中執行SELECT、INSERT、DELET

MyBatissql語句中的按時間排序無效問題order by create_time desc

mybatis的mapper檔案中書寫sql語句,但是根據時間倒序查詢的order by create_time 突然無效了,這是為什麼?導致無效的原因:時間格式做了改變,時間欄位別名和原始欄位重名,導

MyBatisForeach語句

Foreach包含的屬性有:collection、index、open、close、item、separator。   index:迴圈過程中產生的索引值。 open:Foreach以什麼開始。 close:Froeach以什麼結束。 item:Foreach迴圈過程中產生