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 概况:本地系统从另外一个系统得到 ...
随机推荐
- 承前启后,Java对象内存布局和对象头
承前启后,Java对象内存布局和对象头 大家好,我是小高先生.在我之前的一篇文章<并发编程防御装-锁(基础版)>中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁 ...
- Nginx开启gzip提升访问效率
说明 最近网站考虑开启gzip压缩试试效果,gzip是nginx服务器的ngx_http_gzip_module模块提供的在线实时数据压缩功能. 通过开启gzip功能,可对服务器响应的数据进行压缩处理 ...
- 从零开始写 Docker(二)---优化:使用匿名管道传递参数
本文为从零开始写 Docker 系列第二篇,主要在 mydocker run 命令基础上优化参数传递方式,改为使用 runC 同款的匿名管道传递参数. 如果你对云原生技术充满好奇,想要深入了解更多相关 ...
- nginx中自带的一些变量参数说明
$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...
- 谷歌浏览器vue.js devtools插件安装
github官网 https://github.com/vuejs/vue-devtools#vue-devtools 插件安装地址(需FQ) https://chrome.google.com/we ...
- SpringMvc-<context:component-scan>使用说明
在xml配置了这个标签后,spring可以自动去扫描base-package下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把 ...
- 【Azure 应用服务】App Service for Container中配置与ACR(Azure Container Registry)的RABC权限
问题描述 在使用App Service for container时,在从ACR(Azure Container Registry)中获取应用的镜像时,需要使用对应的权限.默认情况为在ACR中启用Ad ...
- java GUI 快速入门
java 中编写 GUI 有两中工具包,分别为 AWT.Swing. Swing 是 AWT 的拓展,Swing 具有比 AWT 丰富的组件和方法. AWT 和 Swing 都能跨平台使用:AWT 会 ...
- 一文读懂图数据库 Nebula Graph 访问控制实现原理
摘要:数据库权限管理对大家都很熟悉,然而怎么做好数据库权限管理呢?在本文中将详细介绍 Nebula Graph 的用户管理和权限管理. 本文首发 Nebula Graph 博客:https://neb ...
- STL-bitset模拟实现
#include<time.h> #include<string> #include<vector> #include<iostream> using ...