【发布时间】:2019-11-20 09:58:25
【问题描述】:
我正在使用 MyBatis 对 Postgresql 数据库进行大量更新。我推送到数据库的一些对象已经组合了它们的 id 的关键对象——一个自定义的 java 对象,它代表结果表中的两列,它们的组合保证是唯一的。我发现更新这些对象(有数千个)的性能很差,并且已经看到在 resultMap 中标记一个 id 字段可以提高性能。但是,我不确定将关联标记为 id 的正确语法是什么。
我目前已经创建了带有除 id 本身描述的所有属性的 resultMap。
<resultMap id="result" type = "com.sms.MyClass">
<result....>
<association property="id" javaType="com.sms.CombinedKeyClass">
<constructor>
<arg column="idVal1" javaType="int"/>
<arg column="idVal2" javaType="int"/>
</constructor>
<result property="idVal1" column="idVal1"/>
<result property="idVal2" column="idVal2"/>
</association>
</resultMap>
我试图弄清楚如何将此关联标记为 resultMap 的 id。我尝试添加以下内容:
<resultMap id="result" type = "com.sms.MyClass">
<id property="id" javaType="com.sms.CombinedKeyClass"/>
<result....>
<association property="id" javaType="com.sms.CombinedKeyClass">
<constructor>
<arg column="idVal1" javaType="int"/>
<arg column="idVal2" javaType="int"/>
</constructor>
<result property="idVal1" column="idVal1"/>
<result property="idVal2" column="idVal2"/>
</association>
</resultMap>
当我尝试这个配置时,MyBatis 对我大喊大叫,说它没有用于“property id”的 typeHandler。有没有办法将关联称为 id 的 typeHandler?或者有没有办法将关联本身标记为 resultMap 的 id?
另外,这是否会首先帮助我的更新性能?现在我正在传递这些对象的列表,并为列表中的每个项目使用“foreach”来更新相关字段。我以为这会比为每个单独的更新单独调用 MyBatis 更快,但到目前为止还没有。
【问题讨论】:
-
<resultMap />在更新期间未使用。使用<foreach />更新许多行对性能不利。你应该做'批量更新'。请看我的回答here。 -
谢谢!这帮助我解决了我的问题,立即获得了巨大的性能提升。现在我只需要尝试批量大小......
-
很高兴知道它有帮助!
标签: postgresql mybatis