Mybatis完整版(三)

it2023-10-19  65

Mybatis完整版(三)

十、多对一处理测试环境搭建按查询嵌套处理按结果嵌套处理 十一、一对多处理环境搭建,和上一个一样按照结果嵌套处理按照查询嵌套处理 小结

十、多对一处理

多对一:

多个学生,对应一个老师对于学生这边,关联…多个学生,关联一个老师【多对一】对于老师而言,集合,一个老师,有很多学生【一对多】

数据库设计

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 <dependencies> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> </dependencies> 新建实体类(增加注解@Data) @Data //GET,SET,ToString,有参,无参构造 public class Teacher { private int id; private String name; } @Data public class Student { private int id; private String name; //多个学生可以是同一个老师,即多对一 private Teacher teacher; } 编写实体类对应的Mapper接口 无论有没有需求,都应该写上,以备后来之需! public interface StudentMapper { } public interface TeacherMapper { } 编写Mapper接口对应的Mapper.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.roc.dao.StudentMapper"> </mapper> <?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.roc.dao.TeacherMapper"> </mapper> 在核心配置文件中绑定注册我们的Mapper接口或者文件!【方式很多,随心选】 <mappers> <mapper class="com.roc.dao.TeacherMapper"/> <mapper class="com.roc.dao.StudentMapper"/> </mappers> 测试查询是否能成功!

按查询嵌套处理

<mapper namespace="com.roc.dao.StudentMapper"> <!-- 思路: 1.查询所有的学生信息 2.根据查询出来的学生的tid,寻找对应的老师! 子查询 --> <select id="getStudents" resultMap="StudentTeacher"> select * from student </select> <resultMap id="StudentTeacher" type="com.roc.pojo.Student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂的属性,我们需要单独处理 对象:association 集合:collection--> <association property="teacher" column="tid" javaType="com.roc.pojo.Teacher" select="getTeacher"/> </resultMap> <!-- 这里传递过来的id,只有一个属性的时候,下面可以写任何值 association中column多参数配置: column="{key=value,key=value}" 其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。 --> <select id="getTeacher" resultType="com.roc.pojo.Teacher"> select * from teacher where id = #{id} </select> </mapper>

按结果嵌套处理

<!--按照结果嵌套处理--> <select id="getStudents2" resultMap="StudentTeacher2"> select s.id sid,s.name sname,t.id tid,t.name tname from student s,teacher t where s.tid = t.id </select> <resultMap id="StudentTeacher2" type="com.roc.pojo.Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="com.roc.pojo.Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> </association> </resultMap>

回顾MySQL多对一查询方式:

子查询链表查询

十一、一对多处理

一个老师拥有多个学生对于老师而言,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!

环境搭建,和上一个一样

实体类

@Data public class Student { private int id; private String name; private int tid; } @Data public class Teacher { private int id; private String name; //一个老师拥有多个学生 private List<Student> students; }

按照结果嵌套处理

<!--按结果嵌套查询--> <select id="getTeacher" 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="com.roc.pojo.Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <!--复杂的属性,我们需要单独处理 对象:association 集合:collection javaType=""指定属性的类型! 集合中的泛型信息,我们使用ofType获取 --> <collection property="students" ofType="com.roc.pojo.Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap>

按照查询嵌套处理

<select id="getTeacher2" resultMap="TeacherStudent2"> select * from teacher where id = #{tid} </select> <resultMap id="TeacherStudent2" type="com.roc.pojo.Teacher"> <collection property="students" javaType="ArrayList" ofType="com.roc.pojo.Student" select="getStudentByTeacherId" column="id"/> </resultMap> <select id="getStudentByTeacherId" resultType="com.roc.pojo.Student"> select * from student where tid = #{id} </select>

小结

1、关联-association

2、集合-collection

3、所以association是用于一对一和多对一,而collection是用于一对多的关系

4、JavaType和ofType都是用来指定对象类型的

JavaType是用来指定pojo中属性的类型

ofType指定的是映射到list集合属性中pojo的类型。

注意说明:

1、保证SQL的可读性,尽量通俗易懂

2、根据实际要求,尽量编写性能更高的SQL语句

3、注意属性名和字段不一致的问题

4、注意一对多和多对一 中:字段和属性对应的问题

5、尽量使用Log4j,通过日志来查看自己的错误

最新回复(0)