Mybatis的关联查询(association和collection)

MyBatis 关联映射深度解析:_association_ 与 _collection_ 实战教程 MyBatis 中的 <association> 和 <collection> 标签用于处理对象间的关联关系,分别映射单个嵌套对象和集合属性。<association> 适用于一对一或多对一关系,如员工与部门;<collection> 适用于一对多或多对多关系,如用户与角色。标签属性包括 property、javaType、resultMap 等,用于定义映射规则。实战中,常见错误包括列名冲突和级联属性语法不清晰,可通过明确别名和使用 <associat 阅读详情

关联查询

  • 实体间的关系(拥有 has、属于 belong)

    • OneToOne:一对一关系(account ←→ user)

    • OneToMany:一对多关系(user ←→ account)

    • ManyToMany:多对多关系(user ←→ role)

  • 什么是关联查询

    当访问关系的一方时,如果需要查看与之关联的另一方数据,则必须使用表链接查询,将查询到的另一方数据,保存在本方的属性中

  • 关联查询的语法

    指定“一方”关系时(对象),使用< association javaType="" >

    指定“多方”关系时(集合),使用< collection ofType="" >

一,一对一查询

需求:查询账户信息,关联查询用户信息。

分析:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。

com.by.pojo下的Account类

public class Account implements Serializable {

    private Integer id;
    private Integer uid;
    private Double money;
    //加入User类的对象作为Account类的一个属性
    private User user;

    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                ", user=" + user +
                '}';
    }
}

com.by.dao下的AcountDao接口

public interface AccountDao {
    List<Account> findAll();
}

com.by.dao下的AcountDao.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.AccountDao">
    <!-- 结果映射 -->
    <!--resultMap中的id必须与select中的resultMap中的值相同-->
    <resultMap type="account" id="findAllResultMap">
        <id column="aid" property="id"/>
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
        <!-- 指定关系表中数据的封装规则 -->
        <!--
            association 处理一对一
            封装一对一信息关系的标签
            property  类的属性名
            javaType  用哪个类的对象给属性赋值

        -->
        <association property="user" javaType="user">
            <id column="id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="birthday" property="birthday"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
    <select id="findAll" resultMap="findAllResultMap">
        select u.*,a.id as aid,a.uid,a.money from account a,user u where a.uid =u.id
    </select>
</mapper>

测试类

private SqlSession sqlSession;
    private InputStream inputStream;
    @Before
    public void init() throws IOException {
        //加载配置文件
        String resource = "mybatis-config.xml";
        inputStream = Resources.getResourceAsStream(resource);
        //创建SessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //使用数据的会话实例
        sqlSession = sessionFactory.openSession();
    }
@After
    public void close() throws IOException {
        sqlSession.close();
        inputStream.close();
    } 
@Test
    public void testOneToOne() {
        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
        List<Account> accountList = accountDao.findAll();
        for (Account ac : accountList) {
            System.out.println(ac);
        }
    }

输出结果

二,一对多查询

需求:查询所有用户信息及用户关联的账户信息。

分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,此时左外连接查询比较合适。

com.by.pojo下的Account类

package com.by.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private Date birthday;
    private String sex;
    private String address;
    //加入List<Account>存储用户所拥有的账户
    private List<Account> accounts;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", accounts=" + accounts +
                '}';
    }
}

com.by.dao下的AcountDao接口

public interface AccountDao {
    List<Account> findAll();
}

com.by.dao下的UserDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.UserDao">
    <!--resultMap中的id必须与select中的resultMap中的值相同-->
    <resultMap type="user" id="findAllResultMap">
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="address" property="address"/>
        <result column="sex" property="sex"/>
        <result column="birthday" property="birthday"/>
        <!-- collection 是用于建立一对多中集合属性的对应关系
        ofType 用于指定集合元素的数据类型
        -->
        <collection property="accounts" ofType="account">
            <id column="aid" property="id"/>
            <result column="uid" property="uid"/>
            <result column="money" property="money"/>
        </collection>
    </resultMap>
    <!-- 配置查询所有操作 -->
    <select id="findAll" resultMap="findAllResultMap">
      select u.*,a.id as aid ,a.uid,a.money 
      from user u left join account a on u.id =a.uid
    </select>
</mapper>

测试类

private SqlSession sqlSession;
    private InputStream inputStream;
    @Before
    public void init() throws IOException {
        //加载配置文件
        String resource = "mybatis-config.xml";
        inputStream = Resources.getResourceAsStream(resource);
        //创建SessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //使用数据的会话实例
        sqlSession = sessionFactory.openSession();
    }
@After
    public void close() throws IOException {
        sqlSession.close();
        inputStream.close();
    }
@Test
    public void testOneToMany() {
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findAll();
        for(User user : userList){
            System.out.println(user);
        }
    }

输出结果

三,多对多查询

需求:查询角色及角色赋予的用户信息。

分析:一个用户可以拥有多个角色,一个角色也可以赋予多个用户,用户和角色为双向的一对多关系,多对多关系其实我们看成是双向的一对多关系。

 com.by.pojo下的Role类

public class Role {
    private Integer id;
    private String roleName;
    private String roleDesc;
    //加入List<User> users存储角色赋予的用户信息
    private List<User> users;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleDesc() {
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                ", users=" + users +
                '}';
    }
}

com.by.dao下的RoleDao接口

public interface RoleDao {
    List<Role> findAll();
}

com.by.dao下的RoleDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.RoleDao">
    <!--定义 role 表的 ResultMap-->
    <resultMap id="findAllResultMap" type="Role">
        <id property="id" column="rid"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        <collection property="users" ofType="user">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
        </collection>
    </resultMap>
    <!--查询所有-->
    <select id="findAll" resultMap="findAllResultMap">
        select r.id as rid,r.role_name,r.role_desc,u.* from role r
        left join user_role ur on r.id = ur.rid
        left join user u on u.id = ur.uid
    </select>
</mapper>

测试类

private SqlSession sqlSession;
    private InputStream inputStream;
    @Before
    public void init() throws IOException {
        //加载配置文件
        String resource = "mybatis-config.xml";
        inputStream = Resources.getResourceAsStream(resource);
        //创建SessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //使用数据的会话实例
        sqlSession = sessionFactory.openSession();
    }
@After
    public void close() throws IOException {
        sqlSession.close();
        inputStream.close();
    } 
 @Test
    public void testManyToMany() {
        RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
        List<Role> roleList = roleDao.findAll();
        for(Role role : roleList){
            System.out.println(role);
        }
    }

测试结果

深入学习推荐文章: 

Mybatis中三种关联关系的实现,看这篇就够了 - 知乎 (zhihu.com) 

Mybatis之association和collection 1.单个关联查询association 1.1实体之间的关联表示 package com.worldly.config.entity; import java.io.Serializable; /** * @Description * @Author xiaoqx &lt;worldly_xuan@163.com&gt; * @Version V1.0.0 * @Since... 阅读详情

相关推荐

MyBatis中的collection用法详解:两种常见用法

通过collection标签,我们将Course对象关联到Student对象,并指定了相应的属性和列名的映射关系。通过collection标签,我们将Item对象关联到Order对象,并指定了相应的属性和列名的映射关系。在查询Student对象时,MyBatis会自动将相关的Course对象查询出来,并将它们添加到Student对象的courses属性中。在查询Order对象时,MyBatis会自动将相关的Item对象查询出来,并将它们添加到Order对象的items属性中。

NknkCode的博客 1454

MyBatis中的association的使用

MyBatis中association的联表查询

qq_41982223的博客 3万+

HFSS学习记录——0. HFSS软件安装(ANSYS Electromagnetics Suite 2023 R1)

HFSS 2023 R1安装步骤

plmxu34的博客 15万+

MyBatis之association和collection标签

一般情况下一对一使用标签,一对多使用标签。

csdnzhang365的博客 1万+

基于单片机的继电器参数测试系统设计

由于原有测试系统在参数设置上过于单一,在对继电器测试过程中需要多次进行器件连接,导致对其测试准确度下降,会造成继电器的二次损伤,基于单片机研究继电器参数测试系统的设计方法。在硬件设计上,构建二级模式集散控制框架,利用单片机进行数据采集和处理,满足实时继电器参数数据的同步控制;设计双极性反向比例输出电路,分别利用电极电阻对继电器两侧电压进行放大,实现继电器实时电压的检测。实验结果:以两组类型断电器为测试对象,分别连接示波器进行真实数据采集,在本文系统的应用下所得参数测试结果,与真实的数据相一致,具有实际应用效

weixin_45905610的博客 1438

EFR32BG22 Thunderboard开发板 使用SPI 读取加速度计

Simplicity Studio v5 创建Silicon Labs蓝牙SoC EFR32BG22 Thunderboard模块的加速度计工程,模块上有一个ICM-20648 6轴运动跟踪设备,集成3轴加速度计和3轴陀螺仪功能,使用SPI接口跟EFR32BG22芯片连接。 我尽量以图片的形式展示(少打字): 将EFR32BG22的Thunderboard模块通过USB线插入到电脑,打开Simplicity Studio v5软件。 下面看重点: 点击搜索到的IO Stream: USART,点击Ins

qq_25727979的博客 1494

Mybatis association与collection关联查询

Mybatis使用association与collection关联查询 association:复杂的类型联合,一个复杂的关联,就是在查出结果后,根据情况将其映射到一个类中(其是一个对象),即resultMap中的一个property对应的是一个类 collection:复杂的类型集合,查出结果后,根据情况将其映射到一个集合中,resultMap中的一个property的对象类型是一个集合对象...

绝圣弃智-零的博客 1076

从零到一:Zephyr RTOS 在 STM32F4 上的移植与实战(含设备树配置详解)

本文详细介绍了如何从零开始将Zephyr RTOS移植到STM32F4开发板,涵盖开发环境搭建、硬件抽象层分析、设备树配置及系统裁剪等关键步骤。通过实战案例,帮助开发者掌握Zephyr RTOS在嵌入式设备中的应用,提升物联网边缘计算设备的开发效率。

weixin_26976635的博客 589

MyBatis中一对一、一对多关联查询、association、collection的使用、延迟加载的使用

一对一 所有方法均要符合一个原则,返回的类中要直接或者间接包含所有查询的字段 1:业务扩展类 核心:使用resultType所指定的返回类中要包含多表查询的所有字段。 例如,在数据库中存在两张表,学生表和班级表,学生表中有班级表的外键classId,当我们进行两表联合查询的时候,既要有学生表的信息,又要班级表的信息,而resultType只能填入一个类,这时候就需要重新创建一个类,包含两个类的所有数据类型即可,可行的一个办法是,新建的类先继承两者其中一个类,然后再将另一个类的内容粘贴过来,再重写一次toSt

toukokuu的博客 283

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3812

SolidWorks草图绘制实战:如何用图片参考快速搞定智能小车底板设计

本文详细介绍了在SolidWorks中利用图片参考进行草图绘制的实战方法,以智能小车底板设计为例,帮助设计师快速将概念转化为精准三维模型。通过插入、对齐参考图片并高效描图,结合参数化约束与尺寸驱动,大幅提升设计效率和准确性,尤其适合新手入门与老手优化工作流。

rust6ferris的博客 218

mybatis学习记录——Springboot+mybatis+mysql多表关联查询collection、association用法

Mybatis多表关联查询 使用collection标签:一对多查询 使用association标签:一对一查询 两种标签用法基本一致,下面已collection实例说明: collection关联查询 现在有三张表如下:t_role(角色表)、t_user(用户表)、t_user_in_role(关联表) 实体类定义 Dao层定义:通过角色名获取对应用户 mapper.xml配置(方式有三种,本文使用最简单的一种):非常关键 collection标签对应的属性即为实体Rol

weixin_54922274的博客 455

5、模型预测控制与分布式MPC控制结构解析

本文深入解析了模型预测控制(MPC)中的双模式预测控制及其稳定性理论,并探讨了分布式MPC的不同控制结构。内容涵盖MPC的基本公式化、性能指标、优化问题以及相关算法步骤,同时比较了集中式MPC、单层分布式MPC和分层分布式MPC的优缺点和适用场景。最后通过流程图和表格形式总结了双模式MPC的算法步骤和控制结构选择思路,并提供了操作建议,以帮助在实际工业系统中更好地应用MPC技术。

tea88的博客 168

Mybatis---查询resultMap-多表关联{association-collection}--延迟加载

Mybatis查询 文章目录Mybatis查询resultMap多表关联处理结果集associationcollection相关的association与collection区别案例associationcollection相关类EmpDeptMybatis延迟加载的实现方式概念:加载时机 resultMap resultMap: 结果映射。 自定义列名和java对象属性的对应关系。 常用在列名和属性名不同的情况。 用法: 1.先定义 resultMap标签, 指定列名和属性名称对应关系 2.在select

qq_44236958的博客 1022

【PySide6拓展】初识QChart图表

在 PySide6 中,QtCharts模块提供了一系列强大的类,用于创建和管理图表。QChart是这个模块的核心类,它可以帮助开发者轻松地实现数据的可视化。本篇文章将介绍如何使用 PySide6 的QtCharts模块,并通过一个简单的示例教你如何快速引入QChart。QChart折线图柱状图饼图区域图它能够直观地呈现数据,同时支持交互功能,如缩放、拖拽和工具提示等。通过引入QChart,我们可以轻松实现数据的可视化,提升应用的交互性和用户体验。结合其他QtCharts。

m0_62599305的博客 820

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MyBatis学习(五)------association和collection标签实现关联表查询

association标签应用 创建数据库one2many两张表,客户表和订单表,进行主外键关联 CREATE DATABASE one2many DEFAULT CHARSET utf8; use one2many; Create table customer( id int primary key auto_increment, name varchar(32), age int ); i...

于采柳的博客 519

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Mybatis】深入浅出Mybatis(十三)——使用association和collection实现关联查询

一、前言      前面的时候,小编向大家介绍了Mybatis的使用,总结来说,Mybatis注重的是写sql语句。针对单表 的增删改查还是比较好写的,直接写出SQL语句可以了,但是如果遇到了多表的关联查询,可能就会复杂了点。下面小编就向大家介绍如何进行多表的复杂查询 。二、关联关系为一对一查询方法一 使用resultType      思路:创建一个大实体Model,这个Model是和关联查询的f

哈士奇 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MyBatis进阶四:Mybatis对象关联查询;(【一对多】(<collection>)&【多对一】(association))

OneToMany对象关联查询

小枯林的博客 2282

五,mybatis的多表关联查询

mybatis的多表关联查询

weixin_51637046的博客 2624

mybatis使用association和collection实现一对一和一对多关联查询

association是一对一,collection是一对多,association和collection在使用上没有区别,以下不作区分。 有两种配置方式: 使用select属性进行关联查询 宠物 <mapper namespace="com.tang.PetMapper"> <resultMap id="petResult" type="com.tang.Pet"> ...

生而为人我很抱歉 972

Mybatis(八)——关联查询(association、collection)

一对一查询 建立好两个表student和card,其中student表中主键为id,外键为cardid,指向card表中的主键id。 建立一个Card类与表card对应 package com.santiago.entity; public class Card { private int id; private String info; public int g...

GoSantiago的博客 536

【Mybatis】 mapper XML 文件中使用 collection实现一对多关联

前言 Mybatis 一对一,使用 association 标签 Mybatis 一对多,使用 collection 标签 本文主要说明 collection 实现一对多关联。使用 association 实现一对一关联,参考这里 。 collection实现一对多关联 <mapper namespace="..."> <resultMap type="XX" id="XXMap"> <result property="id" column="xx_id"/>

sayyy的专栏 7500

mybatis 查询中collection和association 标签的使用

准备两个表员工和部门,关系是一个部门下有多个员工,表数据如下 员工: 部门: 对应的实体: 员工: @Data public class Emp { private Integer id; private String empName; private String sex; private String email; private Dept dept; } 部门: @Data public class Dept { pr

csdnmuyi的博客 1818

超多干货!!!MyBatis多表关联查询处理结果集、懒加载、association(一对一)、collection(一对多)、案例详解

文章目录多表关联查询处理结果集准备阶段操作及测试多表关联处理结果集一对一结果映射一对多结果映射懒加载懒加载的使用案例 多表关联查询处理结果集 我们使用MyBatis对单张表进行输出映射是一个比较简单的过程,可以直接将结果封装到POJO(普通java对象)对象中,就算是java类的属性名和数据库的列名不完全一致,我们也可以使用resultMap进行配置,但是当我们多表关联查询时,这些手段就跟不上我们的步伐了,下面用一个例子(部门-员工)为大家详细演示多表关联查询。 准备阶段 1.建立数据库表(部门表t_dep

Lotus_dong的博客 1542
上一篇: MyBatis的配置文件(.properties,typeAliases,Mappers)
下一篇: Mybatis的延迟加载(fetchType=“lazy“)
涵冰...
博客等级 码龄4年 2438粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵冰...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值