mybatis-利用association和collection实现一对一和一对多

有关于Association和Collection的探究

场景:一个父亲有多个儿子,一个儿子只有一个父亲(一对多场景)

数据库表结构:

father表:fid(int unique),fname(varchar)

son表:sid(int unique),sname(varchar),s_fid(int)

father表中的fid是主键

son表中的s_fid是father表中fid的外键

pojo:

Father类:fid(int),fname(String),slist(List<Son>)

Son类:sid(int),sname(String),f(Father)

Father中加入List用于保存对应的多个儿子

Son中加入一个Father对象来保存唯一的父亲

mapper:

FatherMapper:由于是含有多个儿子,利用collection对应slist

<resultMap type="father" id="fatherMap">
        <!-- id=代表主键映射 property=javaBean中的属性 column=数据库中的字段 -->
        <id property="fid" column="fid" />
        <!-- 非主键映射 -->
        <result property="fname" column="fname" />
        <collection property="slist" ofType="Son" javaType="ArrayList" column="s_fid">
            <id property="sid" column="sid"/>
            <result property="sname" column="sname"/>
        </collection>
</resultMap>

SonMapper:由于含有唯一的爸爸,利用association对应Father

<resultMap type="son" id="sonMap">
        <!-- id=代表主键映射 property=javaBean中的属性 column=数据库中的字段 -->
        <id property="sid" column="sid" />
        <!-- 非主键映射 -->
        <result property="sname" column="sname" />
        <association property="f" column="s_fid" javaType="father">
            <id property="fid" column="fid"/>
            <result property="fname" column="fname"/>
        </association></resultMap>


可以看到数据库里的字段和pojo类里的字段其实是不匹配的

而且我们给父亲加了一个儿子列表,给儿子加了一个父亲对象,但是SQL的数据类型没有对象和列表,这个时候如何利用SQL语句进行赋值呢?

于是collection和association的功能就体现出来了

我们把代码中的collection和association抠出来,其实里面包的就是我们的java类型

对象里的基本数据类型,用这种形式可以做到利用sql访问

下面给出FatherMapper里选择儿子的DQL和SonMapper里选择爸爸的DQL:

<select id="getSons" parameterType="father" resultMap="fatherMap">
        SELECT father.fid,father.fname,son.sid,son.sname from father join son where father.fid=son.s_fid
</select>
<select id="getFather" resultMap="sonMap">
        SELECT son.sid,son.sname,son.s_fid,father.fname,father.fid from son join father where son.sid=#{sid} and father.fid=son.s_fid
</select>

查找出来的字段,只要映射map里有,就填进去

儿子找爸爸的DQL中其实做了5件事,给5个成员变量做了setter:给儿子的sid,sname,s_fid执行setter,再给Father成员变量内的fname和fid执行setter

爸爸找儿子的DQL同理

我们使用了association和collection,相当于点操作,father.set( )。而它的真正意义是映射,把字段映射出来,使sql语句可以对其操作

总结:处理一对多的问题时,设计pojo要给双方都多加一个字段,用于保存对应记录,这样的处理方式使我们的映射文件非常优雅简洁。

原文地址:https://www.cnblogs.com/exigeslover/p/12084247.html

时间: 2024-08-04 11:57:22

mybatis-利用association和collection实现一对一和一对多的相关文章

mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT

mybatis 详解(七)------一对一、一对多、多对多

前面几篇博客我们用mybatis能对单表进行增删改查操作了,也能用动态SQL书写比较复杂的sql语句.但是在实际开发中,我们做项目不可能只是单表操作,往往会涉及到多张表之间的关联操作.那么我们如何用 mybatis 处理多表之间的关联操作呢?请看本篇博客详解. 本篇详细代码:http://pan.baidu.com/s/1eSzmst8 密码:3n3o 1.一对一 我们以用户表 user 和订单表 orders 为例.设定一个订单只能由一个 用户创建,那么由订单到用户就是一对一的关系. ①.创建

Mybatis学习总结(六)——高级映射(一对一,一对多,多对多)

一.订单商品数据模型 1.数据库执行脚本 创建数据库表代码: /*Table structure for table `t_user` */ CREATE TABLE t_user ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(32) NOT NULL COMMENT '用户名称', birthday DATE DEFAULT NULL COMMENT '生日', sex CHAR(1) DEFAULT NULL COMMENT '性别',

六 mybatis高级映射(一对一,一对多,多对多)

1  订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习. 1.1     数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空字段.外键字段 3.数据库级别表与表之间的关系 外键关系 4.表与表之间的业务关系 在分析表与表之间的业务关系时一定要建立 在某个业务意义基础上去分析. 1.2     数据模型分析 用户表user: 记录了购买商品的用户信息 订单表:order

mybatis映射 一对一、一对多、多对多高级映射

1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT '商品图片', 7

【Mybatis】Mybatis关联查询一对一和一对多的实现

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文主要讲了使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明. 一.创建表.分析 下面是两表,一个是顾客表,一个是车票表.一个顾客可以对应多张车票,但是一张车票只能对应一个顾客 t_customer:顾客表,一个顾客可以对应多张车票 t_ticket:车票表,一张车票只能对应一个顾客 1.创建数据表及插入初始数据 创建数据表 use te

Mybatis(四) 高级映射,一对一,一对多,多对多映射

天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种关系来讲,比如有员工和部门,一个部门中有多个员工,从部门方看,是一对多关系,而多名员工属于一个部门,是多对一关系,那么如果我们的业务需求只需要通过部门查找到所有的员工,那么我们就只需要进行单向一对多的映射,如果我们需要通过员工来查询出对应的部门,那么我们就需要进行单向多对一的映射,而如果我们这两个业

Mybatis一对一和一对多配置

问题描述 现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品. 其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情唯一对应一件商品.所以orderdetail中的外键order_id为orders的主键,orderdetail中的外键items_id为items的主键. 数据库结构 DROP TABLE IF EXISTS `items`; /*!40101 SET @saved_cs_client = @@character

MyBatis:Parameter Maps collection does not contain value for 的问题解决

发现配置: Java代码   <resultMap type="com.demo.sys.entity.Module" id="moduleMap"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="r