liaoxiaohua

 

关联元素 association 学习

关联元素用来处理“一对一”的关系(如一个博客有一个用户)。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种加载方式、三种常用表现方式

两种加载方式:

  1. 嵌套查询:select: 通过执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活
  2. 嵌套结果:resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型

三种常用表现方式:

  1. 在本身映射SQL语句中直接嵌套结果。如下面的配置文件将Join的班主任实体Teacher嵌套在班级实例Classes上。需要注意的是Classes实体中必须有Teacher这个属性。

   ClassMapperXML

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nantian.mybatis.one2one.ClassesMapper">
<resultMap type="Classes" id="classes">
<id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/>
<association property="teacher" column="c_t_id" javaType="Teacher">
<id property="id" column="t_id" javaType="int" jdbcType="INTEGER"/>
<result property="name" column="t_name" javaType="string" jdbcType="VARCHAR"/>
</association>
</resultMap>

<select id="one2one" parameterType="int" resultMap="classes">
select c.c_id,c.c_name,c.c_t_id,t.t_id,t.t_name
from classes c join teacher t on c.c_t_id = t.t_id where c.c_id = #{id}
</select>
</mapper>
   2.通过association 结合 resultMap实现。

  <association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/>

  ClassesMapper.xml

  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
  <mapper namespace="com.myapp.mybatis.ClassesMapper">  
      
<resultMap type="Classes" id="classes">  
          
<id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/>  
          
<result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/>  
          
<association property="teacher" column="c_t_id" javaType="Teacher" resultMap="teacherResultMap"><!--teacherResultmap定义在TeacherMapper.xml中 ->  
          
</association>  
      
</resultMap>  
      
<select id="one2one" parameterType="int" resultMap="classes">  
          select c.c_id,c.c_name,c.c_t_id,t.t_id,t.t_name   
            from classes c join teacher t on c.c_t_id = t.t_id where c.c_id = #{id}  
      
</select> 
  </mapper> 

  TeacherMapper.xml

  
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.myapp.mybatis.TeacherMapper"> 
<resultMap type="TeacherEntity" id="teacherResultMap">  
<id property="teacherID" column="TEACHER_ID" />
<result property="teacherName" column="TEACHER_NAME" />
<result property="teacherSex" column="TEACHER_SEX" />
<result property="teacherBirthday" column="TEACHER_BIRTHDAY"/>
<result property="workDate" column="WORK_DATE"/>
<result property="professional" column="PROFESSIONAL"/>
</resultMap>

<select id="getTeacher" parameterType="String" resultMap="teacherResultMap">
SELECT *
FROM TEACHER_TBL TT
WHERE TT.TEACHER_ID = #{teacherID}
</select>

 3.accosciation 结合select(嵌套查询)

  <association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/> <!-- 另一个映射语句的ID 如果是外部配置文件中且ID不唯一的则需要指定全路径如select="com.myapp.mybatis.Teacher.getTeacher"-->

修改上面的ClassesMapper.xml

  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  
<mapper namespace="com.myapp.mybatis.ClassesMapper">
  
<resultMap type="Classes" id="classes">
  
<id property="id" column="c_id" javaType="int" jdbcType="INTEGER"/>
  
<result property="name" column="c_name" javaType="string" jdbcType="VARCHAR"/>
       <!--getTeacher定义在TeacherMapper.xml中  -->

  
<association property="teacher" column="c_t_id" javaType="Teacher" select="getTeacher"></association>
  </resultMap>
  <select id="one2one" parameterType="int" resultMap="classes">
  select c.c_id,c.c_name,c.c_t_id,t.t_id,t.t_name
    from classes c join teacher t on c.c_t_id = t.t_id where c.c_id = #{id}
  </select>
  </mapper>

Classes实体

package com.myapp.mybatis.one2one;  

public class Classes {
private int id;
private String name;
private Teacher teacher;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Teacher getTeacher() {
return teacher;
}

public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}

Teacher实体

package com.myapp.mybatis.one2one;  

public class Teacher {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

ClassesMapper类

public interface ClassesMapper {  
public Classes one2one(int id);
}

 

  属性  描述

property:

映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称的字段。
这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一 些 东 西 :“ username ”, 或 者 映 射 到 一 些 复 杂 的 东 西 “address.street.number”。

column :

来 自 数 据 库 的 类 名 , 或 重 命 名 的 列 标 签 。 这 和 通 常 传 递 给resultSet.getString(columnName)方法的字符串是相同的。
  注 意 : 要 处 理 复 合 主 键 , 你 可 以 指 定 多 个 列 名 通 过   column= ”{prop1=col1,prop2=col2} ” 这种语法来传递给嵌套查询语 句。这会引起
prop1 和 prop2 以参数对象形式来设置给目标嵌套查询语句。

javaType :

一个 Java 类的完全限定名,或一个类型别名(参加上面内建类型别名的列表)。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证所需的行为。

jdbcType:

在这个表格之前的所支持的 JDBC 类型列表中的类型。JDBC 类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC 的需要,
而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定这个类型-但仅仅对可能为空的值。

typeHandler:

我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。

 

select:

另外一个映射语句的 ID,可以加载这个属性映射需要的复杂类型。获取的在列属性中指定的列的值将被传递给目标 select  语句作为参数。后面
有一个详细的示例。 注 意 : 要 处 理 复 合 主 键 , 你 可 以 指 定 多 个 列 名 通 过   column= ”{prop1=col1,prop2=col2} ” 这种语法来传递给嵌套查询语 句。这会引起prop1 和 prop2 以参数对象形式来设置给目标嵌套查询语句。

resultMap:

这是结果映射的 ID,可以映射关联的嵌套结果到一个合适的对象图中。这是一种替代方法来调用另外一个查询语句。这允许你联合多个表来合成到一个单独的结果集。这样的结果集可能包含重复,数据的重复组需要被分解,合理映射到一个嵌套的对象图。为了使它变得容易,MyBatis 让你“链接”结果映射,来处理嵌套结果。

 

 

posted on 2011-09-01 12:58  liaoxiaohua  阅读(2607)  评论(0编辑  收藏  举报

导航