Mybatis一对一关联查询
有两张表,老师表teacher
和班级表class
,一个class
班级对应一个teacher
,一个teacher
对应一个class
需求是根据班级id
查询班级信息(带老师的信息)
创建teacher
和class
表:
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);
首先定义实体类
老师Teacher
类
package mybatis.bean; public class Teacher { private int id; private String name; public Teacher() { } public Teacher(int id, String name) { super(); this.id = id; this.name = 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; } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + "]"; } }
班级Class
类
package mybatis.bean; public class Class { private int id; private String name; private Teacher teacher; public Class() { } public Class(int id, String name, Teacher teacher) { super(); this.id = id; this.name = name; this.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; } @Override public String toString() { return "Class [id=" + id + ", name=" + name + ", teacher=" + teacher + "]"; }
一、嵌套结果
使用嵌套结果映射来处理重复的联合结果的子集
可以理解为封装联表查询的数据(去除重复的数据)select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
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="mybatis.test5.classMapper"> <!--根据id查询到一个班级信息(带老师信息) --> <!-- 嵌套结果 --> <select id="getClass" parameterType="int" resultMap="ClassResultMap"> select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type="mybatis.bean.Class" id="ClassResultMap"> <id property="id" column="c_id" /> <result property="name" column="c_name" /> <association property="teacher" column="teacher_id" javaType="mybatis.bean.Teacher"> <id property="id" column="t_id" /> <result property="name" column="t_name" /> </association> </resultMap> </mapper>
这里使用association
标签,association
用于一对一的关联查询
property
- 对象属性的名称javaType
- 对象属性的类型column
- 所对应的外键字段名称select
- 使用另一个查询封装的结果
二、嵌套查询
通过执行另外一个SQL 映射语句来返回预期的复杂类型
在classMapper.xml
中的配置如下:
<!--嵌套查询 --> <select id="getClass2" parameterType="int" resultMap="ClassResultMap2"> select * from class where c_id=#{id} </select> <resultMap type="mybatis.bean.Class" id="ClassResultMap2"> <id property="id" column="c_id" /> <result property="name" column="c_name" /> <association property="teacher" column="teacher_id" javaType="mybatis.bean.Teacher" select="getTeacher"> </association> </resultMap> <!-- 使用了sql别名 --> <select id="getTeacher" parameterType="int" resultType="mybatis.bean.Teacher"> SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} </select>
这里使用了association
标签的select
属性,其值对应为<select id="getTeacher" ...>
中的id
的值
这种方式,同样可以得到正确的结果