1、1对1

有2种方式对内嵌Bean设值:

1》关联查询就一条语句。使用association关键字,直接将嵌套对象的映射表的字段赋值内嵌对象。

<association property="teacher" javaType="com.lfy.bean.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>

2》在同一个mapper中写嵌套bean的映射查询,或者嵌套bean的查询在独立的mapper中。还是使用association关键字。

<!-- getTeacher为同mapper的一个查询。对内嵌teacher属性进行关联查询 -->
<resultMap type="com.lfy.bean.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="getTeacher" javaType="com.lfy.bean.Teacher"/>
</resultMap>
<!-- getTeacher为其他mapper的一个查询。对内嵌teacher属性进行关联查询 -->
<resultMap type="com.lfy.bean.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="com.lfy.mapper.teacherMapper.getTeacher" javaType="com.lfy.bean.Teacher"/>
</resultMap>

    总结:关键字association。

2、1对多

外键一般放置在多方,如学生与班级的关系,多个学生对应一个班级,是多对一的关系,外键应该放在学生表中,即学生表参照了班级表。

但我们现在的需求是,查询出某班级,并查询出班级的所有学生,班级与学生的关系是一对多的关系。

    <!-- 根据id查询班级信息,返回resultMap -->
<select id="selectClazzById" parameterType="int" resultMap="clazzResultMap">
SELECT * FROM tb_clazz WHERE id = #{id}
</select> <!-- 映射Clazz对象的resultMap -->
<resultMap type="com.lfy.bean.Clazz" id="clazzResultMap">
<id property="id" column="id"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
<!-- 一对多关联映射:collection fetchType="lazy"表示懒加载 -->
<collection property="students" javaType="ArrayList"
column="id" ofType="com.lfy.bean.Student"
select="com.lfy.mapping.StudentMapper.selectStudentByClazzId"
fetchType="lazy">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
</collection>
</resultMap>

fetchType属性:有两个取值eager和lazy,eager表示立即加载,是默认的加载形式。在查询Clazz对象的时候,会立即执行关联的selectStudentByClazzId中定义的SQL语句去查询班级的所有学生;lazy表示懒加载,其不会立即发送SQL语句去查询班级的所有学生,而是等到需要使用到班级的students属性时,才会发送SQL语句去查询班级的所有学生信息。

fetch机制更多的是为了性能考虑,如果查询班级时确定会访问班级的所有学生,则该属性应该设置为eager;如果查询班级时只是查询班级信息,有可能不会访问班级的所有学生,则该属性应该设置为lazy。一般情况下,一对多所关联的集合对象,都应该被设置成lazy。

使用懒加载,还需要在Mybatis配置文件中增加如下配置:

总结:关键字collection。

3、多对多

数据库中的多对多关系,推荐使用中间表来维护关系,中间表中的订单id作为外键参照订单表的id,商品id作为外键参照商品表的id。

主要是对前面两种的总和应用。

Mybatis-学习笔记(4)1对1、1对多、多对多的更多相关文章

  1. 【MyBatis学习笔记】

    [MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...

  2. Mybatis学习笔记(二) 之实现数据库的增删改查

    开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...

  3. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  4. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  5. mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

    文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...

  6. mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)

    下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...

  7. mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现

    项目结构  基础入门可参考:mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程) 开始体验 1.新建项目,新建类MybatisUtil.java,路径:src/util/Mybatis ...

  8. Mybatis学习笔记二

    本篇内容,紧接上一篇内容Mybatis学习笔记一 输入映射和输出映射 传递简单类型和pojo类型上篇已介绍过,下面介绍一下包装类型. 传递pojo包装对象 开发中通过可以使用pojo传递查询条件.查询 ...

  9. Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)

    一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...

  10. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

随机推荐

  1. JS语法基础-基本使用及数据类型分类

    JS基础 --------------- 什么是JS? ------------------ JS的全称是Javascript. ----------------------------- 老婆和老婆 ...

  2. 对js库的调研研究------引用

    1. 引言 从以下几个方面来阐述这个问题: 特性. 稳定性. 性能. 包生态. 社区. 学习曲线. 文档. 工具. 发展历史. 团队. 兼容性. 趋势. 2.概述 & 精读 特性 当你调研一个 ...

  3. Burpsuite查看和修改请求

    打开上传测试网页(此处是自己搭建的OWASP平台),这个网页只能上传图片格式的文件 上传一张图片: 查看上传图片: 创建一个test.text文件: 配置浏览器代理,IP:127.0.0.1,端口:8 ...

  4. 能给个安全点的fifo吗

      调试一个基于altera  FPGA的项目,发现开机200次,就会有1到2次的开机不正常现象,但只要是成功开机了,无论运行多久都是正常的.   遇到这类问题,按照经验来说 一般首先想到的可能是电源 ...

  5. html body标签 语法

    html body标签 语法 标签body是什么意思? 标签body是一个网页的身体部分,也就是用于定义网页的主体内容,也是一个HTML文档中必须的部分. 作用:定义文档的主体. 广州大理石机械构件 ...

  6. CodeForces 1200D White Lines

    cf题面 Time limit 1500 ms Memory limit 262144 kB 解题思路 官方题解 1200D - White Lines Let's consider a single ...

  7. 人工智能之基于Opencv与深度学习的计算机视觉实战课程

    https://www.bilibili.com/video/av66375362 imagewatch:https://blog.csdn.net/iracer/article/details/83 ...

  8. xwiki安装部署

    环境介绍 http://aiushtha-mybook.stor.sinaapp.com/xwiki/xwiki%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9 ...

  9. sqli-labs(21)

    cookie注入 引号和括号闭合 base64编码 0X01 看了题目应该是 cookie注入 闭合是') 那么base64编码是什么鬼?? 看源码解决吧 https://www.cnblogs.co ...

  10. 大数据笔记(三十一)——SparkStreaming详细介绍,开发spark程序

    Spark Streaming: Spark用于处理流式数据的模块,类似Storm 核心:DStream(离散流),就是一个RDD=================================== ...