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. Android项目结构和文件间关联

    版本选择 Android 开发 SDK一般选择用最新的SDK版本, 这是Google官方建议的, App能运行的Android版本不是由SDK决定的, 是由每一个项目的minSDK决定的. SDK都是 ...

  2. Js中数组空位问题

    Js中数组空位问题 JavaScript中数组空位指的是数组中的empty,其表示的是在该位置没有任何值,而且empty是区别于undefined的,同样empty也不属于Js的任何数据类型,并且在J ...

  3. idea自定义代码片段live template

    1.介绍 有时在idea编辑器经常会写同一个代码块,那么这个代码块就可以利用live template功能把它定义成可根据关键字触发的代码片段,效果如下图: 2.操作步骤 此处我们就以springbo ...

  4. pycharm—flask创建简单web项目

    1.系统 系统 版本 OS win 10 pycharm 专业版2022.3.1 2.引入flask包 pip install flask 3.项目目录展示.代码.浏览器访问 from flask i ...

  5. android:加载PDF几种方法汇总对比

    在安卓项目中,加载PDF文件,是一个比较常见的需求.又分为两大类, 1.加载网络PDF 2.加载一个本地静态PDF. 查阅资料,纵观网上在安卓中打开PDF的各种方式,大致可以分为以下几类, 1.直接使 ...

  6. Java JVM——6.本地方法接口

    本地方法接口 什么是本地方法? 简单地讲,一个 Native Method 就是一个Java调用非Java代码的接囗.一个 Native Method 是这样一个Java方法:该方法的实现由非Java ...

  7. 分布式事务框架seata入门

    一.简介 在近几年流行的微服务架构中,由于对服务和数据库进行了拆分,原来的一个单进程本地事务变成多个进程的本地事务,这时要保证数据的一致性,就需要用到分布式事务了.分布式事务的解决方案有很多,其中国内 ...

  8. curator-framework 使用采坑记之org.apache.zookeeper.ClientCnxn - Opening socket connection to server..........Will not attempt to authenticate using SASL (unknown error)报错解决

    一.curator-framework  简介 curator-framework 是对zookeeper做的分二次分布式封装处理,目前代码也是apache 开源社区维护,如下所示. github地址 ...

  9. 使用Order By NULL 解决 group by后自动排序,优化Sql性能

    使用Order By NULL 解决 group by后自动排序,优化Sql性能 对于 Group by 后的结果,Mysql搜索引擎会将结果按照Group by 的字段按照升序,自动排序,例如: t ...

  10. C++ Qt开发:QFileSystemModel文件管理组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFi ...