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

【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标签内

相关文章:

  • 德人合科技 | 天锐绿盾终端安全管理系统
  • GO数组切片
  • 排序算法--堆排序
  • Leetcode210. 课程表 II
  • 大语言模型LLM推理加速:LangChain与ChatGLM3-6B的推理加速技术(LLM系列11)
  • 【Redis】高级特性 - 有序集合
  • 【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!
  • 【pytorch】函数记录
  • 【MySQL】学习多表查询和笛卡尔积 - 副本
  • PureFlash v1.9.1特性介绍
  • 【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
  • 【QT+QGIS跨平台编译】之六十三:【QGIS_CORE跨平台编译】—【错误处理:未定义的类QgsMapLayer - QgsMapLayerModel】
  • 《Vite 基础知识》关于 .mjs .cjs 文件引出 NodeJS 对JS模块加载的思考(CommonJS 和 ESM)
  • 云上攻防-云原生篇Docker安全权限环境检测容器逃逸特权模式危险挂载
  • 零基础怎么学编程,从哪里入手,分享中文编程工具及教程,编程轻松学
  • [Vue CLI 3] 配置解析之 css.extract
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【译】理解JavaScript:new 关键字
  • CentOS 7 防火墙操作
  • Fabric架构演变之路
  • JavaScript HTML DOM
  • mockjs让前端开发独立于后端
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python3爬取英雄联盟英雄皮肤大图
  • SwizzleMethod 黑魔法
  • Vim Clutch | 面向脚踏板编程……
  • 当SetTimeout遇到了字符串
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 模型微调
  • 如何在 Tornado 中实现 Middleware
  • 入门到放弃node系列之Hello Word篇
  • 使用agvtool更改app version/build
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • mysql面试题分组并合并列
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #if 1...#endif
  • #laravel 通过手动安装依赖PHPExcel#
  • $refs 、$nextTic、动态组件、name的使用
  • (06)Hive——正则表达式
  • (4.10~4.16)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十六)一篇文章学会Java的常用API
  • (一)SpringBoot3---尚硅谷总结
  • (转)http协议
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net core 6 redis操作类
  • .net framework4与其client profile版本的区别
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅