MyBatis中的association与collection应用

在使用 MyBatis进行数据库操作时,经常会遇到需要处理对象之间的关联关系和集合映射的情况。为了更好地实现对象关系映射,MyBatis提供了 associationcollection 两个核心功能,让我们可以更便捷地处理复杂的数据结构。本文将详细介绍在 MyBatis中如何应用 associationcollection

1. association 的应用

association 用于建立两个表之间的对象关联映射。假设我们有两个表:OrderUserOrder 表中有一个字段 user_id 关联到 User 表的主键 id。通过 association,我们可以在查询 Order 的同时将对应的 User 对象关联起来。

首先,我们定义实体类 OrderUser

 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 对象映射到 Orderuser 属性中。

2. collection 的应用

collection 用于实现一对多的集合映射关系。比如在一个 Department 表中有多个员工,通过 collection 可以将一个 Department 对象关联到多个 Employee 对象上。

首先,我们定义实体类 DepartmentEmployee

@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 对象映射到 Departmentemployees 属性中。

结论

通过 associationcollection 的应用,我们可以轻松处理对象关联和集合映射的情况,简化了数据映射的过程。在实际应用中,根据数据库表之间的关系进行更复杂的配置,可以实现更丰富的数据查询和操作功能。MyBatis-Plus 的这些特性为开发人员提供了更高效便捷的数据持久化解决方案。

 
 
 

MyBatis中的association与collection应用的更多相关文章

  1. Mybatis中使用association及collection进行自关联示例(含XML版与注解版)

    XML版本: 实体类: @Data @ToString @NoArgsConstructor public class Dept { private Integer id; private Strin ...

  2. Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)

    XML版本: 实体类: package com.sunwii.mybatis.bean; import java.util.ArrayList; import java.util.List; impo ...

  3. Mybatis中使用association进行关联的几种方式

    这里以一对一单向关联为例.对使用或不使用association的配置进行举例.  实体类: @Data @ToString @NoArgsConstructor public class IdCard ...

  4. MyBatis对象关联关系---- association与collection

    Mybatis处理“一对多”的关系时,需要用到associasion元素.处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过). 本例子中,假设一名User可以有 ...

  5. Mybatis关联查询<association> 和 <collection>

    一.背景 1.在系统中一个用户存在多个角色,那么如何在查询用户的信息时同时把他的角色信息查询出来啦? 2.用户pojo: public class SysUser { private Long id; ...

  6. Mybatis中的association用法

    这篇文章我们将来学习一些 association 用法 表结构 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (  `id` int(1 ...

  7. mybatis中一对多查询collection关联不执行

    今天遇到的原因是因为下面红底id没有,导致关联查询没有条件(id字段没传),所以一直没有执行. <?xml version="1.0" encoding="UTF- ...

  8. MyBatis中出现Mapped Statements collection does not contain value

    引用csdn上一大神的解决方法: 经过排查,解决上述异常的过程如下: 1.确定xml文件中<mapper namespace=""/>中的namespace是否路径正确 ...

  9. Mybatis中的N+1问题与延迟加载

    0.什么是N+1问题? 在查询中一下子取出所有属性,就会使数据库多执行几条毫无意义的SQL .实际中不需要把所有信息都加载进来,因为有些信息并不常用,加载它们会多执行几条毫无用处的 SQL,导致数据库 ...

  10. Mybatis中的collection、association来处理结果映射

    前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:)   标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...

随机推荐

  1. Java定时器(Timer)

    1.介绍 Timer和TimerTask是用于在后台线程中调度任务的java util类.简单地说,TimerTask是要执行的任务,Timer是调度器. 2.调度一次性任务 2.1 指定延迟后执行 ...

  2. Vue+ElementUI实现用户管理前后分离实战二:API接口篇

    项目介绍 上一篇介绍了前端相关实现代码和效果,本篇则介绍后端接口API如何实现. :) 上一篇地址: https://blog.csdn.net/IndexMan/article/details/11 ...

  3. cf思维题

    1.B. Paranoid String 题意:操作一:01可以变成1,操作二:10可以变成0.给定一个串,判断字串经过若干次操作,能否长度变成1,统计数量. 思路:对01来说,1可以吃掉0,然后前边 ...

  4. python项目vscode配置

    最近由pycharm切到VScode, 记录一下项目的通用配置; 在项目目录建一个.vscode的文件夹分别创建三个文件 lunch.json python运行配置 settings.json vsc ...

  5. 【Android逆向】脱壳项目 frida-dexdump 原理分析

    1. 项目代码地址 https://github.com/hluwa/frida-dexdump 2. 核心逻辑为 def dump(self): logger.info("[+] Sear ...

  6. 【转载】nltk英文自定义分词

    NLTK项目地址: https://github.com/nltk/nltk_data/tree/gh-pages/packages NLTK基础分词用例: https://www.cnblogs.c ...

  7. 【LeetCode栈与队列#06】前K个高频元素(TopK问题),以及pair、priority_queue的使用

    前 K 个高频元素 力扣题目链接(opens new window) 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = ...

  8. 协程的async使用

    async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job async函数类似于 launch函数.它启动了一个单独的协程,这是一个轻 ...

  9. 如何将应用一键部署至多个环境?丨Walrus教程

    在 Walrus 平台上,运维团队在资源定义(Resource Definition)中声明提供的资源类型,通过设置匹配规则,将不同的资源部署模板应用到不同类型的环境.项目等.与此同时,研发人员无需关 ...

  10. Python函数对象与闭包函数

    [一]函数对象 函数对象指的是函数可以被当做 数据 来处理,具体可以分为四个方面的使用 [1]函数可以被引用 def add(x,y): return x + y func = add res = f ...