对于多对一和一对多的理解
记录观看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>
对于多对一和一对多的理解相关推荐
- Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射
在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...
- 【HibernateHibernate实体关系映射——双边的多对一、一对多关系
双边的多对一.一对多关系 双边关系是最常见的配置.在多方有一方的引用,一方也有多方的引用.双边关系能够很方便的查询数据.下面以一个班级与学生的双边关系来深入学习. 班级(clazz类)与学生(stud ...
- dll文件懒加载_一步步学习NHibernate(5)——多对一,一对多,懒加载(2)
请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...
- 多对一(一对多)的双向关联
一个组(Group)有多个用户(User),进行多对一(一对多)的双向配置,在数据库中生成的表结构如下图: Annotation配置: Group: 1 package com.bjsxt.hiber ...
- MySQL一对多的理解,多对多
一对多,在多的表里面每一行多加一行标识就好了 多对多需要一个中间表 因为权限和资源是多对一的关系,假设以权限给主体,一个权限对应一个资源,另一个权限对应还是这这一个资源,这样我们可以通过唯一的权限id ...
- mybatis关联 多对多,一对多,多对一的编写
1. 准备 数据库 以及数据 /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23 : Database - test ***************** ...
- 多对一和一对多的处理P21,P22
多对一: 按照查询嵌套处理: StudentMapper:(接口很简单需要返回一个List) package com.Li.dao;import com.Li.pojo.Student; import ...
- 【Mybatis 之应用篇】 3_Lombok、多对一处理和一对多处理
文章目录 Mybatis 九.Lombok 十.多对一处理 1.测试环境搭建 2.多表查询方法一:按照查询嵌套处理 3.多表查询方法二:按照结果嵌套处理☆ 十一.一对多处理 1.实体类的搭建 2.按照 ...
- MyBatis(二)——多对一、一对多
文章目录 1. 多对一 1.1 在MySQL中创建student表.teacher表 1.2 编写实体类 1.3 编写接口 1.4 编写接口对应的配置文件 1.5 确定两个xml文件都绑定到了myba ...
最新文章
- 第五期直播《聊聊目标检测和秋招那些事》精彩回顾
- hadoop 2.0 详细配置教程
- JS 时间戳转换成日期
- close和SO_LINGER
- class h5 点击后样式变化_H5学习笔记
- FreeRTOS 低功耗之 tickless 模式
- C#判断一个类中有无指定名称的方法
- 工作169:vue项目报错[Vue warn]: Property “visible“ must be accessed with “$data.visible“ because properties
- 几种C#程序读取MAC地址的方法
- eclipse黑色主题
- acu风格是什么意思_acu 是什么意思,是一个品牌吗???
- python代码格式化工具下载_python 代码格式化工具:autopep8
- qq飞车显示服务器维护中,QQ飞车手游更新出现异常怎么办?更新异常原因及解决方法技巧...
- 如何设计好系统异常处理
- 【19/04/18 膜赛】土豪聪要请客(stol)
- 政策解读 | 传言PayPal要封杀独立站卖家?绝对不可能!
- Steam教育对儿童在幼儿园阶段概念理解
- 成为一个15K的软件测试工程师的基本要求
- 机器学习笔记 - Traffic-Net训练交通拥堵程度
- android ppt sdk,Android SDK及环境配置.ppt
热门文章
- 我的博客搬家了! 新地址:http://www.cnblogs.com/jubincn/
- 中创算力|库里18万美元买个猴头像 到底是个啥?
- EMC对策产品:TDK扩大了内置ESD保护功能的陷波滤波器阵容
- python画小汽车_Python语言怎么画小红花?
- win7计算机建立无线网络连接不上,Win7笔记本电脑连接不上wifi怎么办_Win7无法连接wifi-192路由网...
- XY6873A 5G 安卓智能核心板(MT6873 天玑 800 平台)
- computed 传入参数
- 玉米收割机割台的设计 开题报告
- 风炫安全web安全学习第二十九节课 CSRF防御措施
- U盘中文件复制到ARM开发板