Java框架_Mybatis_day07_多表查询之多对多查询

mybatis多表联查(一对一、一对多/多对一、多对多) 在开发过程中单表查询往往不能满足需求分析的很多功能,对于比较复杂业务来说,关联的表有几个,甚至是几十个并且表与表之间的关联相当复杂。为了能够实现复杂的功能业务,就必须进行多表查询,在mybatis中提供了多表查询映射标签,可以实现表之间的一对一、一对多、多对多关系的映射。 **注意:**大批代码正在向你靠近注意:测试代码块放最后运行出错可以看看在示例演练之前需要的准备:首先创建一个maven项目在pom.xml中配置文件 创建配置jdbc.properties 创建配置文件config.xml连接数据库和数 阅读详情

目录

十一、Mybatis 多表查询之多对多查询

11.1 准备工作

11.1.1 角色表

11.1.2 Role.java

11.2 多对多查询,查询角色同时关联用户

11.3 多对多查询,查询用户同时关联角色

十一、Mybatis 多表查询之多对多查询

11.1 准备工作

          这里我们新建一个角色表(role),并且创建 Role.java 、RoleDao.xml 等文件。

11.1.1 角色表

DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',
  `ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) values (1,'院长','管理整个学院'),(2,'总裁','管理整个公司'),(3,'校长','管理整个学校');

DROP TABLE IF EXISTS `user_role`;

CREATE TABLE `user_role` (
  `UID` int(11) NOT NULL COMMENT '用户编号',
  `RID` int(11) NOT NULL COMMENT '角色编号',
  PRIMARY KEY  (`UID`,`RID`),
  KEY `FK_Reference_10` (`RID`),
  CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
  CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user_role`(`UID`,`RID`) values (41,1),(48,1),(41,2);

11.1.2 Role.java

package com.cpz.domain;

import java.util.ArrayList;
import java.util.List;

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


    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;
    }
}

11.2 多对多查询,查询角色同时关联用户

修改Role.java

package com.cpz.domain;

import java.util.ArrayList;
import java.util.List;

public class Role {
    private Integer id;
    private String roleName;
    private String roleDesc;
    private List<User> users = new ArrayList<User>();

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

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

    public void setUsers(List<User> users) {
        this.users = 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;
    }
}

RoleDao.java

package com.cpz.dao;

import com.cpz.domain.Role;

import java.util.List;

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

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.cpz.dao.RoleDao">

    <resultMap id="roleUserMap" type="role">
        <id column="rid" property="id"></id>
        <result column="role_name" property="roleName"></result>
        <result column="role_desc" property="roleDesc"></result>
        <collection property="users" ofType="user">
            <id column="id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="birthday" property="birthday"></result>
            <result column="sex" property="sex"></result>
            <result column="address" property="address"></result>
        </collection>
    </resultMap>

    <select id="findRoleUser" resultMap="roleUserMap">
          SELECT u.*,r.id rid,r.role_name,r.role_desc FROM role r LEFT JOIN user_role ur ON r.id = ur.rid LEFT JOIN USER u ON ur.uid = u.id
    </select>
</mapper>

注意:sql语句如果有换行,需要在sql的后面尽量加一个空格

TestUser.java

    @Test
    public void findRoleUser(){
        List<Role> list = roleDao.findRoleUser();
        for (Role role : list) {
            System.out.println(role);
        }
    }

11.3 多对多查询,查询用户同时关联角色

User.java

package com.cpz.domain;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<Role> roles = new ArrayList<Role>();

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

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }


    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;
    }

}

UserDao.java

package com.cpz.dao;

import com.cpz.domain.User;

import java.util.List;

public interface UserDao {
    public List<User> findUserRole();
}

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.cpz.dao.UserDao">

    <resultMap id="userRoleMap" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="birthday" property="birthday"></result>
        <result column="sex" property="sex"></result>
        <result column="address" property="address"></result>
        <collection property="roles" ofType="role">
            <id column="rid" property="id"></id>
            <result column="role_name" property="roleName"></result>
            <result column="role_desc" property="roleDesc"></result>
        </collection>
    </resultMap>

    <select id="findUserRole" resultMap="userRoleMap">
         SELECT u.*,r.id rid,r.role_name,r.role_desc FROM USER u LEFT JOIN user_role ur ON u.id = ur.uid LEFT JOIN role r ON ur.rid = r.id
    </select>
</mapper>

TestUser.java

    @Test
    public void findUserRole(){
        List<User> list = userDao.findUserRole();
        for (User user : list) {
            System.out.println(user);
        }
    }

 

基于SSM(Spring-SpringMVC-MyBatis)的高级整合(增删改查功能)) 多表联查 此资源是基于SSM(Spring+SpringMVC+MyBatis)的高级整合,项目中利用前端框架bootstrap快速搭建简洁优美的界面,进行对mysql的增,删,改,查的基础操作。是一个非常适合新手学习的例子!!多表联查 立即下载

相关推荐

mybatis关联查询多对多查询案例

该文件夹中包含mybatis多对多查询的具体案例,该文件夹中包含创建的数据库资料以及程序源代码,需要具体讲解请见博客:http://mp.blog.youkuaiyun.com/postedit/79247707

springMVC学习笔记

一、关键技术AOP(Aspect Oriented Program,面向切面编程) 在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,

vivian_ll的博客 453

一对多查询

一对多查询

初学者的java学习笔记——查询(多对多)

数据库 外键字段 把主表的主键作为从表的外键 关系 一对一 一对多(多对一) 多对多 对象模型 一对一,对象中嵌套对象 一对多,对象中嵌套集合对象 多对多,两个对象相互嵌套集合对象 Mybatis(resultMap) resultMap定制 association(一对一) SQL(外连接查询) 属性 resultMap(对应从表的) collec

weixin_47932956的博客 731

Hibernate多对多关联添加及查询示例

Hibernate多对多关联添加及查询示例

用Seurat和ComplexHeatmap绘制单细胞marker基因热图:从数据处理到可视化全流程

本文详细介绍了使用Seurat和ComplexHeatmap绘制单细胞marker基因热图的全流程,涵盖从数据处理、基因筛选、平均表达矩阵计算到高级可视化与注释添加。重点解析了如何利用ComplexHeatmap生成发表级热图,并整合热词信息,解决单细胞数据可视化中的常见问题,提升科研图表质量。

weixin_29048775的博客 529

【mybatis实现多对多查询】

mybatis实现多对多查询

xjj1128的博客 2077

Microduck机器鸭开源AI项目:本地部署与模型微调实战指南

开源AI模型的本地化部署与定制化训练正成为开发者关注的技术趋势。与依赖云端API的在线服务不同,本地部署允许用户将模型权重下载至自有GPU环境,通过命令行或WebUI完成推理、批量任务处理及API集成,在数据隐私、离线使用和接口稳定性方面具备天然优势。模型微调则基于预训练权重,利用领域数据训练特定任务,从而提升生成质量与业务适配度。这一技术路径广泛应用于内容生成、智能对话、自动标注等场景,尤其适合消费级显卡开发者、数据敏感型团队及二次开发研究者。Microduck(机器鸭)作为近期预售火爆的开源项目,围绕“

weixin_29082143的博客 414

java中通过多条件查询_Java 多对多 表联合查询 中 根据 条件 查询指定内容

Java 多对多 表联合查询 中 根据 条件 查询指定内容很神奇,用了四次 for 循环下面的代码表示:有一个类:Y有另一个类:Kenan一个 Y 可以含有多个 Kenan一个 Kenan 可以含有多个 Y这就需要建立另一个类:YKenan(多对多,建立外键等)通过 Y 中含有 “Y” 的字符列,查出多个第一批数据,再通过 Y 外键连接到 YKenan 类,通过里一个外键连接到 Kenan 类,这...

weixin_32837047的博客 1290

AXI_IIC调试实战:从失败到成功的读写操作经验分享

本文分享了调试Xilinx AXI_IIC IP核从失败到成功的实战经验。文章详细解析了IP核以FIFO和状态机为核心的工作机制,强调了状态寄存器查询与延时等待的关键作用,并提供了针对EEPROM的单字节读写操作完整代码与避坑指南,帮助开发者高效完成AXI_IIC读写操作。

weixin_29169505的博客 370

TIA Portal (博图) -两台不同网段S7-1200通信(上)

因为不同网段意味着它们默认不在同一个广播域,并且没有网关设备来处理路由,所以标准的 TCP/IP 通信(如 `TSEND_C`/`TRCV_C`)无法直接建立连接。S7 通信 (PUT/GET): 最简单,配置好连接后,在客户端 PLC 使用 `PUT` 指令发送数据到服务器 PLC,使用 `GET` 指令从服务器 PLC 读取数据。* 在地址详细信息中,确保 本地连接端点是客户端 PLC 的接口,远程连接端点是服务器 PLC 的接口和 IP (`192.168.2.20`)。

电工 2680

4.4Java EE——多对多查询

以订单和商品为例,一个订单可以包含多种商品,而一种商品又可以属于多个订单,订单和商品属于多对多关联关系,订单和商品之间的关联关系如图。3、在商品持久化类中,除了需要添加订单的集合属性外,还需要在订单持久化类(Orders.java)中增加商品集合的属性及其对应的getter/setter方法,Orders类中添加的代码如下。在数据库中,多对多的关联关系通常使用一个中间表来维护,中间表中的订单id作为外键关联订单表的id,中间表中的商品id作为外键关联商品表的id。8、查询订单及关联商品的另一方式。

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 976

在 SAP S/4HANA 的 BP 事务里做保存前校验:BDT 事件、BUPA_FURTHER_CHECKS 与 CVI 扩展 BAdI 一次讲透

SAP BP事务保存前校验机制解析 摘要:本文系统梳理了SAP BP事务保存前的校验机制,揭示了三种关键校验点的差异与适用场景: BDT框架DCHCK事件:最靠近UI层,适合屏幕字段级校验,但API调用时可能失效 Classic BAdI BUPA_FURTHER_CHECKS:全局拦截点,可阻断整个BP保存,适合核心业务规则 CVI扩展校验:仅管控供应商/客户段落,需注意可能产生"BP已保存但段落未保存"的情况 文章通过真实案例(如黑名单校验、付款冻结等)展示了各校验点的最佳实践,并特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 310

MyBatis如何实现多表查询

MyBatis如何实现多表查询(一对一,一对多)

weixin_42588032的博客 5247

2020计算机专业保研夏令营面经:中科院计算所网数机试题目

计算所网络数据科学与技术重点实验室的第一阶段是机试。机试不限程序语言,要求提交源代码。

乔卿的博客 2957

Python量化- Black-Litterman 模型

​​​​​​​Black-Litterman 模型由 Fischer Black 和 Robert Litterman 于 1992 年开发,采用贝叶斯方法进行资产配置。该模型通过结合先前的回报估计(可以从多个来源得出)并结合投资者对未来回报的独特预期来优化分配权重。

探索人工智能领域 1030

MyBatis-学习笔记09【09.Mybatis的多表操作】

MyBatis-学习笔记09【09.Mybatis的多表操作】

upward 1266

SAM3 几行代码支持任意图像分辨率,减少显存占用(针对transformers库)

几行代码让sam3支持任意图像分辨率

qq_41234663的博客 156

【Day 8】MySQL 多表查询 + Mybatis 基础

笛卡尔积:在数学中,两个集合(A集合 和 B集合)的所有组合情况在多表查询时,需要消除无效的笛卡尔积内连接:相当于查询A、B交集部分数据外连接:1)左外连接:查询左表所有数据(包括两张表交集部分数据)2)右外链接:查询右表所有数据(包括两张表交集部分数据)

Yudiannann的博客 1012

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

day07-mybatis实现动态sql、多表查询和注解开发

typora-copy-images-to: img day07-mybatis实现动态sql、多表查询和注解开发 学习目标 1. 掌握sqlMapConfig.xml中常用标签 2. 掌握mybatis框架在DAO层的开发 3. 能够完成单表的CRUD操作 4. 掌握mybatis框架的输入输出映射 5. 掌握MyBatis动态SQL 回顾 1、数据库: DataBase-数据存储 2、数据操作:CRUD-增删改查 【1】使用MySQL默认的客户端: 输入sql脚本操作数据 【2】JDBC:ja.

weixin_51297617的博客 656

visio安装包

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

mybatis day03 多表查询、注解CRUD、注解多表查询、一级缓存、二级缓存

mybatis day03 多表查询、注解CRUD、注解多表查询、一级缓存、二级缓存

weixin_44504809的博客 207

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MyBatis:使用 MyBatis 实现多表查询(多对一和一对多)、动态 SQL、缓存

详细介绍了使用 MyBatis 实现多表查询(多对一和一对多)、动态 SQL 以及缓存的相关内容

taiyang3285的博客 3991

java day55【 Mybatis 连接池与事务深入 、 Mybatis 的动态 SQL 语句、 Mybatis 多表查询之一对多 、 Mybatis 多表查询之多对多】...

第1章 Mybatis 连接池与事务深入 1.1 Mybatis 的连接池技术 1.1.1 Mybatis 连接池的分类 1.1.2 Mybatis 中数据源的配置 1.1.3 Mybatis 中 DataSource 的存取 1.1.4 Mybatis 中连接的获取过程分析 1.2 Mybatis 的事务控制 1.2.1 ...

weixin_30590285的博客 115

Day10--mybatis多表连接查询学习(一对一、一对多、多对多)

MyBatis是一个优秀的持久层框架,支持将SQL语句、存储过程以及高级映射转换成Java对象。下面是MyBatis处理一对一、一对多、多对多关系的方式及相应的代码示例。

gitee_nanzhi66的博客 544

Mybatis框架之关联查询(一对多、多对多)(附Demo:用户和订单)

在上一篇博客 Mybatis框架之快速入门(别再翻了,此篇博客就够了) 介绍了Mybatis框架基本使用细节,在本篇博客将介绍一下在Mybatis如何处理实体之间的关系。 懂一点数据库原理的都知道常见的实体之间的关系有一对一、一对多(多对一)、多对多三种基本关系。下面是User、Order、Product三者之间的关系: 建表sql语句: /* Navicat Premium Data Tra...

hestyle的博客 1136

Java框架学习——Mybatis注解开发实现多表查询

一创建数据库 使用Mysql数据库user表、account表 ①user表 create table `user` ( `id` double , `username` varchar (39), `birthday` date , `sex` varchar (3), `address` varchar (75) ); insert into `user` (`id`, `username`, `birthday`, `sex`, `address`) values('1','tom','2

weixin_37719485的博客 404
上一篇: Java框架_Mybatis_day06_多表关联之一对一、一对多查询
下一篇: Linux_Redis数据库_Jedis
chipeize
博客等级 码龄10年 23粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值