如何在 MyBatis 中使用 association 作为 ResultMap 的 id

How to use association as id for ResultMap in MyBatis

我正在使用 MyBatis 对 Postgresql 数据库进行大量更新。我推送到数据库的一些对象已经为它们的 ids 组合了关键对象——一个自定义的 java 对象,代表结果 table 中的两列,它们的组合保证是唯一的.我发现更新这些对象(有数千个)的性能很差,并且发现在 resultMap 中标记一个 id 字段可以提高性能。但是,我不确定将关联标记为 id 的正确语法是什么。

我目前已经创建了 resultMap,其中包含除了 id 本身之外的所有描述的属性。

<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 的类型处理程序?或者有没有办法将关联本身标记为 resultMap 的 id?

此外,这首先会帮助我提高更新性能吗?现在我正在传递这些对象的列表,并为列表中的每个项目使用 "foreach" 来更新相关字段。我原以为这比为每个单独的更新调用 MyBatis 的单独更新更快,但到目前为止还没有。

我已经在其中一条评论中回答了这个问题——更新操作实际上并不使用 resultMap,因此索引不会产生任何影响。真正的解决方案是通过使用批处理来优化操作本身,既使用 BATCH 执行程序,又通过实施批处理大小,如他们评论中的链接示例所示。