【问题标题】:How to use association as id for ResultMap in MyBatis如何在 MyBatis 中使用关联作为 ResultMap 的 id
【发布时间】: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 更快,但到目前为止还没有。

【问题讨论】:

标签: postgresql mybatis


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多