程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> MyBatis批量拔出(insert)數據操作

MyBatis批量拔出(insert)數據操作

編輯:關於JAVA

MyBatis批量拔出(insert)數據操作。本站提示廣大學習愛好者:(MyBatis批量拔出(insert)數據操作)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis批量拔出(insert)數據操作正文


在法式中封裝了一個List聚集對象,然後須要把該聚集中的實體拔出到數據庫中,因為項目應用了Spring+MyBatis的設置裝備擺設,所以盤算應用MyBatis批量拔出,因為之前沒用過批量拔出,在網上找了一些材料後終究完成了,把具體進程貼出來。

實體類TrainRecord構造以下:

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 
} 

對應的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> 

關於foreach標簽的說明參考了網上的材料,詳細以下:

foreach的重要用在構建in前提中,它可以在SQL語句中停止迭代一個聚集。foreach元素的屬性重要有 item,index,collection,open,separator,close。item表現聚集中每個元素停止迭代時的別號,index指 定一個名字,用於表現在迭代進程中,每次迭代到的地位,open表現該語句以甚麼開端,separator表現在每次停止迭代之間以甚麼符號作為分隔 符,close表現以甚麼停止,在應用foreach的時刻最症結的也是最輕易失足的就是collection屬性,該屬性是必需指定的,然則在分歧情形 下,該屬性的值是紛歧樣的,重要有一下3種情形:

1.假如傳入的是單參數且參數類型是一個List的時刻,collection屬性值為list

2.假如傳入的是單參數且參數類型是一個array數組的時刻,collection的屬性值為array

3.假如傳入的參數是多個的時刻,我們就須要把它們封裝成一個Map了,固然單參數也能夠封裝成map

關於foreach的詳細例子在這裡就先不舉,今後無機會可以把每種情形都舉一個例子列出來。

MysqlBaseDAO:

public class MySqlBaseDAO extends SqlSessionDaoSupport { 
/** 
* insert:拔出操作. <br/> 
* 
* @author chenzhou 
* @param method 拔出操作的辦法名 
* @param entity 查詢參數或實體類 
* @return 前往影響的行數 
* @since JDK 1.6 
*/ 
public int insert(String method,Object entity){ 
return this.getSqlSession().insert(method, entity); 
} 
//其他辦法省略 
} 

TrainRecord實體類對應的TrainRecordDAO 界說以下:

public class TrainRecordDAO extends MySqlBaseDAO { 
/** 
* addTrainRecordBatch:批量拔出培訓記載. <br/> 
* 
* @author chenzhou 
* @param trainRecordList 培訓記載list聚集 
* @return 影響的行數 
* @since JDK 1.6 
*/ 
public int addTrainRecordBatch(List<TrainRecord> trainRecordList){ 
return this.insert("addTrainRecordBatch", trainRecordList); 
} 
//省略其他的辦法 
} 

然後直接挪用TrainRecordDAO 中的 addTrainRecordBatch辦法便可以批量拔出了。

特殊解釋的是在測驗考試時碰著了一個讓人無語的毛病,折騰了我差不多1個小時才處理。就是我在界說mapper.xml中的拔出辦法時普通都邑默許用<![CDATA[ ]]>標簽把sql語句括起來,以下所示:

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

如許做的目標重要是由於在 XML 元素中,"<" 和 "&" 長短法的。"<" 會發生毛病,由於解析器會把該字符說明為新元素的開端。"&" 也會發生毛病,由於解析器會把該字符說明為字符實體的開端。而sql語句或許劇本語句中能夠會存在 "<" 或 "&" 字符。為了不毛病,可以將sql語句界說為 CDATA。CDATA 部門中的一切內容都邑被解析器疏忽。

其時我在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> 
]]> 

成果法式在履行時總是報錯: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,檢查毛病信息就是傳入的參數都是null。糾結了良久,前面才發明本來是<![CDATA[ ]]>把xml中的<foreach>標簽括起來後把標簽直接當做字符串處置了。前面把裡面的<![CDATA[ ]]>去失落後就可以正常履行了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved