mybatis 的Mapper的xml中批量操作Oracle記錄的正確姿勢

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再來定奪吧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章