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[ ]]>去失落後就可以正常履行了。