如何在MyBatis中使用关联作为ResultMap的ID

时间:2019-07-10 18:08:16

标签: postgresql mybatis

我正在使用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进行更新要快,但到目前为止还没有。

1 个答案:

答案 0 :(得分:0)

Ave在其中一条注释中回答了该问题-更新操作实际上并未使用resultMap,因此索引编制不会产生任何影响。真正的解决方案是使用批处理来优化操作本身,既可以使用BATCH执行程序,也可以按照批注中的链接示例来实现批处理大小。