当前位置: 首页 > news >正文

Mybatis——一对多关联映射

一对多关联映射

一对多关联映射有两种方式,都用到了collection元素

以购物网站中用户和订单之间的一对多关系为例

collection集合的嵌套结果映射

创建两个实体类和映射接口

package org.example.demo;import lombok.Data;import java.util.List;@Data
public class User {private Integer userId;private String userName;private String password;private Cart cart;private List<Order> orderList;
}
package org.example.demo;import lombok.Data;@Data
public class Order {private Integer orderId;private double price;
}

实现根据用户id查询出所有用户信息,包括该用户的所有订单信息 

package org.example.mapper;import org.example.demo.User;import java.util.List;public interface UserMapper {User findUserAndOrderListByUserId(Integer userId);
}
方式一:与association类似,集合的嵌套结果映射就是指通过一次SQL查询得到所有的结果 
<resultMap type="com.mybatis.entity.User" id="userMap"><id property="id" column="id"/><result property="userName" column="user_name"/><result property="password" column="password"/>
</resultMap>
<resultMap type="com.mybatis.entity.User" id="userAndOrderListMap" extends="userMap"><collection property="orderList" ofType="com.mybatis.entity.Order"><id property="id" column="order_id"/><result property="price" column="price"/></collection>
</resultMap>
<select id="findUserAndOrderListById" resultMap="userAndOrderListMap">select u.id, u.user_name, u.password,o.order_id, o.pricefrom user uleft join orders o on u.id = o.user_idwhere u.id = #{id}
</select>

resultMap元素中的extends属性可以实现结果映射的继承

collection的ofType属性指定集合中元素的类型,必选项 

    <resultMap id="userAndOrderMap" type="org.example.demo.User"><id property="userId" column="user_id"/><result property="userName" column="user_name"/><result property="password" column="password"/><collection property="orderList" ofType="org.example.demo.Order"><id property="orderId" column="order_id"/><result property="price" column="price"/></collection></resultMap><select id="findUserAndOrderListByUserId" resultMap="userAndOrderMap">select*from t_user uleft join t_order o on u.user_id = o.user_idwhere u.user_id = #{userId};</select>

 

collection集合的嵌套查询

集合的嵌套查询同样会执行额外的SQL查询

<resultMap type="com.mybatis.entity.User"id="userAndOrderListMap" extends="userMap"><collection property="orderList" column="{uid=id}"ofType="com.mybatis.entity.Order"       select="com.mybatis.mapper.OrderMapper.findOrdersByUserId"></collection>
</resultMap>
<select id="findUserAndOrderListById" resultMap="userAndOrderListMap">select * from user where id = #{id}
</select>

OrderMapper.xml

<resultMap type="com.mybatis.entity.Order"id="orderMap"><id property="id" column="order_id"/><result property="price" column="price"/>
</resultMap>
<select id="findOrdersByUserId"resultMap="orderMap">select * from orders where user_id = #{uid}
</select>

对比两种方式

第一种方式属于“关联的嵌套结果映射“,即通过一次SQL查询根据表或指定的属性映射到不同的对象中

第二种方式属于“关联的嵌套查询”,利用简单的SQL语句,通过多次查询得到想要的结果,也可以实现延迟加载效果 

 

 

相关文章:

  • docker从入门到熟悉
  • LabVIEW挖坑指南
  • Linux从入门到精通 --- 2.基本命令入门
  • 网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】
  • Cocos Creator 定时任务
  • JavaEE 初阶篇-生产者与消费者模型(线程通信)
  • ffmpeg Android 笔记
  • uni-app如何实现高性能
  • java——文件上传
  • C++读取.bin二进制文件
  • 掌握数据相关性新利器:基于R、Python的Copula变量相关性分析及AI大模型应用探索
  • 日志服务 HarmonyOS NEXT 日志采集最佳实践
  • NLP学习路线总结
  • jupyter notebook 配置默认文件路径
  • Linux基础篇:Linux第三方软件仓库——可以让Linux变得有趣的软件仓库
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【技术性】Search知识
  • C++类的相互关联
  • CSS 三角实现
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JS+CSS实现数字滚动
  • MySQL用户中的%到底包不包括localhost?
  • Netty 4.1 源代码学习:线程模型
  • pdf文件如何在线转换为jpg图片
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 多线程事务回滚
  • 后端_MYSQL
  • 使用 @font-face
  • 微服务框架lagom
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 由插件封装引出的一丢丢思考
  • 鱼骨图 - 如何绘制?
  • Python 之网络式编程
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $ git push -u origin master 推送到远程库出错
  • (6)STL算法之转换
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)Controller接口控制器详解(三)
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • **PHP分步表单提交思路(分页表单提交)
  • .equals()到底是什么意思?
  • .NET 8.0 发布到 IIS
  • .Net CF下精确的计时器
  • .NET 分布式技术比较
  • .NET连接MongoDB数据库实例教程
  • .Net面试题4
  • 。Net下Windows服务程序开发疑惑
  • @html.ActionLink的几种参数格式
  • @Responsebody与@RequestBody