Steven

          You're?still?young --that's?your?fault

           

          【解決】【 MyBatis 】使用MyBatis批量增加,出現(xiàn) Parameter '__frch_item_0' not found. Available parameters are [list]

          異常信息:

          復(fù)制代碼
          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)
          復(fù)制代碼

           

          最終查到導(dǎo)致異常的原因是 foreach中的屬性字段名字寫錯(cuò)了!表字段太多,一個(gè)個(gè)找的還是很費(fèi)勁的!建議這種做好單元測(cè)試!

          另外,寫xml的時(shí)差錯(cuò),還可以從下面幾點(diǎn)檢查。

          1、parameterType="Java.util.List",這個(gè)parameterType有沒有寫錯(cuò);

          2、<foreach collection="list" item="item" index="index" open="" close="" separator=";">這行中,collection是不是List

          關(guān)于批量更新做一個(gè)總結(jié):

          批量更新有兩種,一種是通過id更新很多字段,第二種是更改一列,值是固定的這種。下面分別貼出列子

          例子:

          更新一列:

          復(fù)制代碼
          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>
          復(fù)制代碼

          這種直接是item就行,只是一個(gè)查詢的條件范圍。

          更新很多字段:

          復(fù)制代碼
           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     
          復(fù)制代碼

          注意,這種傳的是一個(gè)個(gè)的對(duì)象在list集合中,要加item.屬性名稱,空判斷的時(shí)候別忘記這種格式,這里我犯過錯(cuò),沒少費(fèi)時(shí)間。

          貼出來當(dāng)時(shí)忘記加item的異常 信息:

          復(fù)制代碼
          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)
          復(fù)制代碼

          找這個(gè)問題用了不少時(shí)間!

           

          下面說一下批量插入操作。

          復(fù)制代碼
           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>
          復(fù)制代碼

          易錯(cuò)點(diǎn)和批量更新一樣,寫的時(shí)候要仔細(xì)。

           

          這里做一個(gè)總結(jié),如果不正確之處,歡迎指正!

           

          1.查看parameterType的類型是不是Java.util.List類型,如果是的話,看foreach 的collection屬性是不是list,

              因?yàn)?傳遞一個(gè) List 實(shí)例或者數(shù)組作為參數(shù)對(duì)象傳給 MyBatis,MyBatis 會(huì)自動(dòng)將它包裝在一個(gè) Map 中,用名稱在作為鍵。List 實(shí)例將會(huì)以“list” 作為鍵,而數(shù)組實(shí)例將會(huì)以“array”作為鍵 

          2.看一下foreach里面的值有沒有傳遞進(jìn)來 

          3.看foreach里面的名稱字段是否寫錯(cuò) 

          4.還有就是我用Mybatis的時(shí)候,用MySQL的值插入自動(dòng)增長(zhǎng)值,里面的key我在數(shù)據(jù)庫(kù)中沒有設(shè)置自動(dòng)增長(zhǎng),然后我又用了selectkey,所以也會(huì)出現(xiàn)這種情況


          應(yīng)該還有別的錯(cuò)誤能夠?qū)е逻@個(gè)錯(cuò)誤。但是我就只遇到這幾種。所以做個(gè)總結(jié)



          【可用例子】

              <!-- createEmergencyBatch:批量插入交接班 - 突發(fā)事件 關(guān)聯(lián)對(duì)象列表 -->
              <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>


          梅花香自苦寒來

          posted on 2017-05-09 08:09 wen.ding 閱讀(3974) 評(píng)論(0)  編輯  收藏 所屬分類: Exception

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 体育| 苍南县| 芜湖县| 神池县| 宁强县| 莒南县| 山丹县| 色达县| 若羌县| 阳泉市| 无棣县| 资兴市| 弥渡县| 清涧县| 夏河县| 锡林浩特市| 阳新县| 新津县| 望谟县| 北流市| 枣庄市| 靖江市| 湟中县| 宜城市| 香港 | 城步| 隆回县| 西乌珠穆沁旗| 白山市| 景洪市| 芜湖市| 迭部县| 铁力市| 天柱县| 栾城县| 海安县| 玉林市| 包头市| 南城县| 贵州省| 衡阳县|