mybatis基础学习(五)——resultMap详解

1,192 阅读3分钟

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、一对多、多对一关系下的使用