mybatis学习(九、多对一处理 十、一对多处理)
九、多对一处理
就学生和老师来举例
- 多个学生对应一个老师
- 对于学生而言:关联 多个学生,关联一个老师【多对一】
- 对于老师而言:集合 一个老师,有多个学生【一对多】
SQL:
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(30) NOT NULL,
`tid` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `student_teacher` (`tid`),
CONSTRAINT `student_teacher` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三', '1');
INSERT INTO `student` VALUES ('2', '李四', '1');
INSERT INTO `student` VALUES ('3', '王二', '1');
INSERT INTO `student` VALUES ('4', '码子', '1');
INSERT INTO `student` VALUES ('5', '熊明', '1');
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`id` int(11) NOT NULL,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('1', '刘老师');
环境搭建
-
新建实体类Student、Teacher
package com.lzt.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Student { private int id; private String name; //学生需要关联一个老师 private Teacher teacher; }package com.lzt.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Teacher { private int id; private String name; } -
建立Mapper接口
public interface TeacherMapper { //查询全部老师 List<Teacher> getTeacherList(); } -
建立Mapper.xml文件
<?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.lzt.dao.TeacherMapper"> <select id="getTeacherList" resultType="Teacher"> select * from mybatis.teacher </select> </mapper> -
在核心配置文件中绑定Mapper接口或者Mapper.xml配置文件
-
测试查询是否能够成功
按照查询嵌套处理
<!--
思路:
1.查询所有学生的信息
2.根据学生查出来的tid,寻找对应的老师
-->
<select id="getStudentList" resultMap="StudentTeacher">
select * from mybatis.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 mybatis.teacher where id=#{id}
</select>
按照结果嵌套处理
<!--按照结果嵌套处理-->
<select id="getStudentList2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from mybatis.student s ,mybatis.teacher t
where s.tid=t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
回顾mysql多对一查询:
- 子查询:按照查询嵌套处理
- 联表查询:按照结果嵌套处理
十、一对多处理
就学生和老师来举例
- 一个老师拥有多个学生
- 对于老师而言:集合 一个老师,有多个学生【一对多】
- 对于学生而言:关联 多个学生,关联一个老师【多对一】
环境配置
与之前一样
修改两个实体类,为一对多
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}
按照结果嵌套查询
<!--按结果嵌套查询-->
<select id="getTeacherAndAllStudents" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
from mybatis.student s ,mybatis.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>
按照查询嵌套处理
<!--按照查询嵌套处理-->
<select id="getTeacherAndAllStudents2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id=#{tid}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<collection property="students" javaType="ArrayList" ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from mybatis.student where tid=#{tid}
</select>
小结
-
关联 -- association【多对一】
-
集合 -- collection【一对多】
-
javaType & ofType
- javaType 用来指定实体类中属性的类型
- ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
注意点:
- 保证SQL的可读性,尽量保证通俗易懂
- 注意一对多和多对一属性名和字段的问题
- 如果问题不好排查错误,可以使用日志,建议使用Log4j

浙公网安备 33010602011771号