文章目录

  • 一、创建表结构,添加数据,实现表中数据的关联关系
  • 二、 association 标签:用于一对一、多对一场景使用
    • 1、实现一对一,多对一关系结果集映射
      • 1.1 按照查询嵌套处理
      • 1.2 按照结果嵌套处理(推荐)
  • 三、 collection 标签:用于一对多、多对多场景使用(实体里放集合)
    • 1、实现一对多,多对多关系结果集映射
      • 1.1 按照查询嵌套处理
      • 1.2 按照结果嵌套处理(推荐)

一、创建表结构,添加数据,实现表中数据的关联关系

  • 数据的关联关系:

    • 一个班级中,有多名学生,一个班主任以及其他很多科任教师

      • 对于学生而言,多个学生,关联一个班主任,每个学生都和班主任有着关联关系 --【多对一】

      • 班级中,有一名学生上课睡觉,被班主任抓个正着,拎出来训话 --【一对一】

      • 对于班主任而言,一个班主任管理着一个班级,而班级中有很多学生 --【一对多】

      • 一个班级中的每天都有不同的课程,不同的课程对应不同的教师 --【多对多】

  • 表结构搭建

    -- 创建教师表
    CREATE TABLE IF NOT EXISTS `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 IF NOT EXISTS `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),(2, '龙大宇', 1),(3, '姬大德', 1),(4, '石昊', 1),(5, '叶凡', 1);

二、 association 标签:用于一对一、多对一场景使用

  • association 标签属性:

    • property :配置实体类属性名

    • javaType :指定封装结果的类型。当使用 select 属性时,无需指定关联的类型,结果会直接封装到调用的查询语句中

    • column :配置数据库列名,搭配 select 属性使用,从第一条 SQL 中获取当前指定字段的内容,在将该内容传入 select 属性调用的 SQL 中

    • select :使用另一个select查询封装的结果。当使用该属性时,无需配置实体类与数据库之间的映射关系

  • association 标签的子标签:< id >< result >, 作用和 resultMap 标签的子标签一致


1、实现一对一,多对一关系结果集映射

实现联表查询的方式有两种,一种是按照查询嵌套处理,一种是按照结果嵌套处理。通常来讲按照结果嵌套处理比较灵活,代码看起来也更加简洁。

1.1 按照查询嵌套处理

该方式的执行流程:先执行第一个被调用的 < select > 标签语句,查询出结果后通过 < association > 标签的 column 获取结果中指定字段的值,在通过 select 调用第二个 < select > 标签语句 ,将 column 获取到的值传入该标签语句中,实现类似于子查询的操作,最后将第一个被调用的标签语句查询出的结果封装到 < resultMap > 的 type 属性当中,将第二个被调用的标签语句封装到 < association > 标签的 property 所指定的实体类属性当中,以此来实现结果集的映射。

  • 根据表创建对应的实体类

    • 创建 Student 实体

      @Alias("Student")  // 引用 mybatis-config.xml 中的实体类路径别名,这样再次引用时候直接引用别名就可以找到全路径了
      @Data  // 自动生成 get()、set()等方法
      public class Student {private Integer id;private String name;private String tid;// 关联教师实体,形成一对一,多对一的关联关系,将查询结果封装到该属性中private Teacher teacher;
      }
      
    • 创建 Teacher 实体

      @Data
      @Alias("Teacher")
      public class Teacher {private Integer id;private String name;
      }
      
    • 创建 StudentMapper

      public interface StudentMapper {List<Student> getStudent();
      }
      
    • 创建 XML

         <select id="getStudent" resultMap="StudentMap">select * from student</select><resultMap id="StudentMap" type="Student"><result column="id" property="id"/><result column="name" property="name"/><!-- 查询完第一条查询SQL之后,通过association标签的column属性获取对应字段的值,将该值传入select属性所指定的查询SQL中,根据条件查询完之后将结果封装到property属性所指定的实体bean的属性中。  --><association property="teacher" column="tid" select="getTeacher"/></resultMap><select id="getTeacher" resultType="Teacher">select * from teacher where id = #{tid}</select>
      
    • 代码运行结果


1.2 按照结果嵌套处理(推荐)

直接使用多表联查的形式去查询数据,通过 result 标签的属性将 SQL 语句中的字段和实体类形成映射关系,再通过 association 标签的 property 属性将 Teacher 实体中的 name 属性与 Student 实体的 teacher 属性值形成映射,以此来完成返回值映射。

  • 实体类不变,StudentMapper 接口中新增查询方法

    public interface StudentMapper {List<Student> getStudent();List<Student> getStudentAndTeacher();}
    
  • XML

    <resultMap id="StudentAndTeacher" type="Student"><result property="id" column="id"/><result property="name" column="name"/><!-- 将查询结果映射到 Teacher 实体类中 --><association property="teacher" javaType="Teacher"><result property="name" column="name"/></association></resultMap><select id="getStudentAndTeacher" resultMap="StudentAndTeacher">select   s.id as 学生编号, s.name as 学生姓名, s.tid as 班级编号, t.id as 教师编号,t.name as 教师姓名from student s,teacher twhere s.tid = t.id</select>
    
  • 运行结果:


三、 collection 标签:用于一对多、多对多场景使用(实体里放集合)

  • collection 标签属性:

    • property :实体类属性名

    • select :使用另一个select查询封装的结果。当使用该属性时,便不需要在配置实体类与数据库之间的映射关系了

    • column :为数据库中的列名,与select配合使用

    • ofType :指定集合中的泛型信息

  • collection 标签的子标签:< id >,< result >, 作用和 resultMap 标签的子标签一致


1、实现一对多,多对多关系结果集映射

1.1 按照查询嵌套处理

该方式的执行流程和 association 大致相同,区别为,association 是通过学生共有的班级编号匹配班主任的教师编号,是多对一的关系。而 collection 是通过教师编号去匹配班级编号相同的学生,是一对多关系。

  • 根据表创建对应的实体类

    • 创建 Student 实体

      @Alias("Student")
      @Data
      public class Student {private Integer id;private String name;private String tid;
      }
      
    • 创建 Teacher 实体

      @Data
      @Alias("Teacher")
      public class Teacher {private Integer id;private String name;// 实现老师对应学生的 一对多关联关系private List<Student> student;
      }
      
    • 创建 TeacherMapper

      public interface TeacherMapper {//通过教师编号查询与之关联的学生List<Teacher> getManyToOne(int id);
      }
      
    • 创建 XML

      <select id="getManyToOne" resultMap="getManyToOne">select * from teacher where id = #{id}
      </select><resultMap id="getManyToOne" type="Teacher"><result property="id" column="id"/><result property="name" column="name"/><collection property="student" javaType="ArrayList" select="getStudent" column="id"/>
      </resultMap><select id="getStudent" resultType="Student">select * from student where tid = #{id}
      </select>
      
    • 代码运行结果


1.2 按照结果嵌套处理(推荐)

  • 实体类不变,TeacherMapper 接口中新增查询方法

    public interface TeacherMapper {List<Teacher> getManyToOne(int id);List<Teacher> getManyToOne2(int id);
    }
    
  • XML

       <resultMap id="getManyToOne2" type="Teacher"><result property="id" column="id"/><result property="name" column="name"/><collection property="student" ofType="Student"><result column="id" property="id"/><result column="name" property="name"/><result column="tid" property="tid"/></collection></resultMap><select id="getManyToOne2" resultMap="getManyToOne2">select  s.id sid,s.name sname,t.name tname,t.id,tidfrom student s,teacher twhere s.tid = t.id and t.id = #{tid}</select>
    
  • 运行结果:

6.2 、MyBatis 高级映射(resultMap 标签多表联查 , 一对多,多对一关系)相关推荐

  1. mybatis高级映射(一对一,一对多,多对多)

    http://www.cnblogs.com/selene/p/4627446.html 阿赫瓦里 生命对于某些人来说,一直都是美丽的,因为这些人的一生都在为某个梦想而奋斗!!! 博客园 首页 新随笔 ...

  2. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  3. resultMap实现多表联查

    1.背景 三张表: 检查组checkgroup 检查项checkItem CheckItem与CheckGroup是多对多的关系,所以引入t_checkgroup_checkItem作为关系表 套餐表 ...

  4. Mybatis——自定义映射ResultMap

    Mybatis 引入 一.ResultMap处理字段和属性映射关系 二.多对一映射处理 ①dept表 ②emp表 ③级联方式处理映射关系 ④使用association处理映射关系 三.一对多映射处理 ...

  5. mybatis高级映射多对多查询(二)

    在这篇博客中,我来介绍下mybatis中的多对多查询的案例,在mybatis中,如何使用ResultMap来实现多对多的查询? 案例:一个user可以有很多role,一个role可以有很多entitl ...

  6. 持久层框架Mybatis Plus的ResultMap标签里的association标签的用法

    加入公司差不多快四个月了,对目前手头上的工作内容基本已经熟悉了,现在要对我手头上的后台管理系统进行一个技术升级,后台管理系统前后端不分离,前端使用的是EXTJS框架,后端使用的事Struts2+spr ...

  7. Hibernate一对多/多对一关系映射详解及相应的增删查改操作

    以客户与订单的关系为例 1.在实体模型类中绑定两者关系: 客户类: public class Customer {private Integer id;//客户idprivate String nam ...

  8. 第五章.MyBatis高级映射

    5.1   新建数据库准备 CREATE TABLE `finacial_products` (`product_id` int(11) NOT NULL AUTO_INCREMENT,`name` ...

  9. mybatis高级映射一对多查询(一)

    最近一直在研究mybatis,查询是并不可少的研究内容.mybatis的一对多的查询,个人觉得比hibernate简单的很多.好了,废话不多说了,下面以一个简单的例子解释一下mybatis的一对多的查 ...

最新文章

  1. 玻璃上的编码喜悦(+ 10史诗般的Epigrams)
  2. R可视化ggplot2绘制重叠密度图(Overlay Density Plots)
  3. java基础值java 运行参数,及jvm调优
  4. 《Unity着色器和屏幕特效开发秘笈》—— 2.1 引言
  5. Python 程序员最常犯的十个错误,作为小白的你是不是也经常犯?
  6. 【Android】Android中WIFI开发总结(二)
  7. 将图形以PNG格式输出到浏览器或文件
  8. hadoop常见错误即解决方法
  9. OpenWrt 之 MT7628 使用GPIO中断
  10. 简述arm汇编和c语言混合编程,ARM汇编C语言混合编程
  11. zoj 1718 poj 2031 Building a Space Station
  12. kali-网站克隆工具-httrack
  13. centos 下 docker 的 安装与使用 (一)
  14. 如何将Spotify音乐下载并保存为MP3
  15. java 当前周_优化java获取当前系统时间属于第几周(时间段)
  16. 网站常用攻击技术详解
  17. An Apple a day keeps the doctor away
  18. 千万PV是什么意思?
  19. selenium被检测了怎么办?
  20. linux服务器filesystem,Linux Filesystem in Userspace(FUSE)

热门文章

  1. 44_linux挂载硬盘
  2. 如何用eclipse来创建软件
  3. 小水果店投资多少钱,水果店投资需要多少钱
  4. 云栖小镇—阿里特色的云计算生态系统
  5. “杭州招银融博”的项目经理应聘旅程(1) -- 项目团队
  6. 饿了么如何复制菜单_职场小白如何晋升八面玲珑的江湖老手?有饿了么就够了...
  7. offsetHeight及其他
  8. 以史为鉴,可以知兴替 之中国互联网发展、孙正义、美国IT和下一个十年。
  9. Visio二次开发(一)----巧用Visio宏
  10. 07. vue3+vite+qiankun搭建微应用前端框架,并接入vue3微应用