记录观看B站狂神说mybatis的讲解视频后,对于多对一和一对多的理解

多对一

方式一:按查询嵌套处理

就像SQL中的子查询

在Mapper配置文件中

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.StudentMapper"><!--需求:获取所有学生及对应老师的信息思路:1. 获取所有学生的信息2. 根据获取的学生信息的老师ID->获取该老师的信息3. 思考问题,这样学生的结果集中应该包含老师,该如何处理呢,数据库中我们一般使用关联查询?1. 做一个结果集映射:StudentTeacher2. StudentTeacher结果集的类型为 Student3. 学生中老师的属性为teacher,对应数据库中为tid。多个 [1,...)学生关联一个老师=> 一对一,一对多4. 查看官网找到:association – 一个复杂类型的关联;使用它来处理关联查询--><select id="getStudents" resultMap="StudentTeacher">select * from student</select><resultMap id="StudentTeacher" type="Student"><!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名--><association property="teacher"  column="tid" javaType="Teacher" select="getTeacher"/></resultMap><!--这里传递过来的id,只有一个属性的时候,下面可以写任何值association中column多参数配置:column="{key=value,key=value}"其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。--><select id="getTeacher" resultType="teacher">select * from teacher where id = #{id}</select></mapper>
  • <select id="getStudents" resultMap="StudentTeacher"> select * from student </select>查所有学生的信息,结果集中包含teacher 这一字段,而数据库中与之对应的是Student表中的tid,所以需要用到resultMap结果集映射将teacher与tid关联起来
  • <resultMap id="StudentTeacher" type="Student"> <!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名--> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap>这一步就是结果集映射、关联;resultMap中的id与上一步的resultMap内容对应,表示映射到这里,type表示返回的类型,我们本质是查学生,所以这里的类型是Student;association关联属性,我们需要将teacher这个属性和数据库中的tid关联起来,property就是我们需要关联的在Student类中的属性名,column就是在数据库中的列名,javaType是类型属性,即关联的属性的类型,select是执行哪个方法。
  • <select id="getTeacher" resultType="teacher"> select * from teacher where id = #{id} </select>
    在上面的基础上,执行sql语句查询老师,这样就将teacher与tid关联了。
    不过我觉得这里的sql语句中id = #{tid}会更合适,意思是查teacher时,teacher的id值=Student表中的tid,结果都是一样的。

总结

方式二:按结果嵌套处理

就像SQL中的联表查询

编写mapper配置文件

<select id="getStudents2" resultMap="StudentTeacher2" >select s.id sid, s.name sname , t.name tnamefrom student s,teacher twhere s.tid = t.id
</select><resultMap id="StudentTeacher2" type="Student"><id property="id" column="sid"/><result property="name" column="sname"/><!--关联对象property 关联对象在Student实体类中的属性--><association property="teacher" javaType="Teacher"><result property="name" column="tname"/></association>
</resultMap>
  • <select id="getStudents2" resultMap="StudentTeacher2" >先按联表查询出结果集,结果集中Student实体类的teacher属性为空,teacher属性与数据库student表中的tid列对应,需要用结果集映射来显示查询到的Student实体类中的teacher属性。
  • <resultMap id="StudentTeacher2" type="Student"> id与上一步的resultMap值对应,映射时,本质上还是完善Student信息,映射完之后返回还是Student,所以type是Student;id property="id" column="sid"/> <result property="name" column="sname"/>property是Student实体类中的属性,column是数据库中对应的列名;<association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association>
    association 关联属性,property是Student实体类中的属性,映射后属性类型为javaType;<result property="name" column="tname"/>相当于teacher.name=tname;一开始联表查询的结果就是sid, sname , tname,所以将tname赋值给teacher属性中的name属性即可完成结果集映射,使Student实体类显示完整。

一对多

理解:
一个老师拥有多个学生,如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!

实体类中

方式一

按查询嵌套处理

<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher"><!--column是一对多的外键 , 写的是一的主键的列名--><collection property="students" javaType="ArrayList" ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">select * from student where tid = #{id}
</select>

方式二

按结果嵌套处理

<mapper namespace="com.kuang.mapper.TeacherMapper"><!--思路:1. 从学生表和老师表中查出学生id,学生姓名,老师姓名2. 对查询出来的操作做结果集映射1. 集合的话,使用collection!JavaType和ofType都是用来指定对象类型的JavaType是用来指定pojo中属性的类型ofType指定的是映射到list集合属性中pojo的类型。--><select id="getTeacher" resultMap="TeacherStudent">select s.id sid, s.name sname , t.name tname, t.id tidfrom student s,teacher twhere s.tid = t.id and t.id=#{id}</select><resultMap id="TeacherStudent" type="Teacher"><result  property="name" column="tname"/><collection property="students" ofType="Student"><result property="id" column="sid" /><result property="name" column="sname" /><result property="tid" column="tid" /></collection></resultMap>
</mapper>

对于多对一和一对多的理解相关推荐

  1. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  2. 【HibernateHibernate实体关系映射——双边的多对一、一对多关系

    双边的多对一.一对多关系 双边关系是最常见的配置.在多方有一方的引用,一方也有多方的引用.双边关系能够很方便的查询数据.下面以一个班级与学生的双边关系来深入学习. 班级(clazz类)与学生(stud ...

  3. dll文件懒加载_一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...

  4. 多对一(一对多)的双向关联

    一个组(Group)有多个用户(User),进行多对一(一对多)的双向配置,在数据库中生成的表结构如下图: Annotation配置: Group: 1 package com.bjsxt.hiber ...

  5. MySQL一对多的理解,多对多

    一对多,在多的表里面每一行多加一行标识就好了 多对多需要一个中间表 因为权限和资源是多对一的关系,假设以权限给主体,一个权限对应一个资源,另一个权限对应还是这这一个资源,这样我们可以通过唯一的权限id ...

  6. mybatis关联 多对多,一对多,多对一的编写

    1. 准备 数据库 以及数据 /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23 : Database - test ***************** ...

  7. 多对一和一对多的处理P21,P22

    多对一: 按照查询嵌套处理: StudentMapper:(接口很简单需要返回一个List) package com.Li.dao;import com.Li.pojo.Student; import ...

  8. 【Mybatis 之应用篇】 3_Lombok、多对一处理和一对多处理

    文章目录 Mybatis 九.Lombok 十.多对一处理 1.测试环境搭建 2.多表查询方法一:按照查询嵌套处理 3.多表查询方法二:按照结果嵌套处理☆ 十一.一对多处理 1.实体类的搭建 2.按照 ...

  9. MyBatis(二)——多对一、一对多

    文章目录 1. 多对一 1.1 在MySQL中创建student表.teacher表 1.2 编写实体类 1.3 编写接口 1.4 编写接口对应的配置文件 1.5 确定两个xml文件都绑定到了myba ...

最新文章

  1. 第五期直播《聊聊目标检测和秋招那些事》精彩回顾
  2. hadoop 2.0 详细配置教程
  3. JS 时间戳转换成日期
  4. close和SO_LINGER
  5. class h5 点击后样式变化_H5学习笔记
  6. FreeRTOS 低功耗之 tickless 模式
  7. C#判断一个类中有无指定名称的方法
  8. 工作169:vue项目报错[Vue warn]: Property “visible“ must be accessed with “$data.visible“ because properties
  9. 几种C#程序读取MAC地址的方法
  10. eclipse黑色主题
  11. acu风格是什么意思_acu 是什么意思,是一个品牌吗???
  12. python代码格式化工具下载_python 代码格式化工具:autopep8
  13. qq飞车显示服务器维护中,QQ飞车手游更新出现异常怎么办?更新异常原因及解决方法技巧...
  14. 如何设计好系统异常处理
  15. 【19/04/18 膜赛】土豪聪要请客(stol)
  16. 政策解读 | 传言PayPal要封杀独立站卖家?绝对不可能!
  17. Steam教育对儿童在幼儿园阶段概念理解
  18. 成为一个15K的软件测试工程师的基本要求
  19. 机器学习笔记 - Traffic-Net训练交通拥堵程度
  20. android ppt sdk,Android SDK及环境配置.ppt

热门文章

  1. 我的博客搬家了! 新地址:http://www.cnblogs.com/jubincn/
  2. 中创算力|库里18万美元买个猴头像 到底是个啥?
  3. EMC对策产品:TDK扩大了内置ESD保护功能的陷波滤波器阵容
  4. python画小汽车_Python语言怎么画小红花?
  5. win7计算机建立无线网络连接不上,Win7笔记本电脑连接不上wifi怎么办_Win7无法连接wifi-192路由网...
  6. XY6873A 5G 安卓智能核心板(MT6873 天玑 800 平台)
  7. computed 传入参数
  8. 玉米收割机割台的设计 开题报告
  9. 风炫安全web安全学习第二十九节课 CSRF防御措施
  10. U盘中文件复制到ARM开发板