1、環境:
oracle:11g
<!--oracle驅動 -->
<dependency>
<groupId>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>14</version>
</dependency>
mybatis
<!-- 加入mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
2、正確姿勢
<insert id="batchInsertPin">
<foreach collection="pins" item="pin" index="index" separator=";" open="begin" close=";end;">
insert into IDS_PIN
(ID,
CONN_ID,
PIN_CODE,
DIRECTION,
TYPE,
CODE,
SIGNAL_CONTENT,
LOAD_CHARACTER,
LOAD_VOLTAGE,
LOAD_CURRENT,
IS_IGNORE,
FILE_LIST_ID,
TWIN_TWIST,
SHIELD,
SHIELD_GROUND,
REMARK,
LASTREPLACEDPINID,
PROJECT_ID)
values
(
#{pin.id,jdbcType=VARCHAR},
#{pin.connId,jdbcType=VARCHAR},
#{pin.pinCode,jdbcType=VARCHAR},
#{pin.direction,jdbcType=VARCHAR},
#{pin.type,jdbcType=VARCHAR},
#{pin.code,jdbcType=VARCHAR},
#{pin.signalContent,jdbcType=VARCHAR},
#{pin.loadCharacter,jdbcType=VARCHAR},
#{pin.loadVoltage,jdbcType=VARCHAR},
#{pin.loadCurrent,jdbcType=VARCHAR},
#{pin.isIgnore,jdbcType=DOUBLE},
#{pin.fileListId,jdbcType=VARCHAR},
#{pin.twinTwist,jdbcType=VARCHAR},
#{pin.shield,jdbcType=VARCHAR},
#{pin.shieldGround,jdbcType=VARCHAR},
#{pin.remark,jdbcType=VARCHAR},
#{pin.lastReplacedPinId,jdbcType=VARCHAR},
#{pin.projectId,jdbcType=VARCHAR}
)
</foreach>
</insert>
其實就是<foreach>的用法加上oracle批量操作的語法整合而成
mybatis的<foreache>語法如下:
foreach元素的屬性主要有item,index,collection,open,separator,close。
- item:集合中元素迭代時的別名,該參數爲必選。
- index:在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選
- open:foreach代碼的開始符號,一般是(和close=")"合用。常用在in(),values()時。該參數可選
- separator:元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該參數可選。
- close: foreach代碼的關閉符號,一般是)和open="("合用。常用在in(),values()時。該參數可選。
- collection: 要做foreach的對象,作爲入參時,List對象默認用"list"代替作爲鍵,數組對象有"array"代替作爲鍵,Map對象沒有默認的鍵。當然在作爲入參時可以使用@Param("keyName")來設置鍵,設置keyName後,list,array將會失效。 除了入參這種情況外,還有一種作爲參數對象的某個字段的時候。舉個例子:如果User有屬性List ids。入參是User對象,那麼這個collection = "ids".如果User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麼collection = "ids.id"
在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
- 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值爲list .
- 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值爲array .
- 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在MyBatis裏面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裏面的key.
針對最後一條,我們來看一下官方說法:
注意 你可以將一個 List 實例或者數組作爲參數對象傳給 MyBatis,當你這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中並以名稱爲鍵。List 實例將會以“list”作爲鍵,而數組實例的鍵將是“array”。
所以,不管是多參數還是單參數的list,array類型,都可以封裝爲map進行傳遞。如果傳遞的是一個List,則mybatis會封裝爲一個list爲key,list值爲object的map,如果是array,則封裝成一個array爲key,array的值爲object的map,如果自己封裝呢,則colloection裏放的是自己封裝的map裏的key值。
參考:詳細參考:https://www.cnblogs.com/fnlingnzb-learner/p/10566452.html
3、用union all也可以
<!--批量插入-->
<insert id="batchInsertDevices" parameterType="com.esoon.ids.model.Device">
insert into IDS_DEVICE
(ID, PROJECT_ID, CODE, FILE_LIST_ID)
<foreach collection="devices" item="device" separator="UNION ALL">
SELECT #{device.id,jdbcType=VARCHAR},
#{device.projectId,jdbcType=VARCHAR},
#{device.code,jdbcType=VARCHAR},
#{device.fileListId,jdbcType=VARCHAR}
FROM dual
</foreach>
</insert>
3、網上的坑
之前我用了下圖的這個,只是沒加useGeneratedKeys="false",報錯,難道oracle加完這個就不報錯了》???等學完oracle再來定奪吧