Mybatis一对多和多对一处理的深入讲解
一对多处理
一对多处理是指一个实体(表)有多个关联实体(表)的关系。例如,一个订单可以包含多个商品,那么在订单表和商品表之间就有了一对多的关系。
处理方式
一对多处理在Mybatis中主要通过两种方式进行:
- 嵌套查询方式
- 嵌套结果方式
两种方式的区别在于对于关联实体的处理方式不同。
嵌套查询方式
嵌套查询方式是指在查询主实体时,通过多次查询关联实体来获取关联实体的数据。例如,查询订单时,先查询订单表的数据,然后再通过订单ID查询商品表的数据,最后将商品数据设置到订单实体中。这种方式主要通过<select>
标签实现。
示例代码:
<select id="findOrderWithGoodsByOrderId" resultMap="orderWithGoods">
select * from order where id = #{id}
</select>
<resultMap id="orderWithGoods" type="Order">
<id property="id" column="id" />
<result property="orderNo" column="orderNo" />
<result property="status" column="status" />
<collection property="goodsList" resultMap="goodsMap" />
</resultMap>
<select id="findGoodsByOrderId" resultMap="goodsMap">
select * from goods where orderId = #{orderId}
</select>
<resultMap id="goodsMap" type="Goods">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="price" column="price" />
<result property="orderId" column="orderId" />
</resultMap>
在以上示例代码中,<collection>
标签用于表示主实体(订单)和关联实体(商品)的一对多关系,resultMap
属性用于指定关联实体的映射规则,<select>
标签用于查询关联实体的数据。
嵌套结果方式
嵌套结果方式是指在查询主实体时,通过单次查询同时获取主实体和关联实体的数据,并将两个实体进行关联。例如,查询订单时,通过JOIN
语句同时查询订单表和商品表,然后将商品表的数据设置到订单实体的goodsList
属性中。这种方式主要通过<resultMap>
标签实现。
示例代码:
<select id="findOrderWithGoodsByOrderId" resultMap="orderWithGoods">
select o.*, g.id as goodsId, g.name as goodsName, g.price as goodsPrice
from order o left join goods g on o.id = g.orderId
where o.id = #{id}
</select>
<resultMap id="orderWithGoods" type="Order">
<id property="id" column="id" />
<result property="orderNo" column="orderNo" />
<result property="status" column="status" />
<collection property="goodsList" ofType="Goods">
<id property="id" column="goodsId" />
<result property="name" column="goodsName" />
<result property="price" column="goodsPrice" />
</collection>
</resultMap>
在以上示例代码中,通过JOIN
语句同时查询订单表和商品表的数据,在<resultMap>
中通过<collection>
标签表示主实体和关联实体的一对多关系,ofType
属性用于指定关联实体的类型,然后通过<id>
和<result>
标签将查询结果映射到Order
和Goods
实体中。
多对一处理
多对一处理是指多个实体(表)有一个关联实体(表)的关系。例如,多个订单对应一个用户,那么在订单表和用户表之间就有了多对一的关系。
处理方式
多对一处理与一对多处理类似,同样主要通过两种方式进行:
- 嵌套查询方式
- 嵌套结果方式
两种方式的区别同样在于对于关联实体的处理方式不同。
嵌套查询方式
嵌套查询方式与一对多处理的嵌套查询方式类似,只是主实体和关联实体的角色互换了。例如,查询订单时,先查询商品表获取用户ID,然后再通过用户ID查询用户表的数据,最后将用户数据设置到订单实体中。这种方式同样主要通过<select>
标签实现。
示例代码:
<select id="findOrderWithUserByOrderId" resultMap="orderWithUser">
select * from order where id = #{id}
</select>
<resultMap id="orderWithUser" type="Order">
<id property="id" column="id" />
<result property="orderNo" column="orderNo" />
<result property="status" column="status" />
<result property="userId" column="userId" />
<association property="user" resultMap="userMap" />
</resultMap>
<select id="findUserByUserId" resultMap="userMap">
select * from user where id = #{userId}
</select>
<resultMap id="userMap" type="User">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="nickname" column="nickname" />
</resultMap>
在以上示例代码中,<association>
标签用于表示主实体(订单)和关联实体(用户)的多对一关系,resultMap
属性用于指定关联实体的映射规则,<select>
标签用于查询关联实体的数据。
嵌套结果方式
嵌套结果方式与一对多处理的嵌套结果方式类似,同样是通过JOIN
语句一次性查询关联实体的数据,并将结果映射到主实体和关联实体中。例如,查询订单时,通过JOIN
语句同时查询订单表和用户表的数据,然后将用户表的数据设置到订单实体的user
属性中。这种方式同样主要通过<resultMap>
标签实现。
示例代码:
<select id="findOrderWithUserByOrderId" resultMap="orderWithUser">
select o.*, u.*
from order o left join user u on o.userId = u.id
where o.id = #{id}
</select>
<resultMap id="orderWithUser" type="Order">
<id property="id" column="id" />
<result property="orderNo" column="orderNo" />
<result property="status" column="status" />
<result property="userId" column="userId" />
<association property="user" resultMap="userMap" />
</resultMap>
<resultMap id="userMap" type="User">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="nickname" column="nickname" />
</resultMap>
在以上示例代码中,通过JOIN
语句同时查询订单表和用户表的数据,在<resultMap>
中使用<association>
标签表示主实体和关联实体的多对一关系,然后在关联实体的<resultMap>
中将查询结果映射到User
实体中。
结束语
以上就是Mybatis一对多和多对一处理的深入讲解,希望能够对你有所帮助。无论是嵌套查询方式还是嵌套结果方式,关键是要注意好各个标签的使用和属性的设置,才能正确地实现一对多和多对一关系的处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis一对多和多对一处理的深入讲解 - Python技术站