关联元素 association 学习
关联元素用来处理“一对一”的关系(如一个博客有一个用户)。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种加载方式、三种常用表现方式
两种加载方式:
- 嵌套查询:select: 通过执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活
- 嵌套结果:resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型
三种常用表现方式:
- 在本身映射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>
<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) 编辑 收藏 举报