最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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批量插入,由于之前沒(méi)用過(guò)批量插入,在網(wǎng)上找了一些資料后最終實(shí)現(xiàn)了,把詳細(xì)過(guò)程貼出來(lái)。

實(shí)體類(lèi)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è)名字,用于表示在迭代過(guò)程中,每次迭代到的位置,open表示該語(yǔ)句以什么開(kāi)始,separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔 符,close表示以什么結(jié)束,在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:

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

2.如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(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類(lèi) 
* @return 返回影響的行數(shù) 
* @since JDK 1.6 
*/ 
public int insert(String method,Object entity){ 
return this.getSqlSession().insert(method, entity); 
} 
//其余方法省略 
} 

TrainRecord實(shí)體類(lèi)對(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方法就可以批量插入了。

特別說(shuō)明的是在嘗試時(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ì)把該字符解釋為新元素的開(kāi)始。"&" 也會(huì)產(chǎn)生錯(cuò)誤,因?yàn)榻馕銎鲿?huì)把該字符解釋為字符實(shí)體的開(kāi)始。而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?@SpringBootApplication注解深入解析

    Java?@SpringBootApplication注解深入解析

    這篇文章主要給大家介紹了關(guān)于Java?@SpringBootApplication注解的相關(guān)資料,@SpringBootApplication這個(gè)注解是Spring?Boot項(xiàng)目的基石,創(chuàng)建SpringBoot項(xiàng)目之后會(huì)默認(rèn)在主類(lèi)加上,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • java 中Executor, ExecutorService 和 Executors 間的不同

    java 中Executor, ExecutorService 和 Executors 間的不同

    這篇文章主要介紹了java 中Executor, ExecutorService 和 Executors 間的不同的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 簡(jiǎn)要分析Java的Hibernate框架中的自定義類(lèi)型

    簡(jiǎn)要分析Java的Hibernate框架中的自定義類(lèi)型

    這篇文章主要介紹了Java的Hibernate框架中的自定義類(lèi)型,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • Spring AOP使用之多切面運(yùn)行順序

    Spring AOP使用之多切面運(yùn)行順序

    這篇文章主要介紹了Spring AOP使用之多切面運(yùn)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java?阻塞隊(duì)列BlockingQueue詳解

    Java?阻塞隊(duì)列BlockingQueue詳解

    本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見(jiàn)使用場(chǎng)景,通過(guò)實(shí)例代碼介紹了Java?阻塞隊(duì)列BlockingQueue的相關(guān)知識(shí),需要的朋友可以參考下
    2022-06-06
  • SparkSQl簡(jiǎn)介及運(yùn)行原理

    SparkSQl簡(jiǎn)介及運(yùn)行原理

    Spark SQL就是將SQL轉(zhuǎn)換成一個(gè)任務(wù),提交到集群上運(yùn)行,類(lèi)似于Hive的執(zhí)行方式。今天通過(guò)本文給大家分享SparkSQl簡(jiǎn)介及運(yùn)行原理,感興趣的朋友跟隨小編一起看看吧
    2021-08-08
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 解決springcloud-gateway限流遇到的問(wèn)題

    解決springcloud-gateway限流遇到的問(wèn)題

    這篇文章主要介紹了解決springcloud-gateway限流遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java如何將list按照指定數(shù)量分成小list

    java如何將list按照指定數(shù)量分成小list

    本文介紹了四種不同的方法對(duì)集合進(jìn)行分區(qū)操作,包括手動(dòng)編寫(xiě)代碼、使用Guava庫(kù)、Apache Commons Collection庫(kù)以及Java 8的流操作,每種方法都有其特點(diǎn)和適用場(chǎng)景,需要注意的是,部分方法返回的是原集合的視圖,而部分則返回的是新的集合
    2024-11-11
  • Sa-Token記住我模式實(shí)現(xiàn)七天免登錄

    Sa-Token記住我模式實(shí)現(xiàn)七天免登錄

    這篇文章主要為大家介紹了Sa-Token記住我模式實(shí)現(xiàn)七天免登錄示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論

岳普湖县| 永康市| 库伦旗| 犍为县| 土默特左旗| 湘阴县| 鲁甸县| 新蔡县| 边坝县| 重庆市| 天等县| 定南县| 响水县| 滦平县| 嵊泗县| 阜阳市| 安溪县| 龙里县| 元氏县| 普兰县| 如皋市| 临夏县| 鄂温| 台山市| 汤原县| 浏阳市| 宁远县| 抚顺市| 西华县| 莲花县| 高淳县| 循化| 巫山县| 美姑县| 双鸭山市| 余姚市| 禹城市| 福清市| 皋兰县| 锡林郭勒盟| 崇信县|