【问题标题】:Element type "foreach" must be declared - mybatis必须声明元素类型“foreach” - mybatis
【发布时间】:2021-06-18 17:04:38
【问题描述】:

在 mybatis/ibatis 中使用 foreach 属性进行 oracle sql 更新是最佳实践吗?以下是我在 sql 映射中的查询。

<update id="updateFG"  parameterClass="java.util.Map">
    
        <foreach collection="entries.entrySet()" item="item" index="index" >
            UPDATE <<tablename>>
            SET description = #{item.value},
                last_mod_date= SYSDATE
            WHERE name = #{item.key}
        </foreach>
        
    </update>

当我尝试运行这段代码时,它会抛出一个错误:

解析 XML 时出错。原因:org.xml.sax.SAXParseException;行号:49;列号:72; 必须声明元素类型“foreach”。

【问题讨论】:

  • 这似乎是一个错误的 DOCTYPE。请参阅doc。如果不是这样,请检查 XML 中是否有任何不可见的控制字符。
  • 感谢@ave,根据您的评论,我可能会对此进行深入研究。

标签: foreach mybatis sqlmap


【解决方案1】:

好的,所以当我将我的 DCOTYPE 从 sqlmap 更改为 mapper 时 - 它工作正常。我认为 foreach 不能用于 sqlMap..

编辑:意识到 foreach 对多行效率不高,所以改用批处理

【讨论】:

  • 哦,我忘记了您问题的“最佳实践”部分。最佳实践是执行批处理操作而不是&lt;foreach /&gt;。请参阅此answer。如果您使用 Spring Boot,demo 将向您展示如何设置批处理和非批处理映射器。
  • 哦,谢谢你.. 但是在我们的代码中,我们没有明确地编写任何代码来提交数据库,也没有玩弄 sqlSession.. 使用 foreach 被认为是一种不好的做法吗?我也看到有人使用 foreach 进行批量更新..
  • 如果使用 Spring,则不必显式管理 SqlSession。请参阅我链接的演示。使用&lt;foreach /&gt; 会生成一个带有很多参数占位符的大字符串,如果要插入/更新的行/列很多,则性能很差。批处理执行器 OTOH 利用 JDBC 的批处理操作 API,该 API 旨在有效地处理许多行。顺便说一句,&lt;foreach /&gt; 生成的 SQL 被称为multi-row insert 以避免混淆。
  • 好的很好的解释谢谢..我们没有在我们的应用程序中使用springboot,所以我想我必须在批处理中明确打开会话..顺便说一句,从你的回答heresqlSession.flushStatements( ) [循环结束] 在我的 .commit() 语句之前提交对数据库的更改..?你知道为什么以及如何避免这种情况吗?仅供参考,我正在使用/声明会话为 openSession(ExecutorType.BATCH, false)
  • 关于如何获取SqlSession,请看page。不过,您也应该阅读其他页面。
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多