Mybatis多表查询(一对多,多对一,多对多)

MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理 MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理及好处 阅读详情


1、一对多

  • 查询用户详情,同时查询到用户管理的所有订单
  1. 查询用户详情(不含订单)
  2. 查询指定用户的所有订单
  3. 用户管理订单
    • 修改JavaBean
    • 映射文件

1.1、用户详情

功能接口

package com.czxy.ssm.mapper;

import com.czxy.ssm.domain.User;
import org.apache.ibatis.annotations.Param;

/**
 * @author sky
 */
public interface UserMapper {

    /**
     * 通过id查询详情(含所有的订单)
     * @param uid
     * @return
     */
    public User selectById(@Param("uid") String uid);
}

映射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.czxy.ssm.mapper.UserMapper">

    <resultMap id="userResultMap" type="user">
        <id property="uid" column="uid"></id>
        <result property="userName" column="user_name"></result>
    </resultMap>

    <select id="selectById" resultMap="userResultMap">
        select * from user where uid = #{uid}
    </select>

</mapper>

测试类

package com.czxy.ssm;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;

import java.util.List;

/**
 * @author sky
 */
public class Test01_XML_SelectById {
    public static void main(String[] args) {
        //1 获得mapper
        UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);

        //2 查询素有
        User user = userMapper.selectById("u001");
        System.out.println(user);


        //3 释放
        MyBatisUtils.commitAndclose();
    }
}

确认核心配置文件,添加映射文件
在这里插入图片描述

1.2、用户订单

功能接口

package com.czxy.ssm.mapper;

import com.czxy.ssm.domain.Order;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author sky
 */
public interface OrderMapper {

    /**
     * 通过uid查询所有的订单
     * @param uid
     * @return
     */
    public List<Order> selectAllByUid(@Param("uid") String uid);
}

映射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.czxy.ssm.mapper.OrderMapper">


    <select id="selectAllByUid" resultType="order">
        SELECT * FROM orders WHERE uid = #{uid}
    </select>

</mapper>

测试类

package com.czxy.ssm;

import com.czxy.ssm.domain.Order;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.OrderMapper;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;

import java.util.List;

/**
 * @author sky
 */
public class Test02_XML_SelectAllOrderByUid {
    public static void main(String[] args) {
        //1 获得mapper
        OrderMapper orderMapper = MyBatisUtils.getMapper(OrderMapper.class);

        //2 查询素有
        List<Order> list = orderMapper.selectAllByUid("u001");
        list.forEach(System.out::println);

        //3 释放
        MyBatisUtils.commitAndclose();
    }
}

检查核心配置文件,添加映射文件
在这里插入图片描述

1.3、 关联

编写Java

// 一对多关系:一个用户拥有多个订单
private List orderList = new ArrayList<>();
在这里插入图片描述

编写xml映射

<!-- 配置一对多 ,类似@Many  -->
<collection property="orderList" column="uid" select="com.czxy.ssm.mapper.OrderMapper.selectAllByUid"></collection>

在这里插入图片描述

2、多对一

查询订单时,同时查询所属用户

  • 通过id查询订单详情
  • 通过uid查询用户详情(已有)
  • 关联

2.1通过id查询订单详情

功能接口

package com.czxy.ssm.mapper;

import com.czxy.ssm.domain.Order;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author sky
 */
public interface OrderMapper {

    /**
     * 通过oid查询详情
     * @param oid
     * @return
     */
    public Order selectById(@Param("oid") String oid);
}

xml配置

 <resultMap id="orderResultMap" type="order">
        <id property="oid" column="oid"></id>
        <result property="ordertime" column="ordertime"></result>
        <result property="uid" column="uid"></result>
    </resultMap>

    <!-- 查询详情  -->
    <select id="selectById" resultMap="orderResultMap">
        select * from orders where oid = #{oid}
    </select>
    

测试类

package com.czxy.ssm;

import com.czxy.ssm.domain.Order;
import com.czxy.ssm.mapper.OrderMapper;
import com.czxy.ssm.utils.MyBatisUtils;

import java.util.List;

/**
 * @author sky
 */
public class Test03_XML_SelectOrderByid {
    public static void main(String[] args) {
        //1 获得mapper
        OrderMapper orderMapper = MyBatisUtils.getMapper(OrderMapper.class);

        //2 查询素有
        Order order = orderMapper.selectById("x001");
        System.out.println(order);

        //3 释放
        MyBatisUtils.commitAndclose();
    }
}

2.2 关联

编写JavaBean
在这里插入图片描述

// 多对一:多个订单属于一个用户
private User user;

编写XML

<!--  多对一 @One等效 -->
<association property="user" column="uid" select="com.czxy.ssm.mapper.UserMapper.selectById"></association>

在这里插入图片描述

3、多对多

查询所有学生,同时查询每一个学生对应的所有授课老师

  1. 查询所有学生
  2. 查询指定学生的所有授课老师
  3. 关联

3.1、查询所有学生

功能接口

package com.czxy.ssm.mapper;

import com.czxy.ssm.domain.Student;

import java.util.List;

/**
 * @author sky
 */
public interface StudentMapper  {

    /**
     * 所有的学生
     * @return
     */
    public List<Student> selectAll();
}

XML映射配置,需要使用ResultMap (后面需要封装老师的数据)

<?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.czxy.ssm.mapper.StudentMapper">


    <resultMap id="studentResultMap" type="student">
        <id property="sid" column="sid"></id>
        <result property="name" column="name"></result>
    </resultMap>

    <!-- 查询详情  -->
    <select id="selectAll" resultMap="studentResultMap">
        select * from student
    </select>

</mapper>

核心配置文件,添加映射文件
在这里插入图片描述
测试类

package com.czxy.ssm;

import com.czxy.ssm.domain.Order;
import com.czxy.ssm.domain.Student;
import com.czxy.ssm.mapper.OrderMapper;
import com.czxy.ssm.mapper.StudentMapper;
import com.czxy.ssm.utils.MyBatisUtils;

import java.util.List;

/**
 * @author sky
 */
public class Test04_XML_SelectAllStudent {
    public static void main(String[] args) {
        //1 获得mapper
        StudentMapper studentMapper = MyBatisUtils.getMapper(StudentMapper.class);

        //2 查询素有
        List<Student> list = studentMapper.selectAll();
        list.forEach(System.out::println);

        //3 释放
        MyBatisUtils.commitAndclose();
    }
}

3.2、查询指定学生的所有授课老师

功能接口

package com.czxy.ssm.mapper;

import com.czxy.ssm.domain.Student;
import com.czxy.ssm.domain.Teacher;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author sky
 */
public interface TeacherMapper {

    /**
     * 查询指定学生的所有授课老师
     * @return
     */
    public List<Teacher> selectAllBySid(@Param("sid") Integer sid);
}

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.czxy.ssm.mapper.TeacherMapper">


    <!-- 查询详情  -->
    <select id="selectAllBySid" resultType="teacher">
        select * from teacher t, teacher_student ts where t.tid = ts.teacher_id and ts.student_id = #{sid}
    </select>

</mapper>

核心配置文件,添加映射文件
在这里插入图片描述
测试类

package com.czxy.ssm;

import com.czxy.ssm.domain.Student;
import com.czxy.ssm.domain.Teacher;
import com.czxy.ssm.mapper.StudentMapper;
import com.czxy.ssm.mapper.TeacherMapper;
import com.czxy.ssm.utils.MyBatisUtils;

import java.util.List;

/**
 * @author sky
 */
public class Test05_XML_SelectAllTeacherBySid {
    public static void main(String[] args) {
        //1 获得mapper
        TeacherMapper teacherMapper = MyBatisUtils.getMapper(TeacherMapper.class);

        //2 查询素有
        List<Teacher> list = teacherMapper.selectAllBySid(1);
        list.forEach(System.out::println);

        //3 释放
        MyBatisUtils.commitAndclose();
    }
}

关联
编写JavaBean

// 多对多:不同的学生,可以上【不同老师】的课
private List teacherList = new ArrayList<>();
在这里插入图片描述

修改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.czxy.ssm.mapper.StudentMapper">


    <resultMap id="studentResultMap" type="student">
        <id property="sid" column="sid"></id>
        <result property="name" column="name"></result>
        <!--  多对多关系 -->
        <collection property="teacherList" column="sid" select="com.czxy.ssm.mapper.TeacherMapper.selectAllBySid" ></collection>
    </resultMap>

    <!-- 查询详情  -->
    <select id="selectAll" resultMap="studentResultMap">
        select * from student
    </select>

</mapper>

Mybatis一对多的xml映射纪要 背景: 在项目中调整某个列表接口的时候,为了不产生一对多的关联数据,花了小半天的时间调整了关于Mybatis一对多的xml映射关联. 为了后续二遇此类问题能够快速结局,特此纪要! 问题: Mybatis中如何处理一对多的关联映射? 说明: 一对多的场景有很多,简单的就是简单的一对多. 复杂的就是多个一对多合在了一起,比如: 一对多,多中又是一对多;再或者如本案例 中的情况,一对多,多(平级); 在此篇博文记录前,曾阅览过其他的博客,或是没有找到精美博文的缘故,看到的都是一些应对自己临时Demo场景级别. 阅读详情

相关推荐

Mybatis使用xml配置文件进行一对一、一对多及多对多查询的流程详解

1 配置文件 2 注解开发 3 配置文件和注解开发的配置文件区别 3.1 配置文件 使用配置文件开发 mybatis核心配置文件需要加载映射文件: <mappers> <mapper resource="itcast/domain/UserMapper.xml"></mapper> </mappers> 使用注解模式开发 my...

Desperdo 1727

Mybatis基于xml的一对一、一对多、多对多嵌套结果查询和嵌套查询

mabatis 基于xml的一对一,一对多,多对多

qq_41615095的博客 6698

MyBatis多表关联查询

一、搭建测试环境(一对多和多对一) (一)创建测试数据库 CREATE TABLE `t_teacher` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 CREATE TABLE `t_student` ( `id` int(10) NOT NUL

IceTiger_的博客 4677

mybatis 处理 一对多、多对一、多对多关系 注解及xml文件写法

本文章用于研究表与表之间、对象与对象之间的一对多、多对一、多对多联系。研究了xml文件配置和注解配置两种方式超级全哦~用于研究的实体有学生、老师、课程注意:学生和老师之间应该为多对多关系,本文章中采用的是多对一,即多个学生对应一个老师,一个老师对应多个学生。学生与课程之间为多对多关系。

weixin_67661067的博客 1249

2. Netty使用JSerialComm进行串口读取(二)

现在开始处理这些问题 第一个问题:串口读取超时异常一路传播到最后也没有处理。 ​ 第二个问题:即使处理了该异常,程序仍然退出,这不能满足一些实际使用要求需求。该问题与设置很长的读取超时时间没关系,无论多长到时间后总会退出。

s3c2410的博客 2461

Dify 从入门到精通:第一篇 - 基础介绍与快速上手

Dify是一个开源的低代码平台,旨在简化大型语言模型(LLM)应用的开发流程。本文作为"Dify从入门到精通"系列的首篇,全面介绍了Dify的核心概念、安装步骤和基本使用方法。文章首先解析了Dify的多模型支持、低代码开发等特点,然后详细讲解了基于Docker的安装配置过程,包括系统要求、环境变量设置等。通过创建一个邮件助手应用的实际示例,展示了Dify的可视化工作流设计功能。最后简要介绍了高级特性和最佳实践,为后续深入学习奠定基础。本文为开发者提供了从零开始使用Dify构建AI应用的完

IT深耕十余载,大道之简 1145

mybatis多表查询(一对多,多对一,多对多)

@TOC 多对一、一对多 准备阶段 建立一个部门表和员工表: 多个员工可以同属一个部门:这是多对一 一个部门有多个员工:这是一对多 首先在mysql数据库中建表。建立dept表和emp表 dept表 emp表 建立dept实体类和emp实体类 emp实体类(其中包含部门的实体类对象) dept实体类(包含员工的实体类对象集合) 建立Dao接口 查询所有员工的Dao接口 public int...

单线程的Daniel的博客 1204

基于STM32、HAL库的WF282A气压传感器 驱动程序设计

测量范围:0-2.5MPa(可根据需求选择其他量程)输出方式:I2C或SPI数字接口。温度补偿范围:-20℃~85℃。低功耗设计,适合电池供电应用。工作电压:3.3V/5V。精度:±0.1%FS。

corlin6688的博客 393

MyBatis 多表查询全攻略(一对多 / 多对一 / 多对多)

MyBatis 多表查询的核心是通过(单对象)和collection(集合)标签实现关联数据封装,关键要注意字段别名主键映射连接类型选择三大要点。掌握本文的设计逻辑、配置方法和避坑技巧,可轻松应对生产中绝大多数多表查询场景。

2302_79797878的博客 1185

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3963

torch.nn.rnn实现循环神经网络

------------------------------------nn.rnn模型实现。#------------------------------------模型实现。#-----------------------------------训练模型。#-----------------------------------训练模型。#--------------------------------读取数据。实现循环神经网络,并在至少一个数据集上进行实验,从训练时间、预测精度、...

matlab_python22的博客 2968

MyBatis 多表查询之一对多、多对一、多对多

一、一对多 二、多对一 三、多对多

Lemon 1068

Simulink智能驾驶场景探索:自动泊车系统设计与验证

自动泊车系统(APS)传感器模块:用于检测车辆周围的障碍物和其他车辆的位置。路径规划模块:根据传感器数据生成最优的泊车路径。控制器模块:根据路径规划结果生成转向角、速度等控制信号。执行器模块:根据控制器生成的信号调整车辆的方向盘、油门和刹车。在本实例中,我们将使用超声波传感器和摄像头来检测车辆周围的环境,并使用PID控制器实现自动泊车功能。通过本教程,我们介绍了如何使用 Simulink 进行自动泊车系统的仿真。背景介绍:理解自动泊车系统及其在智能驾驶中的应用。所需工具和环境。

MHD0815的博客 505

6/11 MyBatis操作之多表查询(一对一、一对多、多对一、多对多)

通过MyBatis实现分页功能 dao层: Mapper:这里用到了代码的重用 直接传入page和size 日后在业务层再写判断,这里直接把业务层流程写在了test页面里。 Test: 成功实现分页: 若此处不经过判断 一对多查询1:使用一条sql语句进行联表查询。 前提:有一个雇员表emp 和 对应的部门表 dept 查询雇员的所有信息,包括所在的部门信息。 实体设计: 雇员实体:...

qq_39263750的博客 217

模型压缩技术:剪枝、量化与知识蒸馏实战

模型压缩技术:剪枝、量化与知识蒸馏实战,在深度学习领域,模型的性能往往与模型的规模紧密相关,更大的模型通常能学习到更复杂的模式,从而在任务中取得更好的效果。然而,随着模型规模的不断增大,其在实际应用中面临着诸多挑战,如内存占用高、计算资源需求大、推理速度慢等问题,这使得在资源受限的设备(如移动设备、嵌入式设备)上部署变得困难重重。模型压缩技术应运而生,它旨在在尽可能保持模型性能的前提下,通过各种方法减少模型的参数数量和计算量,提高模型的效率和可部署性。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 5万+

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 641

mybatis_“多表查询(一对一,多对一,一对多,多对多)“

MyBatis多表查询(一对一,多对一,一对多,多对多) 阅读前提:本人也是在学习MyBatis的多表查询,期间有碰到一些问题,比如: 1.数据库字段和实体类属性的问题,说实话,命名真的是太关键了。 2.做编程一定要细心,千万不能浮躁 。。。。。。 推荐看下面这些博客,文章: http://c.biancheng.net/view/4368.html https://www.cnblogs.com/xdp-gacl/p/4264440.html https://www.cnblogs.com/2018354

weixin_45828554的博客 204

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Mybatis实现多表查询【多对一,一对一,一对多,多对多】(主要学习常用的方式)

第一种方式(不常用) 将要输出的主表字段与从表字段 进行二次封装 目录列表参考 第二种方式(常用) 在表的实体类内,对主表或从表进行表关系的体现在

weixin_43294854的博客 342

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MyBatis多表关联查询(一对多/多对一/多对多)

MyBatis多表关联查询(一对多/多对一/多对多)

2301_81541593的博客 177

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

KKB :mybatis实现多表查询:一对多,多对一,多对多,一对一

Mybatis查询之多表查询:一对多 记得一句话:一方存多方的集合,多方存储一方的属性。 在一对多的例子中,一:年级 ,多:学生 在年级中存储学生的集合,在学生bean中存储年级的属性 编写接口 编写配置文件 首先我们需要在mysql中先编写好查询语句, 先描述自身的信息,然后描述关联表的信息,id标签表述主键列,非主键列使用result标签描述 比如说这里的grade的id是主键,所以使用的是id标签,而gname是普通列,于是用的是result标签 此处的查询时根据grade

awodwde的博客 258

MyBatis框架的优化练习及MyBatis框架的多表查询练习(一对多,多对一,多对多)(软件工程综合实践课程第八周作业)

软件工程综合实践课程第八周作业(MyBatis框架的优化练习及MyBatis框架的多表查询练习(一对多,多对一,多对多))

GCTTTTTT的博客 1667

MyBatis一对多,多对一和多对多联表查询

MyBatis中的一对多和对多一,多对多 主要就是resultMap中 association – 一个复杂的类型关联;许多结果将包成这种类型(一对多) collection – 复杂类型的集合(多对一) 这2个属性的使用,而一对多和多对一都是...

GreyWings的博客 3082

Mybatis第三天mybatis的深入和多表 mybatis的连接池 mybatis的事务控制及设计的方法 mybatis的多表查询 一对多(多对一) 多对多

Qioooba的博客 183

在java中多对多表查询_Mybatis 一对多和多对一关联查询问题

首先 数据库量表之间字段关系(没有主外键)studentmajor表的id字段对应student表里major字段两个实体类package com.model;import java.util.Date;public class Student {private Integer sno;private String sname;private String ssex;private Intege...

weixin_39934869的博客 482

【MyBatis】Mybatis 多表查询

文章目录Mybatis 多表查询一、表之间的关系二、准备工作2.1 创建account表2.2 创建Account、User实体类2.3 Dao层、映射文件配置2.4 主配置文件SqlMapConfig.xml2.5 测试类配置三、一对一查询3.1 编写sql语句方式一:查询信息实体类3.2.1 创建 AccountUser 类3.2.2 IAccountDao3.2.3 IAccountDao.xml 文件中的查询配置信息3.2.4 AccountTest 测试类方式二:添加主从关系对象属性3.3.1..

懂得一千零一种,赋予你失败的方法! 697

Mybaits之多表查询(联合查询、嵌套查询)

Mybatis之多表联合查询以及案例【通俗易懂】 内涵联合查询方式以及嵌套查询方式

PIKapikaaaa的博客 2833
上一篇: Mybatis XML动态SQL
下一篇: Mybatis练习(一对多:查询所有的一级分类,同时查询二级分类,以及查询二级分类下的所有图书)
一只楠喃
博客等级 码龄6年 5741粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值