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 会创建对应子类实例而非父类。
注意事项
javaType和column是 discriminator 的必填属性。- case 匹配按定义顺序从上到下执行,第一个匹配成功的 case 生效。
- 若无任何 case 匹配,仅应用 resultMap 公共部分映射。
- case 的
type属性优先级高于resultMap的type。 - discriminator 仅对当前 resultMap 生效,不影响嵌套的 association/collection。
要点总结
- discriminator 根据列值动态切换映射规则,适合多态/继承场景。
- 支持引用外部 resultMap 或内联定义映射。
- 使用
type属性可创建具体子类实例。 - 匹配顺序从上到下,首个匹配生效。
- 无匹配时仅应用公共映射部分。
📝 发现内容有误?点击此处直接编辑