項目裡使用了MyBatis做持久層,資料庫是Oracle,用到了Batch Insert 功能,因為以前做的都是MySQL,也做過PostgreSQL資料庫,批量插入的語句都相同,但是在Oracle上就不好使了。後來網上搜了下,大致的寫法有兩種:
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false"> insert into USER_CARE_SITE (USER_ID, CARE_SITE_ID) <foreach collection="list" item="item" index="index" separator="union all" > (select #{item.userId,jdbcType=INTEGER}, #{item.careSiteId,jdbcType=INTEGER} from dual) </foreach> </insert>
<insert id="batchInsert" parameterType="java.util.List"> INSERT ALL <foreach collection="list" item="item"> INTO USER_CARE_SITE (USER_ID, CARE_SITE_ID) VALUES ( #{item.userId,jdbcType=INTEGER}, #{item.careSiteId,jdbcType=INTEGER} ) </foreach> SELECT * FROM DUAL </insert>
但是我這邊的控制台始終報ORA-00933: SQL 命令未正確結束,然後我就把語句直接拷貝到sqldeveloper裡面執行,都能工作。然後比對自己的代碼和網友的代碼,幾乎是一模一樣的啊,但是MyBatis 始終通不過,所以我就在猜這個可能是MyBatis裡面的錯誤。
然後就google到了網友 mybatis批量插入資料到oracle ,裡面提到了 “原因竟是mybatis批量插入oracle時需要顯式指定為 useGeneratedKeys="false" 不然報錯~~~”。測試下,果然可以,但是其他網友的能不設這個屬性都可以工作,是因為他們在 MyBatis 的設定檔裡面(我的是mybatis-config.xml )要麼沒設這個屬性值,因為預設值就是false, 要麼就是將這個值設定為 false 了,而我的偏偏就將其設定為 true,悲哀。。。。
<!-- 允許 JDBC 支援產生的鍵。 需要適合的 驅動。 如果設定為 true 則這個設定強制 產生的鍵被使用, 儘管一些驅動拒絕兼 容但仍然有效(比如 Derby), 預設false --> <setting name="useGeneratedKeys" value="false" />
不知道這個屬性設定為 false 後,哪些功能會受到影響,這個我還沒碰到。這次寫出來就是為了方便大家在檢索問題的時候多一個答案來源。