MyBatis 提供了很多结果集处理器来处理不同类型的结果集:
- ResultMap:最基本的结果集映射映射器。它可以用来映射复杂的结果集,当表字段和对象属性不匹配时使用。
- primitive:简单类型结果集映射。用于将媒体类型转换为字符串,数值或其他简单类型。
- List:列表映射。将结果集映射为一个对象列表。
- Map:映射列表。将结果集作为一个Map返回。
- constructor:构造函数映射。使用构造函数将结果集映射到一个对象。
- association:关联映射。我们已经在上面的例子中见过这个了,它被用来加载复杂对象的关联对象属性。
- collection:集合映射。与 association 类似,用于加载复杂类型的集合属性。
- discriminator: discriminator 处理使用条件语句的结果集映射(where 语句)。
- 在 Log 实例中,可以诊断 被执行的语句,接踵而来的异常以及所花时间。
使用方式主要有:
- 通过 resultType 指定类型处理器(primitve、constructor 等)
- 通过 resultMap 引用自定义处理器(ResultMap)
以下是 MyBatis ResultMap
中各种类型的使用方法示例:
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
,将 id
、name
和 age
列映射到 User
对象的相应属性。其中,age
列被映射为整数类型。
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
,将 id
、name
和 skills
列映射到 User
对象的相应属性。其中,skills
列被映射为一个字符串列表。
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
,将 id
、name
和 options
列映射到 User
对象的相应属性。其中,options
列被映射为一个 HashMap,其中键和值都是字符串类型。
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
,将 id
、name
和 age
列映射到 User
对象的相应属性。其中,使用 constructor
元素将结果集中的列作为参数传递给构造函数。
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
列到相应属性的映射。
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>
类型的集合。
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 提供了丰富的结果集处理器,可以满足不同类型的结果映射需求。