MyBatis 提供的结果集处理器有哪些?

MyBatis 提供了很多结果集处理器来处理不同类型的结果集:

  1. ResultMap:最基本的结果集映射映射器。它可以用来映射复杂的结果集,当表字段和对象属性不匹配时使用。
  2. primitive:简单类型结果集映射。用于将媒体类型转换为字符串,数值或其他简单类型。
  3. List:列表映射。将结果集映射为一个对象列表。
  4. Map:映射列表。将结果集作为一个Map返回。
  5. constructor:构造函数映射。使用构造函数将结果集映射到一个对象。
  6. association:关联映射。我们已经在上面的例子中见过这个了,它被用来加载复杂对象的关联对象属性。
  7. collection:集合映射。与 association 类似,用于加载复杂类型的集合属性。
  8. discriminator: discriminator 处理使用条件语句的结果集映射(where 语句)。
  9. 在 Log 实例中,可以诊断 被执行的语句,接踵而来的异常以及所花时间。

使用方式主要有:

  • 通过 resultType 指定类型处理器(primitve、constructor 等)
  • 通过 resultMap 引用自定义处理器(ResultMap)

以下是 MyBatis ResultMap 中各种类型的使用方法示例:

  1. primitive:用于将基本数据类型映射到结果集中。例如,将整数类型映射到结果集中的整数列。

xml

<resultMap id="userMap" type="User">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="age" property="age" javaType="int" />
</resultMap>

在上面的示例中,我们定义了一个名为 userMap 的 ResultMap,将 idname 和 age 列映射到 User 对象的相应属性。其中,age 列被映射为整数类型。

  1. List:用于将结果集中的多个值映射到一个列表中。例如,将结果集中的多个字符串值映射到一个字符串列表。

xml

<resultMap id="userSkillsMap" type="User">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="skills" property="skills" javaType="List<String>" />
</resultMap>

在上面的示例中,我们定义了一个名为 userSkillsMap 的 ResultMap,将 idname 和 skills 列映射到 User 对象的相应属性。其中,skills 列被映射为一个字符串列表。

  1. Map:用于将结果集中的多个键值对映射到一个 Map 中。例如,将结果集中的多个键值对映射到一个 HashMap。

xml

<resultMap id="userOptionsMap" type="User">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="options" property="options" javaType="Map<String, String>" />
</resultMap>

在上面的示例中,我们定义了一个名为 userOptionsMap 的 ResultMap,将 idname 和 options 列映射到 User 对象的相应属性。其中,options 列被映射为一个 HashMap,其中键和值都是字符串类型。

  1. constructor:用于使用构造函数将结果集映射到对象中。例如,将结果集中的多个列作为参数传递给构造函数。

xml

<resultMap id="userConstructorMap" type="User">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="age" property="age" />
    <constructor>
        <idArg column="id" />
        <arg column="name" />
        <arg column="age" />
    </constructor>
</resultMap>

在上面的示例中,我们定义了一个名为 userConstructorMap 的 ResultMap,将 idname 和 age 列映射到 User 对象的相应属性。其中,使用 constructor 元素将结果集中的列作为参数传递给构造函数。

  1. association:用于将结果集中的一个对象映射到另一个对象的属性中。例如,将结果集中的 User 对象映射到 Order 对象的 customer 属性中。

xml

<resultMap id="orderMap" type="Order">
    <id column="id" property="id" />
    <result column="customer_id" property="customer" />
    <association property="customer" javaType="User">
        <id column="id" property="id" />
        <result column="name" property="name" />
    </association>
</resultMap>

在上面的示例中,我们定义了一个名为 orderMap 的 ResultMap,将 id 和 customer_id 列映射到 Order 对象的相应属性。其中,使用 association 元素将结果集中的 User 对象映射到 Order 对象的 customer 属性中。在 association 元素内部,定义了 User 对象的映射,包括 id 和 name 列到相应属性的映射。

  1. collection:用于将结果集中的多个对象映射到一个集合中。例如,将结果集中的多个 User 对象映射到一个 List<User> 集合中。

xml

<resultMap id="userListMap" type="List<User>">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <collection property="skills">
        <result column="skill" property="skill" />
    </collection>
</resultMap>

在上面的示例中,我们定义了一个名为 userListMap 的 ResultMap,将 id 和 name 列映射到 User 对象的相应属性。其中,使用 collection 元素将结果集中的多个 skill 列映射到 User 对象的 skills 属性中,该属性是一个 List<String> 类型的集合。

  1. discriminator:用于处理继承关系的结果集映射。例如,将结果集中的多个子类对象映射到一个父类对象的集合中。

xml

<resultMap id="employeeMap" type="Employee">
    <id column="id" property="id" />
    <result column="name" property="name" />
    <discriminator column="type" javaType="String">
        <case value="employee" resultType="Employee" />
        <case value="manager" resultType="Manager" />
    </discriminator>
</resultMap>

在上面的示例中,我们定义了一个名为 employeeMap 的 ResultMap,将 id 和 name 列映射到 Employee 对象的相应属性。其中,使用 discriminator 元素根据 type 列的值区分不同的子类对象。如果 type 列的值为 “employee”,则将结果集映射到 Employee 对象;如果 type 列的值为 “manager”,则将结果集映射到 Manager 对象。

请注意,以上示例仅展示了常见的 ResultMap 类型的使用方法。你可以根据实际情况选择适合的类型,并根据需要进行相应的配置和映射。同时,确保在 MyBatis 配置文件或代码中正确引用和使用定义的 ResultMap

总的来说,MyBatis 提供了丰富的结果集处理器,可以满足不同类型的结果映射需求。