背景
-
多个学生,对应一个老师
-
对于学生而言, 关联 ,多个学生,关联一个老师【多对一】
-
对于老师而言, 集合 ,一个老师有很多学生【一对多】
建立数据库
CREATE TABLE `teacher`
(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = INNODB
DEFAULT CHARSET = utf8;
INSERT INTO teacher(`id`, `name`)
VALUES (1, '秦老师');
CREATE TABLE `student`
(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE = INNODB
DEFAULT CHARSET = utf8;
INSERT INTO `student` (`id`, `name`, `tid`)
VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`)
VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`)
VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`)
VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`)
VALUES ('5', '小王', '1');
测试环境的搭建
-
导入lombok
-
新建实体类Teacher,Student
-
建立Mapper接口
-
建立Mapper.xml文件
-
在核心配置文件中绑定注册我们的Mapper接口或者文件
-
测试查询是否能够成功!
多对一处理
对于学生而言, 关联 ,多个学生,关联一个老师【多对一】
实体类
Student.java
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private Teacher teacher;
}
Teacher.java
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
按照查询嵌套处理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.dao.StudentMapper">
<!-- 按照查询嵌套处理 -->
<!--
思路:
1.查询所有的学生信息
2.根据查询出来的学生的tid,寻找对应的老师 子查询
-->
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--
复杂的属性,我们需要单独处理
对象:association
集合:collection
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{id}
</select>
</mapper>
按照结果嵌套处理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.dao.StudentMapper">
<!-- 按照结果嵌套处理-->
<select id="getStudent2" resultMap="StudentTeacher1" >
select s.id sid, s.name sname,t.name tname
from student s ,teacher t
where s.id = t.id
</select>
<resultMap id="StudentTeacher1" type="Student">
<result property="id" column="sid" />
<result property="name" column="sname" />
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
结果
一对多处理
比如:一个老师拥有多个学生!
对于老师而言,就是一对多的关系!
实体类
Student.java
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int tid;
}
Teacher.java
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
private List<Student> studentList;
}
按照结果嵌套处理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.dao.TeacherMapper">
<!-- 按结果嵌套查询-->
<select id="getTeacher2" resultMap="TeacherStudent">
select s.id sid, s.name sname, t.name tname, t.id tid
from student s,
teacher t
where s.tid = t.id
and t.id = #{tid}
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!--复杂的属性,我们需要单独处理 对象:association 集合:collection
javaType="" 指定属性的类型
集合中的泛型信息,我们使用ofType获取
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
</mapper>
按照查询嵌套处理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuan.dao.TeacherMapper">
<!-- 按查询嵌套处理-->
<select id="getTeacher3" resultMap="TeacherStudent2">
select *
from teacher
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId"
column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select *
from student
where tid = #{tid}
</select>
</mapper>
结果
小结
-
关联 - association【多对一】
-
集合 - collection【一对多】
-
javaType & ofType
-
javaType 用来指定实体类中属性的类型
-
ofType 用来指定映射到List或者集合中pojo类型,泛型中的约束类型
-
- 多对一时,表示“多”的那一部分的实体类应使用“一”的对象来表示
- 一对多时,表示“一”的那一部分的实体类应使用“多”的List来表示
注意点
-
保证sql的可读性,尽量保证通俗易懂
-
注意一对多和多对一中,属性和字段的问题
-
如果问题不好排查错误,可以使用日志,建议使用Log4j
-
当把接口的.xml文件放在resources层时,注意要将文件夹分层
- 在 (resultMap="" )中多了空格会导致运行不成功
- 在核心配置文件中的反射路径不要配错
- 在接口.xml文件中的namespace的路径不要配错
resultMap结果集映射的使用相关方法:属性名和字段名不一致的问题及resultMap结果集映射的使用_ABCdxy~的博客-CSDN博客