我正在使用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对我大吼,说它没有用于“属性ID”的typeHandler。有没有一种方法可以将关联称为id的typeHandler?还是有办法将关联本身标记为resultMap的ID?
此外,这首先是否有助于我的更新性能?现在,我传递这些对象的列表,并对列表中的每个项目使用“ foreach”以更新相关字段。我以为这会比对每个单独的更新单独调用MyBatis进行更新要快,但到目前为止还没有。
答案 0 :(得分:0)
Ave在其中一条注释中回答了该问题-更新操作实际上并未使用resultMap,因此索引编制不会产生任何影响。真正的解决方案是使用批处理来优化操作本身,既可以使用BATCH执行程序,也可以按照批注中的链接示例来实现批处理大小。