欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis中的关系映射(一对一,一对多,多对多)

程序员文章站 2022-04-22 08:00:30
...

这里写自定义目录标题

Mybatis中的关系映射(一对一,一对多,多对多)

1.1 关联关系概述
在关系型数据库中,多表之间存在着三种关联关系,分别为一对一、一对多和多对多
三种关系如下:

一对一:在任意一方引入对方主键作为外键。

一对多:在“多”的一方,添加“一”的一方的主键作为外键。

多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。

1.2 一对一
在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人

<resultMap>元素中,包含了一个<association>子元素,MyBatis就是通过该元素来处理一对一关联关系的。
<association>元素中,通常可以配置以下属性:

property:指定映射到的实体类对象属性,与表字段一一对应;

column:指定表中对应的字段;

javaType:指定映射到实体对象属性的类型;

select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询;

fetchType:指定在关联查询时是否启用延迟加载。该属性有lazy和eager两个属性值,默认值为lazy(即默认关联映射延迟加载)。

MyBatis加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。

嵌套查询:嵌套查询是通过执行另外一条SQL映射语句来返回预期的复杂类型。

使用<association>元素进行一对一关联映射非常简单,只需要参考如下两种示例配置即可。

嵌套查询,property指的是类属性,column指的是表字段,select表示嵌套的子查询,javaType表示关联属性类型。

<association property="card" column="card_id"
javaType="com.itheima.po.IdCard" select="com.itheima.mapper.IdCardMapper.findCodeById" />

1.3 一对多
开发人员接触更多的关联关系是一对多(或多对一)。

<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的。
<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性–ofType 。

ofType:ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。
<collection>元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:

嵌套查询,property指的是类属性,column指的是表字段,select表示嵌套的子查询,ofType表示关联的集合类属性类型。

<collection property="ordersList" column="id" ofType="com.itheima.po.Orders"
select=" com.itheima.mapper.OrdersMapper.selectOrders" />

嵌套结果,property指的是类属性,column指的是表字段,ofType表示关联的集合类属性类型。

<collection property="ordersList" ofType="com.itheima.po.Orders">
<id property="id" column="orders_id" />
<result property="number" column="number" />
</collection>

1.3 多对多

<id column="id" property="id"></id>
<!--一对一-->
<association property="user" javaType="User" autoMapping="true">
<id column="uid" property="id"></id>
</association>
<!--一对多-->
<collection property="orderdetails" javaType="List" ofType="Orderdetail" autoMapping="true">
<id column="detail_id" property="id"></id>
<!--订单详情和商品的一对一的关系-->
<association property="item" javaType="Item" autoMapping="true">
<id column="iid" property="id"></id>
</association>
</collection>
</resultMap>
<!--多对多查询-->
<select id="queryOrderAndUserAndOrderdetailAndItemByOrderNumber" resultMap="orderAndUserAndOrderdetailsAndItemResultMap">
SELECT
*,u.id as uid,od.id as detail_id,i.id as iid
FROM
tb_order o
INNER JOIN tb_user u ON o.user_id = u.id
INNER JOIN tb_orderdetail od on od.order_id = o.id
INNER JOIN tb_item i on i.id = od.item_id
WHERE
o.order_number = #{orderNumber}
</select>
相关标签: mybatis