MyBatis的foreach功能在oracle数据库进行批量插入,报错如下:
Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
<insert id="addUser" parameterType="java.util.List">
<selectKey keyProperty="cityId" order="BEFORE" resultType="String">
<![CDATA[SELECT SEQ_S_USER.NEXTVAL FROM dual]]>
</selectKey>
INSERT INTO s_user(ID,NAME, PASSWORD) VALUES
<foreach collection="list" item="item" open="(" separator=","close=")">
#{item.name,jdbcType=VARCHAR} name,
#{item.password,jdbcType=VARCHAR} password
</foreach>
</insert>
打印出来的结果是:INSERT INTO s_user vaules (id,name, password) VALUES (?,?,?),(?,?,?)在oracle数据库不支持这样的插入语句。但是在mysql里面可以。所以在oracle里面正确的写法是:
<insert id="addUser" parameterType="java.util.List">
INSERT INTO s_user(ID,NAME, PASSWORD)
SELECT SEQ_S_USER.NEXTVAL ID, A.*FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT #{item.name,jdbcType=VARCHAR} name,
#{item.password,jdbcType=VARCHAR} password FROM dual
</foreach> )A
</insert>
注意:在oracle数据库里面批量插入,小编不建议使用以上的方法。可以使用JDBCTemplate批量插入,具体方法就不在这里讲了。