欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis批量插入(insert)數(shù)據(jù)操作

 更新時(shí)間:2016年06月23日 11:59:57   作者:chenzhou123520  
本文給大家分享MyBatis批量插入(insert)數(shù)據(jù)操作知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧

在程序中封裝了一個(gè)List集合對(duì)象,然后需要把該集合中的實(shí)體插入到數(shù)據(jù)庫(kù)中,由于項(xiàng)目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前沒用過批量插入,在網(wǎng)上找了一些資料后最終實(shí)現(xiàn)了,把詳細(xì)過程貼出來(lái)。

實(shí)體類TrainRecord結(jié)構(gòu)如下:

public class TrainRecord implements Serializable { 
private static final long serialVersionUID = -1206960462117924923L; 
private long id; 
private long activityId; 
private long empId; 
private int flag; 
private String addTime; 
//setter and getter 
} 

對(duì)應(yīng)的mapper.xml中定義如下:

<resultMap type="TrainRecord" id="trainRecordResultMap"> 
<id column="id" property="id" jdbcType="BIGINT" /> 
<result column="add_time" property="addTime" jdbcType="VARCHAR" /> 
<result column="emp_id" property="empId" jdbcType="BIGINT" /> 
<result column="activity_id" property="activityId" jdbcType="BIGINT" /> 
<result column="flag" property="status" jdbcType="VARCHAR" /> 
</resultMap> 

mapper.xml中批量插入方法的定義如下:

<insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List"> 
<selectKey resultType="long" keyProperty="id" order="AFTER"> 
SELECT 
LAST_INSERT_ID() 
</selectKey> 
insert into t_train_record (add_time,emp_id,activity_id,flag) 
values 
<foreach collection="list" item="item" index="index" separator="," > 
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag}) 
</foreach> 
</insert> 

對(duì)于foreach標(biāo)簽的解釋參考了網(wǎng)上的資料,具體如下:

foreach的主要用在構(gòu)建in條件中,它可以在SQL語(yǔ)句中進(jìn)行迭代一個(gè)集合。foreach元素的屬性主要有 item,index,collection,open,separator,close。item表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名,index指 定一個(gè)名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語(yǔ)句以什么開始,separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔 符,close表示以什么結(jié)束,在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:

1.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)List的時(shí)候,collection屬性值為list

2.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array

3.如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map

關(guān)于foreach的具體例子在這里就先不舉,以后有機(jī)會(huì)可以把每一種情況都舉一個(gè)例子列出來(lái)。

MysqlBaseDAO:

public class MySqlBaseDAO extends SqlSessionDaoSupport { 
/** 
* insert:插入操作. <br/> 
* 
* @author chenzhou 
* @param method 插入操作的方法名 
* @param entity 查詢參數(shù)或?qū)嶓w類 
* @return 返回影響的行數(shù) 
* @since JDK 1.6 
*/ 
public int insert(String method,Object entity){ 
return this.getSqlSession().insert(method, entity); 
} 
//其余方法省略 
} 

TrainRecord實(shí)體類對(duì)應(yīng)的TrainRecordDAO 定義如下:

public class TrainRecordDAO extends MySqlBaseDAO { 
/** 
* addTrainRecordBatch:批量插入培訓(xùn)記錄. <br/> 
* 
* @author chenzhou 
* @param trainRecordList 培訓(xùn)記錄list集合 
* @return 影響的行數(shù) 
* @since JDK 1.6 
*/ 
public int addTrainRecordBatch(List<TrainRecord> trainRecordList){ 
return this.insert("addTrainRecordBatch", trainRecordList); 
} 
//省略其余的方法 
} 

然后直接調(diào)用TrainRecordDAO 中的 addTrainRecordBatch方法就可以批量插入了。

特別說明的是在嘗試時(shí)碰到了一個(gè)讓人無(wú)語(yǔ)的錯(cuò)誤,折騰了我差不多1個(gè)小時(shí)才解決。就是我在定義mapper.xml中的插入方法時(shí)一般都會(huì)默認(rèn)用<![CDATA[ ]]>標(biāo)簽把sql語(yǔ)句括起來(lái),如下所示:

<![CDATA[ 
select * from t_train_record t where t.activity_id=#{activityId} 
]]> 

這樣做的目的主要是因?yàn)樵?XML 元素中,"<" 和 "&" 是非法的。"<" 會(huì)產(chǎn)生錯(cuò)誤,因?yàn)榻馕銎鲿?huì)把該字符解釋為新元素的開始。"&" 也會(huì)產(chǎn)生錯(cuò)誤,因?yàn)榻馕銎鲿?huì)把該字符解釋為字符實(shí)體的開始。而sql語(yǔ)句或者腳本語(yǔ)句中可能會(huì)存在 "<" 或 "&" 字符。為了避免錯(cuò)誤,可以將sql語(yǔ)句定義為 CDATA。CDATA 部分中的所有內(nèi)容都會(huì)被解析器忽略。

當(dāng)時(shí)我在addTrainRecordBatch方法中也用了這種用法:

<![CDATA[ 
insert into t_train_record (add_time,emp_id,activity_id,flag) 
values 
<foreach collection="list" item="item" index="index" separator="," > 
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag}) 
</foreach> 
]]> 

結(jié)果程序在執(zhí)行時(shí)老是報(bào)錯(cuò): com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,查看錯(cuò)誤信息就是傳入的參數(shù)都是null。糾結(jié)了很久,后面才發(fā)現(xiàn)原來(lái)是<![CDATA[ ]]>把xml中的<foreach>標(biāo)簽括起來(lái)后把標(biāo)簽直接當(dāng)成字符串處理了。后面把外面的<![CDATA[ ]]>去掉后就能正常執(zhí)行了。

相關(guān)文章

  • 一文詳解Java對(duì)象的序列化和反序列化

    一文詳解Java對(duì)象的序列化和反序列化

    本文主要介紹了一文詳解Java對(duì)象的序列化和反序列化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • MyBatis3.X復(fù)雜Sql查詢的語(yǔ)句

    MyBatis3.X復(fù)雜Sql查詢的語(yǔ)句

    這篇文章主要介紹了MyBatis3.X復(fù)雜Sql查詢的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)

    Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)

    這篇文章主要介紹了Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐

    springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐

    微信掃碼功能是目前第三方登錄常見功能,前不久有個(gè)項(xiàng)目剛好用上,本文主要介紹了springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java關(guān)鍵字this(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java關(guān)鍵字this(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    java中的this隨處可見,用法也多。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時(shí)候,有一個(gè)疑問卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,下面通過本文給大家記錄下,有需要的朋友參考下
    2017-03-03
  • 基于eclipse-temurin鏡像部署spring boot應(yīng)用的實(shí)現(xiàn)示例

    基于eclipse-temurin鏡像部署spring boot應(yīng)用的實(shí)現(xiàn)示例

    本文提供了基于eclipse-temurin鏡像部署Spring Boot應(yīng)用的詳細(xì)實(shí)現(xiàn)示例,通過使用Docker鏡像,可以輕松地創(chuàng)建和管理Spring Boot應(yīng)用程序的容器化環(huán)境,感興趣的可以了解一下
    2023-08-08
  • Spark SQL的自定義函數(shù)UDF使用

    Spark SQL的自定義函數(shù)UDF使用

    Spark Sql可以通過UDF來(lái)對(duì)DataFrame的Column進(jìn)行自定義操作。在特定場(chǎng)景下定義UDF可能需要用到Spark Context以外的資源或數(shù)據(jù)。比如從List或Map中取值,或是通過連接池從外部的數(shù)據(jù)源中讀取數(shù)據(jù),然后再參與Column的運(yùn)算
    2023-02-02
  • Java動(dòng)態(tài)追蹤技術(shù)探究之從JSP到Arthas

    Java動(dòng)態(tài)追蹤技術(shù)探究之從JSP到Arthas

    這篇文章主要介紹了Java動(dòng)態(tài)追蹤技術(shù)探究之從JSP到Arthas,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • java 四舍五入使java保留2位小數(shù)示例講解

    java 四舍五入使java保留2位小數(shù)示例講解

    這篇文章主要介紹了java四舍五入使java保留2位小數(shù)示例,大家參考使用
    2013-12-12
  • 淺談java Properties類的使用基礎(chǔ)

    淺談java Properties類的使用基礎(chǔ)

    下面小編就為大家分享一篇淺談java Properties類的使用基礎(chǔ),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-01-01

最新評(píng)論