mybatis---resultmap使用详解
在mybatis里有一个很重要的配置标签<resultMap>,其主要作用是创建一个结果对象将sql查询结果和实体类对象相互映射
###1、属性说明:id属性:标签标识type属性:映射结果的返回值类型,可以是类型名称或者是全限定类名autoMapping属性:是否开启自动映射功能,自动查找于字段名小写一致的属性名,并调用setter方法进行映射,默认值为true(开启),若设置为false后,需要在<resultMap>内明确注明映射关系才会调用对应的setter方法进行映射。
###2、setter方法映射
public class EStudent{
private long id;
private String name;
private int age;
// getter,setter方法
/**
* 必须提供一个无参数的构造函数
*/
public EStudent(){}
} #
<select id="getStudent" resultMap="getStudentRM">
SELECT ID, Name, Age
FROM TStudent
</select>
<resultMap id="getStudentRM" type="EStudnet">
<id property="id" column="ID"/>
<result property="studentName" column="Name"/>
<result property="studentAge" column="Age"/>
</resultMap>id元素:用于设置主键字段与领域模型属性的映射关系result元素:用于设置普通字段与领域模型属性的映射关系
###3、构造函数方法映射
public class EStudent{
private long id;
private String name;
private int age;
// getter方法
public EStudent(long id, String name, int age){
this.id = id;
this.name = name;
this.age = age;
}
}
#
<select id="getStudent" resultMap="getStudentRM">
SELECT ID, Name, Age
FROM TStudent
</select>
<resultMap id="getStudentRM" type="EStudnet">
<constructor>
<idArg column="ID" javaType="_long"/>
<arg column="Name" javaType="String"/>
<arg column="Age" javaType="_int"/>
</constructor>
</resultMap>constructor元素:指定使用指定参数列表的构造函数来实例化领域模型。注意:其子元素顺序必须与参数列表顺序对应idArg子元素:标记该参数为主键arg子元素:标记该参数为普通字段,也可用于主键字段设置
###4、动态映射关系信息
通过discriminator子元素(鉴别器)可以动态的映射关系信息
public class EStudent{
private long id;
private String name;
private String juniorHighSchool;
private String seniorHighSchool;
private int during; // 在本校就读时间
// getter,setter方法
/**
* 必须提供一个无参数的构造函数
*/
public EStudent(){}
}现有如下场景,查询学生信息的seniorHighSchool信息,若就读时间during字段的值为4、5、6的时候,则以junirHighSchool字段作为seniorHighSchool的值。
<select id="getStundent" resultMap="rm">
SELECT ID, Name, JuniorHighSchool, SeniorHighSchool, during
FROM TStudent
</select>
<resultMap id="rm" type="EStudent">
// 若不加这句,则当将juniorHighSchool赋予给seniorHighSchool属性时,juniorHighSchool属性将为null
<result column="juniorHighSchool" property="juniorHighSchool"/>
<discriminator column="during" javaType="_int">
// 形式1:通过resultType设置动态映射信息
<case value="4" resultType="EStudent">
<result column="juniorHighSchool" property="seniorHighSchool"/>
</case>
// 形式2: 通过resultMap设置动态映射信息
<case value="5" resultMap="dynamicRM"/>
<case value="6" resultMap="dynamicRM"/>
</discriminator>
</resultMap>
<resultMap id="dynamicRM" type="EStudent">
<result column="juniorHighSchool" property="seniorHighSchool"/>
</resultMap>在discriminator标签里,对查询结果进行了二次动态判断,再进行输出
###5、id元素,result元素,idArg元素,arg元素,discriminator元素的共同属性javaType属性 :Java类的全限定名,或别名jdbcType属性 :JDBC类型, JDBC类型为CUD操作时列可能为空时进行处理typeHandler属性 :指定类型处理器的全限定类名或类型别名column属性 :指定SQL查询结果的字段名或字段别名。将用于JDBC的 resultSet.getString(columnName)
###6、一对多、多对一关系下的使用
略