MyBatis中的association与collection应用
MyBatis中的association与collection应用
在使用 MyBatis进行数据库操作时,经常会遇到需要处理对象之间的关联关系和集合映射的情况。为了更好地实现对象关系映射,MyBatis提供了 association 和 collection 两个核心功能,让我们可以更便捷地处理复杂的数据结构。本文将详细介绍在 MyBatis中如何应用 association 和 collection。
1. association 的应用
association 用于建立两个表之间的对象关联映射。假设我们有两个表:Order 和 User,Order 表中有一个字段 user_id 关联到 User 表的主键 id。通过 association,我们可以在查询 Order 的同时将对应的 User 对象关联起来。
首先,我们定义实体类 Order 和 User:
1 @TableName("order")
2 @Data
3 public class Order {
4 @TableId(value = "id", type = IdType.ASSIGN_ID)
5 private Long id;
6
7 @TableField("order_no")
8 private String orderNo;
9
10 @TableField("user_id")
11 private Long userId;
12
13 @TableField(exist = false)
14 private User user;
15 }
接下来,配置 XML 映射文件 OrderMapper.xml:
<resultMap id="OrderMap" type="com.test.entity.Order">
<id property="id" column="id"/>
<result property="orderNo" column="order_no"/>
<association property="user" javaType="com.test.entity.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
</association>
</resultMap> <select id="getOrderWithUser" resultMap="OrderMap">
SELECT o.*, u.username, u.email
FROM fs_test_order o
LEFT JOIN fs_test_uesr u ON o.user_id = u.id
WHERE o.id = #{id}
</select>
在 OrderMapper 接口中定义查询方法:Order getOrderWithUser(Long id);
在查询 Order 时,通过 association 的配置,MyBatis 会自动将关联的 User 对象映射到 Order 的 user 属性中。2. collection 的应用
collection 用于实现一对多的集合映射关系。比如在一个 Department 表中有多个员工,通过 collection 可以将一个 Department 对象关联到多个 Employee 对象上。
首先,我们定义实体类 Department 和 Employee:
@TableName("employee")
@Data
public class Employee {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
@TableField("name")
private String name;
@TableField("department_id")
private Long departmentId;
}
@TableName("uesr")
@Data
public class User {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
@TableField("username")
private String username;
@TableField("email")
private String email;
}
接下来,配置 XML 映射文件 DepartmentMapper.xml:
<resultMap id="DepartmentMap" type="jnpf.test.entity.Department">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="employees" ofType="jnpf.test.entity.Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
</collection>
</resultMap> <select id="getDepartmentWithEmployees" resultMap="DepartmentMap">
SELECT d.*, e.id, e.name
FROM fs_test_department d
LEFT JOIN fs_test_employee e ON d.id = e.department_id
WHERE d.id = #{id}
</select>
在 DepartmentMapper 接口中定义查询方法:
Department getDepartmentWithEmployees(Long id);
在查询 Department 时,通过 collection 的配置,MyBatis 会自动将关联的多个 Employee 对象映射到 Department 的 employees 属性中。
结论
通过 association 和 collection 的应用,我们可以轻松处理对象关联和集合映射的情况,简化了数据映射的过程。在实际应用中,根据数据库表之间的关系进行更复杂的配置,可以实现更丰富的数据查询和操作功能。MyBatis-Plus 的这些特性为开发人员提供了更高效便捷的数据持久化解决方案。
MyBatis中的association与collection应用的更多相关文章
- Mybatis中使用association及collection进行自关联示例(含XML版与注解版)
XML版本: 实体类: @Data @ToString @NoArgsConstructor public class Dept { private Integer id; private Strin ...
- Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)
XML版本: 实体类: package com.sunwii.mybatis.bean; import java.util.ArrayList; import java.util.List; impo ...
- Mybatis中使用association进行关联的几种方式
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
- MyBatis对象关联关系---- association与collection
Mybatis处理“一对多”的关系时,需要用到associasion元素.处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过). 本例子中,假设一名User可以有 ...
- Mybatis关联查询<association> 和 <collection>
一.背景 1.在系统中一个用户存在多个角色,那么如何在查询用户的信息时同时把他的角色信息查询出来啦? 2.用户pojo: public class SysUser { private Long id; ...
- Mybatis中的association用法
这篇文章我们将来学习一些 association 用法 表结构 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(1 ...
- mybatis中一对多查询collection关联不执行
今天遇到的原因是因为下面红底id没有,导致关联查询没有条件(id字段没传),所以一直没有执行. <?xml version="1.0" encoding="UTF- ...
- MyBatis中出现Mapped Statements collection does not contain value
引用csdn上一大神的解决方法: 经过排查,解决上述异常的过程如下: 1.确定xml文件中<mapper namespace=""/>中的namespace是否路径正确 ...
- Mybatis中的N+1问题与延迟加载
0.什么是N+1问题? 在查询中一下子取出所有属性,就会使数据库多执行几条毫无意义的SQL .实际中不需要把所有信息都加载进来,因为有些信息并不常用,加载它们会多执行几条毫无用处的 SQL,导致数据库 ...
- Mybatis中的collection、association来处理结果映射
前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:) 标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...
随机推荐
- 【Android】Message、Handler、MessageQueue、Looper 详解
1 前言 Handler 即处理器,常用于跨线程通讯:线程A 和线程 B 拥有同一个 handler 对象,在线程 A 中使用 handler 的 sendMessage() 方法发送消息,在线程 ...
- 使用UTL_HTTP包获取网页内容
UTL_HTTP 包提供了容易的方式通过HTTP协议获取网页内容,下面结合几个例子介绍一下: ----------------------------------------------------- ...
- C# readonly修饰符
readonly修饰符在作祟 强化官方解释: readonly是一个修饰字段的关键字:被它修饰的字段只有在初始化或者构造函数中才能够赋值. readonly修饰的引用类型字段必须始终引用同一对象: r ...
- Golang微服务框架go-kratos分析:框架架构分析
一.kratos设计理念 这里主要讲解 kratos v2 的设计理念. kratos 框架制定接口规范,然后通过插件来实现具体需求,实现自由定制.可插拔的微服务框架. 我们既可以选择 kratos ...
- Miniconda安装和使用
Miniconda概述 Miniconda是什么? 要解释Miniconda是什么,先要弄清楚什么是Anaconda,它们之间的关系是什么? 而要知道Anaconda是什么,最先要明白的是搞清楚什么是 ...
- 正则计算器---day19
计算下面表达式最后的结果 strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))& ...
- React 中 Ref 引用
不要因为别人的评价而改变自己的想法,因为你的生活是你自己的. 1. React 中 Ref 的应用 1.1 给标签设置 ref 给标签设置 ref,ref="username", ...
- 名校 AI 课程|斯坦福 CS25:Transformers United 专题讲座
自 2017 年提出后,Transformer 名声大噪,不仅颠覆了自然语言处理(NLP)领域,而且在计算机视觉(CV).强化学习(RL).生成对抗网络(GANs).语音甚至是生物学等领域也大显锋芒, ...
- 【Azure 云服务】云服务(经典) 迁移至云服务(外延支持) 的相关疑问
问题描述 根据微软官方文档说明,云服务(经典)已弃用.所以关于它有以下的一些疑问: 一:迁移时候的停机时间问题? 二:云服务(经典) 与 云服务(外延支持) 的区别是什么? 三:注意事项有那些呢?如 ...
- 通过debug搞清楚.vue文件怎么变成.js文件
前言 我们每天写的vue代码都是写在vue文件中,但是浏览器却只认识html.css.js等文件类型.所以这个时候就需要一个工具将vue文件转换为浏览器能够认识的js文件,想必你第一时间就想到了web ...