使用mybatis操作数据库也有好一阵时间了,本篇记录并解释一下使用mybatis进行一对多,多对一查询显示数据。(一对一此处不讲解,会了一对多查询,一对一也就会了)

本例用员工表和部门表作为讲解,首先看员工表和部门表的表结构:


解释:部门表就包含两个字段,员工表的部门编号作为外键指向部门表的部门号(员工表是子表(这里可以理解为从表),部门表是父表(这里可以理解为主表))
(一般存在关系的表,在多的一方(员工表)存一(部门表)的字段(此例是存部门表的部门号)作为外键)

员工表:

部门表:

写java接口之前先把sql写出来,一般来说,进行关联查询(一对一,一对多,多对一),至少要用两张表以上,

首先看多对一,意思是说。多个员工对应一个部门,先看sql:

#查询全部员工信息
SELECT e.id,emp_name,emp_pwd, sex,age,phone,iner_date,job,d.depart_name
FROM employee e
LEFT JOIN department d ON e.depart_id = d.id;

在上面就讲述了存在关系的表,用关联字段把两张表连接起来(此例是用员工表的部门编号关联部门表的部门号),也就是两表关联查询

查看结果:
(数据有点少啊哈哈哈)

上面相信有sql基础的朋友都能写出来,那怎么在java上表示这种关系呢。
首先java先创建员工类和部门类的javaBean:
员工类:

(注意要遵循javabean规范,此处的构造器和setget方法省略)

部门类:

有朋友会问,员工表不是有个部门编号吗,为什么不把部门编号作为员工类的属性
这就是sql和java 的区别了

在数据库中,员工表是通过字段(部门编号)去关联部门表的,那么在java上,则是用部门类作为员工类的属性,这样两者就有关联了!

员工类:

部门类:

员工类存单个部门类,部门类存员工类的集合(前者为多对一,一个员工对应一个部门,后者为一对多,一个部门对应多个员工)

理解这种关系后,就可以写mapper了(用注解也行)。
(多对一)
首先写dao接口:

对应的mapper:

因为是两张表,所以返回的是resultMap
resultMap:

主要是看红色圈:该标签是用来关联“一”的(此例关联部门类),把查询到的关于部门的数据(此例为部门名)放到该属性上,形成多对一。
写完后,单元测试一下:

数据就出来了:


红圈处为部门表的数据

再来看一对多:一个部门对应多个员工,先看sql:
#查询部门对应的员工信息
SELECT d.id,depart_name,e.id eid,emp_name,phone
FROM department d LEFT JOIN employee e ON
d.id = e.depart_id;
结果:

先写dao接口:

对应的mapper:

此处注意:因为查询的字段有两个相同名字的,所以后者用别名区别一下

主要看红色大框的地方,上处框了两个红框,先看第一个,由于是一对多关联,所以使用的标签把查到的属于员工表的字段映射员工类的属性上。
第二个框(根据需要)的意思是把查到的字段再映射到员工类下的部门属性字段:

可以进行级联映射。
写测试查看结果:

至此,一对多的结果就出来了

最后说一下本人用mybatis查询踩的一些坑:
首先是别名问题,比如上例
SELECT d.id,depart_name,e.id eid,emp_name,phone
FROM department d LEFT JOIN employee e ON
d.id = e.depart_id
不要别名eid,直接在column写e.id员工id是出不来的(显示null)

再看一下类型区别:
resultMap中的type指的是返回的整个类型,这里返回的是Department(不设置别名的话要写全限定名(包名+类名))
collection上的property是Department类中的员工属性名,ofType是指该属性的元素值(属性employees是List类型,用ofType表示List下的Employee元素 javaType是写java类型,比如List的实现类ArrayList)

一对多和多对一的本质都差不多,一对多会了,一对一,多对一也就会了。

mybatis一对多和多对一的联系和区别(例子详解)相关推荐

  1. MyBatis 一对多、多对一的处理~

    目录 1.多对一处理 1.1.打个比方 1.2.实例环境搭建 1.3.目标:查询所有的学生信息以及对应的老师信息 方式一:查询嵌套 方式二:结果嵌套 2.一对多处理 2.1.目标:获取指定老师下的所有 ...

  2. MyBatis一对多,多对一,多对多

    MyBatis中的一对多和对多一,多对多 主要就是resultMap中 association(关联) – 一个复杂的类型关联;许多结果将包成这种类型(多对一) 嵌套结果映射 – 关联本身可以是一个 ...

  3. mybatis一对多,多对一映射,collection和association标签的使用

    mybatis中,可以使用collection和association来处理一对多和多对一的关系 其中每个标签中有2中种使用方式,一种是嵌套查询,一种是嵌套结果 嵌套查询会在主查询中,去调用子查询 嵌 ...

  4. Mybatis一对多、多对一、批量插入

    在项目开发中,我们有遇到的对象关系通常是复杂的,每个对象并不是单独的.比如学生和老师之间关系,一个老师有多个学生,每个学生会对应一个老师(这里的老师主要是班主任),这种关系其实就是一对多的关系.Myb ...

  5. 详解Mybatis一对多、多对一、多对多

    1.什么是关系型数据库? 这个东西我仿佛在大学的<数据库原理>中学过,好吧,我不记得了,来整理一下. 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据.简 ...

  6. Mybatis一对多及多对多映射查询

    1.数据库准备工作 --删除表 drop table SelectiveInfo; drop table StudentInfo; drop table ClassInfo; drop table T ...

  7. mybatis数据源(JNDI、POOLED、UNPOOLED)源码详解

    一.概述 二.创建 mybatis数据源的创建过程稍微有些曲折. 1. 数据源的创建过程: 2. mybatis支持哪些数据源,也就是dataSource标签的type属性可以写哪些合法的参数? 弄清 ...

  8. MyBatis一对多与多对一

    一对多 项目结构目录 项目结构搭建 数据库文件 CREATE TABLE `teacher` (`id` INT(10) NOT NULL PRIMARY KEY,`name` VARCHAR(30) ...

  9. Mybatis一对多,多对一嵌套查询的返回

    我们有时候查询需要一带多,多带一的信息,举个一对多的例子:我们要查询所有的订单,顺便还能把对应的订单里面的多条详情(比如对应的商品,商品价格等)也带出来. 类似于这样 orderNo, orderTi ...

最新文章

  1. 官宣!英雄联盟、王者荣耀、街霸……这些电子竞技入选杭州亚运会
  2. 检测代码区校验和实现简易反调试
  3. 手撕 CNN 之 AlexNet(PyTorch 实战篇)
  4. 如何执行shell脚本文件
  5. java中对map使用entrySet循环
  6. Win11系统调节屏幕亮度的方法
  7. css元素居中实现方法
  8. php 中文key_API常用签名验证方法(PHP实现)
  9. Centos7.0 Vmware10.0.3 网络桥接配置
  10. C++ set 多级排序 多维度排序
  11. python pip国内源_Python pip配置国内源 (转载)
  12. EIA/TIA 568A 568B 标准
  13. web页面之响应式布局
  14. Zemax光学设计(十二) —— 激光扫描物镜设计
  15. LINUX学习之路(学LINUX必看)
  16. KB/s和Kbps是完全不同的概念
  17. C和C++面试秘籍(董山海)分享
  18. java 如何抛异常_如何在Java中抛出异常?
  19. 项目绩效考核体系执行简述
  20. 动感相册源码--类似QQ动感影集.rar

热门文章

  1. 当PPP遇上智慧城市
  2. 【2020.09.06】基金销售系统和TA系统
  3. 小米手环3触点正负极
  4. geoserver java_GeoServer 安装教程
  5. 【沪江日语电台】Love Love J-popVol.2
  6. 单片机实训与毕业设计开放式训练系统QY-DPJ14
  7. 苹果8p电池多少毫安的_iphonexs电池多少毫安,iphonexs换电池多少钱
  8. python爬历年大学生就业数据_Python就业行情和前景分析之一爬取数据
  9. 【网络流24题补全计划】
  10. arm linux gige相机,Teledyne DALSA发布Linux系统下GigE开发包2.10V版本