MyBatis 通用mapper批量插入異常

 

ExecutorException: Error getting generated key or setting result to parameter object.

Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [list]

今天偶遇異常,查了相關文章,大部分說是因爲參數綁定的異常,使用@Param 解決,但我的工程並非如此。

我的工程環境:SSM+通用mapper

用過通用mapper的都知道,通用mapper支持批量插入insertList ,直接傳入一個PO的List即可;但就是在調用insertList 批量插入時拋出的此異常,奇怪的是,根據mybatis debug打印的日誌,所有SQL語句都執行成功,執行SQL和參數打印的都沒問題。

於是 搜索到這篇文章,指出 去除mybatis-config.xml中的 開啓獲取自增主鍵 或設爲false
<setting name="useGeneratedKeys" value="true"/>
就不會拋出此異常。

改成false後,發現確實不拋此異常了。但是不巧的是業務方法需要在插入A表後,返回一個主鍵id,再去插入詳情表B,如果設爲false,在執行插入詳情表B 時就報關聯外鍵不能爲null;

出於時間原因,立即把第一次插入表A的記錄按插入條件查出,再獲得查詢返回對象的ID,設置給插入表B的關聯自動,這次再執行,發現還是報出開始的異常:

ExecutorException: Error getting generated key or setting result to parameter object.

Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [list]

後續又嘗試了很多辦法,一直解決不了,很多文章都是關於 原生mybatis批量插入時的問題,通過修改mapper.xml的insert語句添加xml屬性解決。

最後找到了通用mapper作者交流羣,被問到自己工程使用的mybatis版本。發現自己工程,別人搭建之初使用的mybatis版本是3.0.6。
原因是:mybatis版本太低,不支持insertList批量插入,

支持通用mapper批量插入 最低需要的版本 3.3.1。最後修改工程依賴如下,升級mybatis版本:

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

        <!--通用Mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>4.0.3</version>
        </dependency>

升級後,所有運行就正常了。

實際上,mybatis提供了返回插入後的主鍵ID,只需在mybatis-config.xml配置開啓即可(此方式是全局通用設置)
<setting name="useGeneratedKeys" value="true"/>

當然也可以在單個方法上使用
@Options(useGeneratedKeys=true,keyProperty="id")
keyProperty是你POJO實體類與數據庫主鍵映射的那個字段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章