異常信息:
1 java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [list]
2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [list]
3 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
4 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
最終查到導致異常的原因是 foreach中的屬性字段名字寫錯了!表字段太多,一個個找的還是很費勁的!建議這種做好單元測試!
另外,寫xml的時差錯,還可以從下面幾點檢查。
1、parameterType="Java.util.List",這個parameterType有沒有寫錯;
2、<foreach collection="list" item="item" index="index" open="" close="" separator=";">這行中,collection是不是List
關于批量更新做一個總結:
批量更新有兩種,一種是通過id更新很多字段,第二種是更改一列,值是固定的這種。下面分別貼出列子
例子:
更新一列:
1 <update id="batchUpdateResult" parameterType="java.util.List">
2 update
3 <include refid="input_invoice_original_record" />
4 set isGet = 0 where invoiceNum in
5 <foreach collection="list" item="item" open="(" separator="," close=")">
6 #{item}
7 </foreach>
8 </update>
這種直接是item就行,只是一個查詢的條件范圍。
更新很多字段:
1 <update id="batchUpdate" parameterType="list">
2 <foreach collection="list" item="item" index="index" open="" close="" separator=";">
3 update
4 <include refid="input_invoice_original_record" />
5 <trim prefix="SET" suffixOverrides=",">
6 <if test="item.title != null">
7 title = #{item.title},
8 </if>
9 <if test="item.invoiceNum != null">
10 invoiceNum = #{item.invoiceNum},
11 </if>
12 <if test="item.invoiceCode != null">
13 invoiceCode = #{item.invoiceCode},
14 </if>
15 <if test="item.invoiceDate != null">
16 invoiceDate = #{item.invoiceDate},
17 </if>
18
19 </trim>
20 WHERE id = #{item.id}
21 </foreach>
22 </update>
23
注意,這種傳的是一個個的對象在list集合中,要加item.屬性名稱,空判斷的時候別忘記這種格式,這里我犯過錯,沒少費時間。
貼出來當時忘記加item的異常 信息:
1 java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are [list]
2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are [list]
3 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
4 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
找這個問題用了不少時間!
下面說一下批量插入操作。
1 <insert id="batchInsert" parameterType="java.util.List"
2 useGeneratedKeys="true" keyProperty="id">
3 <selectKey resultType="long" keyProperty="id" order="AFTER">
4 SELECT
5 LAST_INSERT_ID()
6 </selectKey>
7 INSERT INTO
8 <include refid="input_invoice_original_record" />
9 (
10 title ,
11 invoiceNum,
12 invoiceCode,
13 invoiceDate,
14 sellDate ,
15 invoiceCategory
16 )
17 VALUES
18 <foreach collection="list" item="item" index="index"
19 separator=",">
20 (
21 #{item.title} ,
22 #{item.invoiceNum},
23 #{item.invoiceCode},
24 #{item.invoiceDate},
25 #{item.sellDate} ,
26 #{item.invoiceCategory}
27 )
28 </foreach>
29 </insert>
易錯點和批量更新一樣,寫的時候要仔細。
這里做一個總結,如果不正確之處,歡迎指正!
1.查看parameterType的類型是不是Java.util.List類型,如果是的話,看foreach 的collection屬性是不是list,
因為 傳遞一個 List 實例或者數組作為參數對象傳給 MyBatis,MyBatis 會自動將它包裝在一個 Map 中,用名稱在作為鍵。List 實例將會以“list” 作為鍵,而數組實例將會以“array”作為鍵
2.看一下foreach里面的值有沒有傳遞進來
3.看foreach里面的名稱字段是否寫錯
4.還有就是我用Mybatis的時候,用MySQL的值插入自動增長值,里面的key我在數據庫中沒有設置自動增長,然后我又用了selectkey,所以也會出現這種情況
應該還有別的錯誤能夠導致這個錯誤。但是我就只遇到這幾種。所以做個總結
【可用例子】
<!-- createEmergencyBatch:批量插入交接班 - 突發事件 關聯對象列表 -->
<insert id="createEmergencyBatch" parameterType="java.util.List">
INSERT INTO DUTY_CHANGE_DUTY_EMERGENCY
(ID,EMERGENCY_ID,CHANGE_WORK_DUTY_ID,STATUS,CREATE_TIME)
(
<foreach collection="list" item="item" index="index" separator="union all">
SELECT
#{item.id,jdbcType=VARCHAR},
#{item.emergencyId,jdbcType=VARCHAR},
#{item.changeWorkDutyId,jdbcType=VARCHAR},
#{item.status,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP}
FROM dual
</foreach>
)
</insert>
梅花香自苦寒來