鉴别器(@TypeDiscriminator @Case)

Exisi 2021-03-27 07:46:35
Categories: Tags:
  • @TypeDiscriminator 注解等价于 <discriminator>,用于根据结果匹配不同条件决定使用哪个 SQL 映射配置

 

  • @Case @TypeDiscriminator 的子注解,用于在 @TypeDiscriminator 注解中定义不同情况下需要映射到哪个Java对象。

 

  • @TypeDiscriminator 注解有以下属性:

属性

描述

column

用于鉴别的列名

javaType

指定鉴别列对应的Java类型。如果不指定,则根据方法参数类型自动推断。

jdbcType

指定鉴别列对应的JDBC类型。如果不指定,则根据Java类型自动推断

typeHandler

指定用于处理鉴别列值的 TypeHandler

这个属性值是类的完全限定名或者是一个类型处理器的实现, 或者是类型别名。

cases

定义不同情况下需要映射到哪个Java对象,该属性是一个 Case的数组,可以有多个case。可以包含多个 @Case

 

  • @Case 有以下属性:

属性

描述

value

表示该情况下鉴别列匹配的值

type

表示需要映射到哪个Java对象

results

用于指定SQL语句返回结果集的类型。该属性是一个 Result 的数组,可以包含多个 @Result

constructArgs

于指定构造函数参数列表。该属性是一个 Arg 数组。包含多个 @Args,可以由 @Results 指定

示例

public interface UserMapper(){

 

@Select(value="select id,name,role from user where id=#{id}")

@TypeDiscriminator(

javaType = String.class,

column = "role",

cases = {

@Case(

value = "teacher",

type = Teacher.class,

results = {

@Result(property = "id", column = "id"),

@Result(

property = "class",

column = "class",

many = @Many(select = "com.domain.mapper.TeacherMapper.getClassById"))

}

),

@Case(

value = "student",

type = Student.class,

results = {

@Result(property = "id", column = "id"),

}

),

}

)

Student findUserById(int id);

 

}

 

  • @Case 注解可以有多个,每个 @Case 注解对应一种情况。

 

  • 当使用 @TypeDiscriminator 注解时,MyBatis 会根据指定的列名和列值来选择对应的 Java 对象类型,并将查询结果映射为该类型的实例。如果没有匹配到任何一个 @Case,则会使用默认类型进行映射。因此,在使用 @TypeDiscriminator 时,必须至少定义一个默认类型或者包含所有可能情况的 @Case