Mybatis 多对一查询

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

架构

在这里插入图片描述
这里从学生的角度来说就是多对一的场景

那么在Java中是怎么样的呢?

环境搭建

数据库

CREATE TABLE `student`(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(20) DEFAULT NULL 
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO student VALUES (1,"李老师");

CREATE TABLE `student` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(20) DEFAULT NULL ,
`tid` INT(4) NOT NULL,
KEY `fk_tid` (`tid`),
CONSTRAINT fk_tid FOREIGN KEY(`tid`) REFERENCES `teacher`(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO student VALUES
(1,"小红",1),
(2,"小绿",1),
(3,"小灯",1),
(4,"小勿",1),
(5,"小闯",1);

在这里插入图片描述

实体类

Student

package pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private Teacher teacher;//这里因为我们有一个对应的关系,学生要对应到一个老师,所以要使用Teacher类型
}

Teacher

package pojo;

import lombok.Data;

@Data
public class Teacher {
    private int id;
    private String name;
}

接口

(因为这里是多对一,所以我就没有用到TeacherMapper)
StudentMapper

package dao;

import pojo.Student;

import java.util.List;

public interface StudentMapper {
    List<Student> getStudents();

    List<Student> getStudents2();
}

TeacherMapper

package dao;

public interface TeacherMapper {
}

Mapper配置文件

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.TeacherMapper">

</mapper>

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentMapper">
<!--  第二种  -->
    <select id="getStudents2" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.id tid,t.name tname from student s,teacher t where s.tid=t.id;
    </select>
    <resultMap id="StudentTeacher2" type="Student" >
        <result column="sid" property="id" />
        <result column="sname" property="name" />
        <association property="teacher" javaType="Teacher">
            <result property="id" column="tid" />
            <result property="name" column="tname" />
        </association>
    </resultMap>


<!--  第一种  -->
    <select id="getStudents" resultMap="StudentTeacher">
        select * from student;
    </select>
    <resultMap id="StudentTeacher" type="Student" >
        <result column="id" property="id" />
        <result column="name" property="name" />
        <association property="teacher" column="tid" javaType="Teacher" select="getTeachers" />
    </resultMap>


    <select id="getTeachers" resultType="Teacher">
        select * from teacher where id=#{id};
    </select>
</mapper>

这里说明一下

  • association 是相对于对象的
  • collection是相对于集合的

然后这里有两种方法,我们一种一种看

子查询方法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentMapper">
<!--  第一种  -->
    <select id="getStudents" resultMap="StudentTeacher">
        select * from student;
    </select>
    <resultMap id="StudentTeacher" type="Student" >
        <result column="id" property="id" />
        <result column="name" property="name" />
        <association property="teacher" column="tid" javaType="Teacher" select="getTeachers" />
    </resultMap>


    <select id="getTeachers" resultType="Teacher">
        select * from teacher where id=#{id};
    </select>
</mapper>

也就是这种方法,它其实是相当于我们Sql里面的子查询,也就是一层查询里面嵌套一层查询

按结果集查询

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentMapper">
<!--  第二种  -->
<select id="getStudents2" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.id tid,t.name tname from student s,teacher t where s.tid=t.id;
    </select>
    <resultMap id="StudentTeacher2" type="Student" >
        <result column="sid" property="id" />
        <result column="sname" property="name" />
        <association property="teacher" javaType="Teacher">
            <result property="id" column="tid" />
            <result property="name" column="tname" />
        </association>
    </resultMap>
</mapper>

这种方法就是我们一次性把结果查询出来然后对结果集做一下处理
这里特别说明一下column这个属性,这个可不是数据库中你需要的字段名,而是你查询出来的那张表的字段名,这里起了别名之后就不再是原来teacher数据库表中的字段名了

MyBatis 关联查询 自关联 (一对多、多对一) 所谓自关联是指,自己即充当一方,又充当多方。其实就是普通1:n 和 n:1的变形 1、一对多 1)表结构 -- 新闻栏目 CREATE TABLE `news` ( `id` int(5) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, `pid` int(5) NOT NULL, PRIMARY KEY (`id` 阅读详情

相关推荐

AS7341光谱传感器实战:如何用STM32F103精准测量环境色温(附完整代码)

本文详细介绍了如何使用STM32F103驱动AS7341光谱传感器实现环境色温的精准测量。从硬件连接到驱动开发,再到色温计算算法的实现,提供了完整的代码示例和优化建议,帮助开发者在智能照明、农业监测等领域快速应用AS7341进行高精度色温检测。

weixin_30352645的博客 477

Mybatis多对一,一对多查询模式

现数据库中存在teacher表和student表,其中student表中的tid为外键,连接teacher表中的id。

大河之犬的博客 567

基于单片机智能家居控制系统设计

*单片机设计介绍,基于单片机智能家居控制系统设计。

QQ2193276455的博客 1715

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

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

taiyang3285的博客 3991

USB之ch376s数据手册

         最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通...

iBGG的博客 6002

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 261

mybatis : 多对一关联查询

Order{id=11, orderNumber='20', orderPrice=22.22, customer=Customer{id=1, name='荷包蛋', age=22, orders=[]}}根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息)//根据订单id查询订单的信息,以及该订单所属的客户的基本信息。//测试:根据订单id查询订单的信息,以及该订单所属的客户的基本信息。//根据订单id查询订单的信息,以及该订单所属的客户的基本信息。...

Candyz7的博客 846

setup time和hold time的计算

内容仅仅为了方便记忆,与原理无关

sddhyl的博客 7814

mybatis-20-多对一

方式一 按照查询嵌套处理 <select id="getStudent" resultMap="StudentTeacher"> select * from student; </select> <resultMap id="StudentTeacher" type="Student"> <association property="teacher" column="tid" javaType="Teac.

qq_42938698的博客 218

内模控制(IMC)——理论、应用与实践

内模控制方法的核心思想是利用被控对象的数学模型(即内模)构建控制器,使得控制器可以“预知”被控系统的动态响应,从而在控制输入中提前补偿模型的固有特性和扰动影响。常见的内模控制结构中,将系统分为无延迟部分和扰动部分,并利用内部模型预测输出值,再通过反馈回路进行误差修正。utuimctufbtutui​mctuf​bt其中,uimctu_imc(t)ui​mct为内模预测得到的预补偿控制量,ufbtu_fb(t)uf​bt。

闲人编程的博客 2632

【Basis】Lumerical licence center 无法连接的问题

端口,我们需要确认该端口是否被其他程序占用。这里我们将介绍如何处理这一问题。后,今天电脑更新后我无法打开。终结占用该端口的程序后再次打开。

u011699626的博客 313

【MyBatis】多对一查询

1 实验环境 本文以 Student (many)——Class (one) 为例,介绍 MyBatis 中,多对一查询。 (1)导入 JAR 包 其中,前2个 jar 包下载地址见 →log4j-1.2.17.jar、mybatis-3.4.1.jar,将 jar 包放入 lib 目录下,并选中所有 jar 包,右键,选择【Add to Build Path】。 (2)工作目录 注意:src 和 conf 目录下的 com.mapper 包必须同名;ClassMapper.jav...

little_fat_sheep 509

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

Mybatis--多对一查询&&一对多查询

数据表中经常存在的多对一以及一对多的情况,例如多个员工属于一个部门(多对一), 一个部门有多个员工(一对多)。在Mybatis中普通的查询返回值为实体类对象不能实现以上操作。这就有了xml文件中 自定义映射resultMap的应用。 一、 resultMap处理字段和属性的映射关系 resultMap:设置自定义映射 属性: id:表示自定义映射的唯一标识,不能重复 type:查询的数据要映射的实体类的类型 子标签: id:设置主键的映射关系 result:设置普通字段的映射关系 子标签属性:

sdau_20171819的博客 2883

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

廖雪峰Python教程[完整版]

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

Mybatis之多对一查询

在昨天使用resultmap结果集解决属性和字段不一致导致查询出为null的情况,昨天针对的是简单查询,今天以多对一为例子,继续探究多对一复杂查询,主要涉及知识点为巩固resultmap使用以及其中的association。 思路:1、先查询所有学生信息student 2、查询老师信息teacher 3、设置resultmap关联,如果属性为对象,则使用association,注意javatype、resulttype 均是全路径下的实体类 select 直接绑定查询老师teacher的sql语句

qq_38723455的博客 147

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

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

Mybatis多对一查询的配置及两种方法的使用示例对比以及Mybatis一对多查询两种方法使用示例及对比

同多对一的查询一样,mapper.xml配置中使用子查询嵌套的方法在SQL执行的时候会进行多次查询,最终查询次数和取得的行数成正比增加。City(id=0, cityname=北京, areaList=[Area(id=1, cityid=1, areaname=海淀区), Area(id=35, cityid=1, areaname=东城区), Area(id=18, cityid=1, areaname=西城区), Area(id=37, cityid=1, areaname=朝阳区)])

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1176

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

mybatis多对一关联查询

多对一关联查询

Java修炼者的博客 236

mybatis之多对一查询

多对一 子查询 (效率低 发送sql语句多) N+1 查询方式,先查询出某个表的全部信息,根据这个表的信息查询另一个表的信息. 1. 在 Student 实现类中包含了一个 Teacher 对象 //先查出学生,根据学生再查出老师 public class Student { private int id; privat...

一步一脚印的博客 348

Mybatis 多对一和一对多查询

文章目录Mybatis 多对一 and 一对多查询详解数据库需求Mybatis代码注意 Mybatis 多对一 and 一对多查询详解 数据库 员工表 t_emp 部门表 t_dept CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `emp_name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `age` int DEF

王轩的博客 715

mybatis多对一、一对多、多对多、自关联查询

目录 多对一 创建对象 创建接口 sql 映射文件 测试 结果 方法2:使用单表查询(分布查询)的方式实现多对一 一对多 创建po对象 创建接口 sql语句映射文件 测试 方法2:使用单表查询(分布查询)的方式实现一对多 多对多 创建po对象 创建接口 sql语句映射文件 测试 自关联 po对象 接口 sql语句映射文件 测试 多对一 指的是在...

Birdlun的博客 1584

(6)MyBatis多对一关联查询

MyBatis多对一关联查询 修改Student实体类 添加一个MyClass类型的属性 package com.h3c.bean; public class Student { private int id; private String name; private int age; private double score; //所在班级 private MyClass myclass; //省略constructor、getter、setter、to

qq_33252454的博客 177

mybatis实现两张表的连接查询(多对一)

mybatis实现两张表的连接查询(多对一)

耍耍三郎 7293

3.Mybatis之多对一联表查询

实体Student与Teacher之间是多对一关系,现有要求查询学生并联表查询学生的老师,学生与老师是是一对多的关系,所以在学生实体类种添加Teacher属性。 Student.class package com.xzf.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor publ

weixin_42507883的博客 156

mybatis05:复杂查询:(多对一,一对多)

💕💕💕重点:推荐使用写sql难一点,但写resultMap简单一点的方法(完完整整将语句语句给写完!!!

lenard-lhz的博客 1155

Java自学之mybatis:多对一查询

学习目的:查询出所有的Product(商品)数据,每一个商品都有分类(Category),且可能多个商品属于同一个分类。根据以上关系,使用mybatis完成多对一查询。Part 1修改Product类,加入Category属性,并添加相应的getter、setter。package cn.vaefun.pojo; public class Product { private int id...

IMKKA 263

【Mybatis系列】多对一、一对多查询

什么是多对一什么是一对多大家应该都已经非常清楚了,下面通过一个需求的例子来讲解来mybatis中如何应用 多对一处理: 需求:多个学生对应一个老师 , 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 1.创建两个实体: 教师实体: @Data //GET,SET,ToString,有参,无参构造 public class Teacher { private int id; private String name; } 学生实体: @Data public cl

立志欲坚不欲锐,成功在久不在速度 437
上一篇: Lombok Maven仓库地址和常用注解
下一篇: Mybatis一对多查询
小小代码熊
博客等级 码龄7年 5粉丝 77原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值