全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

discriminator 鉴别器

discriminator 元素根据数据库查询结果中某列的值,动态选择不同的 resultMap 映射规则,常用于处理继承关系或多态场景。

基本语法

XML
<resultMap id="vehicleResultMap" type="Vehicle">
  <id property="id" column="id"/>
  <result property="type" column="type"/>
  <discriminator javaType="string" column="type">
    <case value="CAR" resultMap="carResult"/>
    <case value="TRUCK" resultMap="truckResult"/>
    <case value="VAN" resultMap="vanResult"/>
  </discriminator>
</resultMap>
属性说明
javaType鉴别列的 Java 类型(必填)
column用于判断的数据库列名(必填)
case.value匹配的值
case.resultMap匹配后使用的 resultMap

内联映射模式

case 元素可直接内联定义映射规则,无需额外引用 resultMap:

XML
<resultMap id="vehicleResultMap" type="Vehicle">
  <id property="id" column="id"/>
  <result property="type" column="type"/>
  <discriminator javaType="int" column="vehicle_type">
    <case value="1" type="Car">
      <result property="doorCount" column="door_count"/>
    </case>
    <case value="2" type="Truck">
      <result property="payload" column="payload"/>
    </case>
  </discriminator>
</resultMap>

继承关系映射

假设数据库表 vehicle 使用单表存储多种车辆类型,通过 type 列区分:

SQL
CREATE TABLE vehicle (
  id INT PRIMARY KEY,
  type VARCHAR(10),
  brand VARCHAR(50),
  door_count INT,      -- Car 专用
  payload DECIMAL,     -- Truck 专用
  seat_count INT       -- Van 专用
);

对应 Java 类:

Java
public class Vehicle {
  private Integer id;
  private String brand;
  private String type;
}

public class Car extends Vehicle {
  private Integer doorCount;
}

public class Truck extends Vehicle {
  private Double payload;
}

public class Van extends Vehicle {
  private Integer seatCount;
}

映射配置:

XML
<resultMap id="vehicleResultMap" type="Vehicle">
  <id property="id" column="id"/>
  <result property="brand" column="brand"/>
  <result property="type" column="type"/>
  <discriminator javaType="string" column="type">
    <case value="CAR" type="Car">
      <result property="doorCount" column="door_count"/>
    </case>
    <case value="TRUCK" type="Truck">
      <result property="payload" column="payload"/>
    </case>
    <case value="VAN" type="Van">
      <result property="seatCount" column="seat_count"/>
    </case>
  </discriminator>
</resultMap>

<select id="selectVehicle" resultMap="vehicleResultMap">
  SELECT * FROM vehicle WHERE id = #{id}
</select>

使用 type 属性指定 case 的具体 Java 类型,MyBatis 会创建对应子类实例而非父类。

注意事项

  1. javaTypecolumn 是 discriminator 的必填属性。
  2. case 匹配按定义顺序从上到下执行,第一个匹配成功的 case 生效
  3. 若无任何 case 匹配,仅应用 resultMap 公共部分映射。
  4. case 的 type 属性优先级高于 resultMaptype
  5. discriminator 仅对当前 resultMap 生效,不影响嵌套的 association/collection。

要点总结

  • discriminator 根据列值动态切换映射规则,适合多态/继承场景。
  • 支持引用外部 resultMap 或内联定义映射。
  • 使用 type 属性可创建具体子类实例。
  • 匹配顺序从上到下,首个匹配生效。
  • 无匹配时仅应用公共映射部分。

📝 发现内容有误?点击此处直接编辑

← 上一篇 where 智能条件
下一篇 → 一对一关联映射
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库