6.实现关联表查询
6.1. 一对一关联
1). 提出需求
根据班级id查询班级信息(带老师的信息)
班级实体中含有老师实体
2). 创建表和数据
CREATE TABLE teacher(
t_id INT PRIMARY KEY AUTO_INCREMENT,t_name VARCHAR(20)
);
CREATE TABLE class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20),
teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
INSERT INTO teacher(t_name) VALUES('LS1');
INSERT INTO teacher(t_name) VALUES('LS2');
INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);
##直接查询class只能得到teacher_id得不到teacher的信息
##1.联表查询
SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;
##2.执行两次查询
SELECT * FROM class WHere c_id=1; -- teacher_id=1
SELECT * FROM teacher WHERE t_id=1 -- 使用上面的teacher_id=1
3). 定义实体类:
public class Teacher {
privateint id;
privateString name;
}
public class Classes {
privateint id;
privateString name;
privateTeacher teacher;
}
4). 定义sql映射文件ClassMapper.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.mybatis.test5.ClassesMapper">
<!-- 根据班级id查询班级信息(带老师的信息)
##直接查询class只能得到teacher_id得不到teacher的信息
##1.联表查询
SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;
##2.执行两次查询
SELECT * FROM class WHere c_id=1; // teacher_id=1
SELECT * FROM teacher WHERE t_id=1 // 使用上面的teacher_id=1
-->
<!--
方式一:联表查询:使用嵌套结果映射来处理重复的联合结果的子集
封装联表查询的数据(去除重复的数据)
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
-->
<select id="getClass" parameterType="int" resultMap="getClassMap">
SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=#{id};
</select>
<resultMap type="com.mybatis.test5.Classes" id="getClassMap">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<!-- 把联表查询得到的teacher属性值通过association标签封装到Teacher中 -->
<association property="teacher" javaType="com.mybatis.test5.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
<!-- 方式二:嵌套查询:通过执行另一个sql映射语句来返回预期的复杂类型
SELECT * FROM class WHere c_id=1; // teacher_id=1
SELECT * FROM teacher WHERE t_id=1 // 1是上一个查询得到的teacher_id的值
-->
<select id="getClass2" parameterType="int" resultMap="getClass2Map">
SELECT * FROM class WHERE c_id=#{id};
</select>
<!-- 这句sql是由下面association标签的select="getTeacher"执行的
用SELECT t_id id, t_name name解决字段名与实体类属性名不相同的冲突
如果像上面用select* 要指定property对应的column如<result property="name" column="c_name"/>
-->
<select id="getTeacher" parameterType="int" resultType="com.mybatis.test5.Teacher">
SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
</select>
<resultMap type="com.mybatis.test5.Classes" id="getClass2Map">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="getTeacher">
</association>
</resultMap>
</mapper>
917

被折叠的 条评论
为什么被折叠?



