ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis-一对多、多对一

2022-08-23 14:33:11  阅读:153  来源: 互联网

标签:name Teacher id tid Student mybatis 一对 teacher


多对一:

多个学生对一个老师 就是 多对一

对学生:多个学生关联一个老师

一对多:

一个老师 对 多个学生

对老师而言:一个老师 有 很多学生

SQL

#创建teachaer表
CREATE TABLE `teacher`(
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET=utf8;
#插入teachaer数据
INSERT INTO teacher(id,name) VALUES(1,'张老师');
#创建student表
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`)
) DEFAULT CHARACTER SET = utf8;
#插入student表数据
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);

测试环境搭建

1、导入pom文件的 lomnok依赖,刷新 maven

2、创建工具类,实体类

3、写对应接口,一个实体类对应一个dao层的接口

4、在mapper文件中写对应接口的xml文件,通过namespace和dao层接口关联。

5、核心配置文件中对xml文件进行绑定注册。

6、测试类测试。

多对一处理

获取所有学生信息以及对应的老师信息

1、按照查询嵌套处理(有点难理解)

先去查学生信息,拿学生信息的tid去子查询中查询老师的信息,然后返回。

<mapper namespace="com.zy.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>
  //getTeacher 没有走mapper.xml文件 走的下面select
   <select id="getTeacher" resultType="Teacher">
      select * from teacher where id = #{id}
   </select>
</mapper>

打印结果

Student(id=1, name=张三, teacher=Teacher(id=1, name=张老师))
Student(id=2, name=李四, teacher=Teacher(id=1, name=张老师))
Student(id=3, name=王五, teacher=Teacher(id=1, name=张老师))
Student(id=4, name=赵六, teacher=Teacher(id=1, name=张老师))
Student(id=5, name=孙七, teacher=Teacher(id=1, name=张老师))
Student(id=6, name=张一, teacher=Teacher(id=2, name=刘老师))
Student(id=7, name=李二, teacher=Teacher(id=2, name=刘老师))
Student(id=8, name=王三, teacher=Teacher(id=2, name=刘老师))
Student(id=9, name=赵四, teacher=Teacher(id=2, name=刘老师))
Student(id=10, name=孙吴, teacher=Teacher(id=2, name=刘老师))

2、按照结果嵌套处理

 <!--按照结果嵌套处理-->
   <select id="getStudent" resultMap="teacherStudent2">
      SELECT b.id AS sid, b.`name` AS sName,a.`name` AS tName
      FROM teacher a,student b
      WHERE a.id = b.tid
   </select>
   <resultMap id="teacherStudent2" type="Student">
       <result property="id" column="sid"/>
       <result property="name" column="sName"/>
       <association property="teacher" javaType="Teacher">
           <result property="name" column="tName"/>
       </association>
   </resultMap>
Student(id=1, name=张三, teacher=Teacher(id=0, name=张老师))
Student(id=2, name=李四, teacher=Teacher(id=0, name=张老师))
Student(id=3, name=王五, teacher=Teacher(id=0, name=张老师))
Student(id=4, name=赵六, teacher=Teacher(id=0, name=张老师))
Student(id=5, name=孙七, teacher=Teacher(id=0, name=张老师))
Student(id=6, name=张一, teacher=Teacher(id=0, name=刘老师))
Student(id=7, name=李二, teacher=Teacher(id=0, name=刘老师))
Student(id=8, name=王三, teacher=Teacher(id=0, name=刘老师))
Student(id=9, name=赵四, teacher=Teacher(id=0, name=刘老师))
Student(id=10, name=孙吴, teacher=Teacher(id=0, name=刘老师))

一对多处理

按照结果嵌套处理

实体类:

public class Teacher {
   private int id;
   private String name;
/*   private Student student;*/
   //一个老师关联多个学生
   private List<Student> students;


}

 

接口:

public interface TeacherMapper {
   Teacher getTeacherAndStudent(@Param("id") int id);
}

 

mapper.xml


<mapper namespace="com.zy.dao.TeacherMapper">
   <select id="getTeacherAndStudent" resultMap="TeacherStudent" parameterType="int">
      SELECT t.`name` AS teacherName,s.`name` AS studentName,s.id AS sid  
      FROM teacher t,student s
          WHERE t.id = #{id}
          AND t.id = s.tid
   </select>
   <resultMap id="TeacherStudent" type="Student">
       <result property="id" column="id"/>
       <result property="name" column="teacherName"/>
       <!--javaTypey用于指定的属性的类型
           集合中的泛型用ofType
       -->
       <collection property="students" ofType="Teacher">
           <result property="name" column="studentName"/>
           <result property="id" column="sid"/>
       </collection>
   </resultMap>
</mapper>

结果

Teacher(id=0, name=张老师, students=[Student(id=1, name=张三, tid=0), Student(id=2, name=李四, tid=0), Student(id=3, name=王五, tid=0), Student(id=4, name=赵六, tid=0), Student(id=5, name=孙七, tid=0)])

按照查询嵌套处理

 

mapper.xml

    <!--===========================================-->
   <select id="getTeacherAndStudent2" resultMap="TeacherStudent2" parameterType="int">
      select * from teacher where id = #{id}
   </select>
   <resultMap id="TeacherStudent2" type="Teacher">
       <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudent1"/>
   </resultMap>
   <select id="getStudent1" resultType="Student">
      select * from student where tid = #{id}
   </select>

 

小结:

1、关联 assciation 【多对一】

2、集合 collection 【一对多】

3、javaType & ofType

(1) javaType 用来指定实体类中属性的类型

(2)ofType 用来制动映射到list或者集合中的pojo类型,泛型中的约束类型

 

注意点:

保证sql可读性,尽量保证通俗易懂

注意一对多和多对一中,属性和字段的问题

如果问题不好排查,可以使用日志,推荐Log4j

 

标签:name,Teacher,id,tid,Student,mybatis,一对,teacher
来源: https://www.cnblogs.com/weijie1215/p/16616004.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有