一.多对一的映射关系

举例:根据员工编号查询员工所在部门的部门信息
第一步,需要在多的一方也就是员工实体类中持有一的一方部门实体类的引用

第二步,在dao接口中声明方法

第三步,在mapper中实现该方法
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.mybatis.dao.EmpDao">
<!---创建resultMap映射关联关系-->
<!--type对应resultMap中的实体类的类型 ,需要写实体类的完全限定名-->
<resultMap id="empMap" type="com.aaa.mybatis.entity.Emp">
<!--id标签用来映射实体类的主键
column对应sql语句返回值的别名 不区分大小写
property对应实体类中属性名 区分大小写
-->
<id column="empno" property="empno"></id>
<!--result映射普通的属性-->
<result column="ename" property="ename"></result>
<result column="sal" property="sal"></result>
<!--配置多对一的关联映射
property对应实体类中持有的一的一方的属性名
javaType 对应持有的一的一方的属性的类型,即该属性对应类的完全限定名
-->
<association property="dept" javaType="com.aaa.mybatis.entity.Dept">
<id column="deptno" property="deptno"></id>
<result column="dname" property="dname"></result>
<result column="loc" property="loc"></result>
</association>
</resultMap>
<select id="findByEmpno" resultMap="empMap">
select e.empno as empno, e.ename as ename,e.sal as sal,d.deptno as deptno ,d.dname as dname ,d.loc as loc
from emp e inner join dept d on e.deptno=d.deptno where e.empno=#{empno}
</select>
</mapper>

第四步,测试

public static void main(String[] args) {
SqlSession session = SqlSessionFactoryUtil.getSession();
EmpDao empdao = session.getMapper(EmpDao.class);
Emp emp = empdao.findByEmpno(7369L);
System.out.println("员工编号:"+emp.getEmpno());
System.out.println("员工姓名:"+emp.getEname());
System.out.println("基本工资"+emp.getSal());
//获取员工的部门信息
Dept dept = emp.getDept();
System.out.println("部门对象:"+dept);
System.out.println("部门编号:"+dept.getDeptno());
System.out.println("部门名称:"+dept.getDname());
System.out.println("部门地址:"+dept.getLoc());
System.out.println();
session.close();
}

使用在resultMap或者association中可以使用autoMapping属性,这个值设置成true,则列的别名和实体类属性名
一直的标签就可以省略不写了。

在DeptDaoMapper中一般都会有deptMap的声明:

在EmpDaoMapper中配置empMap的时候,association的resultMap属性可以指向以上声明的deptMap,这样可以
达到复用map的目的。 

二.一对多的映射关系

举例:根据部门编号查询某个部门下有哪些员工,打印这些员工的信息。
第一步,在一的一方持有多的一方的引用

第二步,在dao接口中声明方法

第三步,在mapper中实现该方法 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.mybatis.dao.DeptDao">
<!--创建resultMap-->
<resultMap id="deptMap" type="com.aaa.mybatis.entity.Dept">
<id column="deptno" property="deptno"></id>
<result column="dname" property="dname"></result>
<result column="loc" property="loc"></result>
<!--配置一对多的映射关系
property 一的一方持有的多的一方的属性的名称
ofType 一的一方持有的多的一方的属性的集合类型中的实体类的完全限定名
-->
<collection property="emps" ofType="com.aaa.mybatis.entity.Emp">
<id column="empno" property="empno"></id>
<result column="ename" property="ename"></result>
<result column="sal" property="sal"></result>
</collection>
</resultMap>
<select id="findByDeptno" resultMap="deptMap">
select d.deptno,d.dname,d.loc,e.empno,e.ename,e.sal
from dept d inner join emp e on d.deptno =e.deptno where d.deptno=#{deptno}
</select>
</mapper>
第四步,测试
/**
* 配置一对多的关联
*/
public class Test01 {
public static void main(String[] args) {
SqlSession session = SqlSessionFactoryUtil.getSession();
DeptDao deptDao = session.getMapper(DeptDao.class);
Dept dept = deptDao.findByDeptno(10L);
System.out.println("部门编号:"+dept.getDeptno());
System.out.println("部门名称:"+dept.getDname());
System.out.println("部门位置:"+dept.getLoc());
System.out.println("=====");
List<Emp> emps = dept.getEmps();
for (Emp e :
emps) {
System.out.println("员工编号:"+e.getEmpno());
System.out.println("员工姓名:"+e.getEname());
System.out.println("员工基本工资:"+e.getSal());
System.out.println("---------");
}
session.close();
}
}

mybatis的关系映射的更多相关文章

  1. MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载

    一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...

  2. MyBatis框架——关系映射(一对多、多对多、多对一查询)

    关系映射 一.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工 ...

  3. Mybatis对象关系映射 one2one,one2many,many2many

    MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现 一对一映射:association 一对多映射:collect ...

  4. 框架应用:Mybatis (三) - 关系映射

    你有一张你自己的学生证?(一对一) 你这一年级有多少个学生?(一对多) 班上学生各选了什么课?(多对多) 两张表以上的操作都需要联立多张表,而用SQL语句可以直接联立两张表,用工程语言则需要手动完成这 ...

  5. 第9章 MyBatis的关系映射

    在实际开发中,对数据库的操作通常涉及多张表,涉及了对象和对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系 9.1 关联关系概述 ...

  6. mybatis 对象关系映射例子

    入门 http://legend2011.blog.51cto.com/3018495/908956 增删改 http://legend2011.blog.51cto.com/3018495/9130 ...

  7. [刘阳Java]_MyBatis_实体关系映射_第8讲

    MyBatis既然是一个ORM框架,则它也有像Hibernate那样的一对多,多对多,多对一的实体关系映射功能.下面我们就来介绍一下如何使用MyBatis的实体关系映射 1.MyBatis实体关系映射 ...

  8. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  9. MyBatis 关系映射XML配置

    关系映射 在我看来这些实体类就没啥太大关联关系,不就是一个sql语句解决的问题,直接多表查询就完事,程序将它设置关联就好 xml里面配置也是配置了sql语句,下面给出几个关系的小毛驴(xml) 一对多 ...

随机推荐

  1. Linux中vim编辑器 的 快捷键 --- 常用 的 都比较全

    Linux中vim编辑器的功能非常强大,许多常用快捷键用起来非常方便,这里将我学vim入门时学的一些常用的快捷键分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到 ...

  2. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...

  3. Mac 窗口管理软件 Spectacle

    我个人使用的窗口管理软件是 Magnet(本人在 Mac 下付费的首款软件,记得是 6 元~),今天为大家介绍一款类似的开源软件. 简介 Spectacle 是一款可以快速调整窗口大小与位置的开源软件 ...

  4. Vue + d3.js实现在地图上选点

    需求:用户在地图上单击选点,页面获取到具体坐标并返回. 首先比较重要的是Vue中的$nextTick,因为vue是异步更新的,如果是想打开Dialog或者是其他操作dom后才加载地图,使用nextTi ...

  5. python3购物车

    python3实现购物车小程序,优化后将程序分成函数,用文件注册和验证用户名密码. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 20 ...

  6. Navicat自动备份数据库

    @ 目录 Navicat自动备份数据库 备份与还原 修改备份位置 MySQL:5.7 Navicat:11 Windows10 重要数据库的定时备份是非常重要的,使用Navicat可以非常方便快捷地自 ...

  7. 面试官:兄弟,说说Java到底是值传递还是引用传递

    二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...

  8. google无法播放mp4 chrome无法播放h264

    写在前面 我在chrome上无法播放h264+Acc的mp4,在firefox.ie都可以播放,而且此mp4在vlc终可以正常播放. 视频链接:http://106.14.221.185:7001/p ...

  9. 9. js屏幕截图

    html2canvas 该脚本允许您直接在用户浏览器上截取网页或部分网页的“屏幕截图”.屏幕截图基于DOM,因此它可能不是真实表示的100%准确,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息 ...

  10. linux CVE-2019-14287 Sudo提权漏洞

    CVE-2019-14287 sudo介绍 sudo,也就是以超级管理员身份运行(superuser do)的意思.sudo 是 Linux 中最常使用的重要实用程序之一,它功能十分强大,几乎安装在每 ...