【Mybatis】多表映射 第二期

文章目录

  • 一、多表映射概念
  • 二、对一映射
  • 三、对多映射
  • 四、多表映射总结
    • 4.1 多表映射优化
    • 4.2 多表映射总结


一、多表映射概念

  • 多表关系:
    • 一对一
    • 一对多 | 多对一
    • 多对多
  • 一个 客户 对应 多个订单
  • 一个订单 对应 一个客户

举例:

对一 实体类设计:对一关系下,类中只要包含单个对方对象类型属性即可!

public class Customer {private Integer customerId;private String customerName;}public class Order {private Integer orderId;private String orderName;private Customer customer;// 体现的是对一的关系}  

对多 实体类设计:对多关系下,类中只要包含对方类型集合属性即可!

public class Customer {private Integer customerId;private String customerName;private List<Order> orderList;// 体现的是对多的关系
}public class Order {private Integer orderId;private String orderName;private Customer customer;// 体现的是对一的关系}

多表结果实体类设计小技巧:

  • 对一,属性中包含对方对象
  • 对多,属性中包含对方对象集合
  • 只有真实发生多表查询时,才需要设计和修改实体类,否则不提前设计和修改实体类!
  • 无论多少张表联查,实体类设计都是两两考虑!
  • 在查询映射的时候,只需要关注本次查询相关的属性!例如:查询订单和对应的客户,就不要关注客户中的订单集合!

实际开发时,一般在开发过程中,不给数据库表设置外键约束。
原因是避免调试不方便。
一般是功能开发完成,再加外键约束检查是否有bug。

案例准备:

CREATE TABLE `t_customer` (`customer_id` INT NOT NULL AUTO_INCREMENT, `customer_name` CHAR(100), PRIMARY KEY (`customer_id`) );CREATE TABLE `t_order` ( `order_id` INT NOT NULL AUTO_INCREMENT, `order_name` CHAR(100), `customer_id` INT, PRIMARY KEY (`order_id`) ); INSERT INTO `t_customer` (`customer_name`) VALUES ('c01');INSERT INTO `t_order` (`order_name`, `customer_id`) VALUES ('o1', '1');
INSERT INTO `t_order` (`order_name`, `customer_id`) VALUES ('o2', '1');
INSERT INTO `t_order` (`order_name`, `customer_id`) VALUES ('o3', '1'); 

t_customer 表 与 t_order 表
1

二、对一映射

  • pojo
@Data
public class Order {private int orderId;private String orderName;private int customerId;
//    一个订单对应一个客户private Customer customer;
}
  • 接口
public interface OrderMapper {/*** 根据ID查询订单和对应客户* @param id* @return*/Order queryOrderById(Integer id);
}
  • xml
<mapper namespace="com.wake.mapper.OrderMapper"><!--  自定义映射关系,定义嵌套对象的映射关系  --><resultMap id="orderMap" type="order"><!-- 第一层属性 order对象--><!-- order的主键 id标签  --><id column="order_id" property="orderId"/><!-- 普通列 --><result column="order_name" property="orderName"/><result column="customer_id" property="customerId"/>
<!--对象属性赋值:property="customer"     order 实体类内的属性名字javaType="customer"     对象类型
--><association property="customer" javaType="customer"><id column="customer_id" property="customerId"/><result column="customer_name" property="customerName"/></association></resultMap><!-- Order queryOrderById(Integer id);根据ID查询订单和对应客户--><select id="queryOrderById" resultMap="orderMap">select order_id,order_name,tor.customer_id,customer_namefrom t_order torJOIN t_customer tusON tor.customer_id = tus.customer_idWHERE order_id = #{id};</select>
</mapper>
  • 测试:
public class MybatisTest {private SqlSession sqlSession;@BeforeEachpublic void init() throws IOException {sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Mybatis-config.xml")).openSession();}@Testpublic void testToOne(){//    查询订单和对应客户OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);Order order = orderMapper.queryOrderById(2);System.out.println(order);System.out.println(order.getCustomer());}@AfterEachpublic void clean(){sqlSession.close();}
}

1

三、对多映射

  • pojo
@Data
public class Customer {private int customerId;private String customerName;// 一个客户 多个订单private List<Order> orderList;
}
  • mapper 接口
public interface CustomerMapper {/*** 查询所有客户订单* @return*/List<Customer> queryList();
}
  • xml
<mapper namespace="com.wake.mapper.CustomerMapper"><resultMap id="customerMap" type="customer"><id column="customer_id" property="customerId"/><result column="customer_name" property="customerName"/><collection property="orderList" ofType="order"><id column="order_id" property="orderId"/><result column="order_name" property="orderName"/><result column="customer_id" property="customerId"/></collection></resultMap><select id="queryList" resultMap="customerMap">select *from t_order torJOIN t_customer turON tor.customer_id = tur.customer_id;</select>
</mapper>
  • 测试
    @Testpublic void testToMulti(){// 根据客户ID 查询所有订单CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);List<Customer> customers = customerMapper.queryList();System.out.println(customers);for (Customer customer : customers) {System.out.println(customer.getOrderList());}}

1

四、多表映射总结

4.1 多表映射优化

mybatis-config.xml 全局设置 setting

setting属性属性含义可选值默认值
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。NONE, PARTIAL, FULLPARTIAL
<!--开启resultMap自动映射-->
<setting name="autoMappingBehavior" value="FULL"/>

只用写 id部分 <collection

    <resultMap id="customerMap" type="customer"><id column="customer_id" property="customerId"/>
<!--        <result column="customer_name" property="customerName"/>--><collection property="orderList" ofType="order"><id column="order_id" property="orderId"/>
<!--            <result column="order_name" property="orderName"/>-->
<!--            <result column="customer_id" property="customerId"/>--></collection></resultMap>

4.2 多表映射总结

关联关系配置项关键词所在配置文件和具体位置
对一association标签/javaType属性/property属性Mapper配置文件中的resultMap标签内
对多collection标签/ofType属性/property属性Mapper配置文件中的resultMap标签内

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506036.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自学高效备考2024年AMC10:2000-2023年1250道AMC10真题解析

如何通过自学提高初中和高中数学成绩&#xff1f;现在初中和高中有哪些可以参加的数学竞赛&#xff1f;有没有难度适中、兼具趣味性的数学竞赛&#xff1f;现在参与人数较多的初中、高中数学有哪些&#xff1f;... 如果你也在关注以上问题&#xff0c;不妨看看AMC10美国数学竞…

【书生·浦语大模型实战营】第 2 节 -课后作业

第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗&#xff1f; 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接&#xff1a;https://github.com/internLM/tutorial 首先&#xff0c;这个课程是免费…

C语言do...while 语句的基本格式是什么?

一、问题 C语⾔中有三种循环语句&#xff0c;do...while 语句是其中的⼀个&#xff0c;它的基本格式是怎样的呢&#xff1f; 二、解答 do...while 语句的⼀般形式为&#xff1a; do语句;while(表达式); 其中语句是循环体&#xff0c;表达式是循环条件。 do...while 语句是这…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发口罩识别系统对于提升公共卫生安全和疫情防控具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个口罩识别系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比&#xff0c;给出…

攻略 | 如何通过数据解析,优化知识库以满足用户需求

在日常生活和工作中&#xff0c;一个高效且实用的知识库已成为我们的得力助手。但如何确保它不仅仅是信息的堆砌&#xff0c;真正为用户创造价值与效益&#xff1f;接下来&#xff0c;我们将深入探讨这一问题&#xff0c;并借助HelpLook知识库的数据分析功能&#xff0c;带您全…

修改一个教材上的网站源码使它能在www服务器子目录上正常运行

修改一个教材上的网站源码&#xff0c;使它能在www服务器子目录上正常运行。 该网站源码是教材《PHPMySQL网站开发项目式教程》上带的网站源码。该源码是用 php html 写的。该源码包含对mysql数据库进行操作的php代码。以前该网站源码只能在www服务器的根目录上正常运行&…

计算机设计大赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

代码随想录 二叉树第三周

目录 404.左叶子之和 513.找树左下角的值 112.路径总和 106.从中序与后序遍历构造二叉树 105.从前序与中序遍历序列构造二叉树 654.最大二叉树 404.左叶子之和 404. 左叶子之和 简单 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输…

Tomcat负载均衡、动静分离

目录 引言 实验图解 1.实验环境搭建 2.部署Nginx服务器及配置静态页面Web服务 3.部署Tomcat服务及配置动态页面Web服务 4.实验验收 动态页面 静态页面 引言 tomcat服务既可以处理动态页面&#xff0c;也可以处理静态页面&#xff1b;但其处理静态页面的速度远远不如…

您的计算机已被pings勒索病毒感染?恢复您的数据的方法在这里!

导言&#xff1a; 在数字时代&#xff0c;数据是企业和个人生活中不可或缺的一部分。然而&#xff0c;随着勒索病毒的不断进化和传播&#xff0c;我们的数据面临着前所未有的威胁。其中&#xff0c;.pings 勒索病毒是最新一轮威胁之一&#xff0c;它以其独特的加密算法和无情的…

LeetCode 刷题 [C++] 第45题.跳跃游戏 II

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 nums[n …

Maven【5】在IDEA环境中配置和使用Maven

文章目录 【1】创建父工程1.创建 Project2.开启自动导入 【2】配置 Maven 信息【3】创建 Java 模块工程1.创建2.maven命令操作 【4】创建 Web 模块工程1.创建模块2.Web设定 【1】创建父工程 1.创建 Project 按照idea工程的布局&#xff0c;project相当于父工程&#xff0c;里…