开发者社区 问答 正文

继承关系如何设计MyBatis的map.xml文件:报错

最近刚开始用MyBatis,之前也没有接触过,但项目急得很,没办法。但现在遇到了一个问题:

我有三个类都继承同一个父类,然后三个类使用同一张表。现在我需要写Mybatis的mapper.xml文件,我有一种思路就是为每一个类单独写,但那样的话有很多公共字段都要重复,所以我想问下,有没有其他简单的方式?

展开
收起
kun坤 2020-06-14 08:20:24 567 分享 版权
阿里云 AI 助理回答

在MyBatis中,针对您描述的情况,确实存在一种更高效的方式来避免重复定义SQL语句。当多个类(实体)共享同一张表,并且这些类继承自同一个父类时,可以通过以下策略来简化mapper.xml的编写:

  1. 使用ResultMap继承: 在MyBatis中,可以定义一个基础的ResultMap来映射共用的字段,然后让其他ResultMap继承这个基础ResultMap。这样,公共字段只需定义一次。

    示例代码如下:

    <resultMap id="BaseResultMap" type="com.test.BaseClass">
       <id column="id" property="id"/>
       <!-- 其他公共字段映射 -->
    </resultMap>
    
    <resultMap id="Child1ResultMap" type="com.test.Child1" extends="BaseResultMap">
       <!-- Child1特有的字段映射 -->
    </resultMap>
    
    <resultMap id="Child2ResultMap" type="com.test.Child2" extends="BaseResultMap">
       <!-- Child2特有的字段映射 -->
    </resultMap>
    
  2. 使用标签定义公共SQL片段: 对于查询、更新等操作中的公共SQL部分,可以使用<sql>标签定义为可重用的代码片段,然后在具体的操作中通过<include>标签引用。

    示例代码:

    <sql id="CommonSelectFields">SELECT id, gmt_create, gmt_modified, ...</sql>
    
    <select id="getByPK" resultMap="Child1ResultMap">
       <include refid="CommonSelectFields"/>
       FROM your_table WHERE id=#{pk}
    </select>
    

结合这两种方法,您可以有效减少mapper.xml文件中的重复代码,提高维护性和可读性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答