Mybatis之多表查询

目录

一、简介

1、使用嵌套查询:

2、使用多个 SQL 语句:

3、使用关联查询:

4、使用自定义映射查询:

二、业务场景

三、示例

1、一对一查询

2、一对多查询


一、简介

MyBatis 是一个优秀的持久层框架,它提供了强大的支持来执行数据库操作,包括多表查询。多表查询是指从多个数据库表中检索数据的过程,这在实际的应用中非常常见。MyBatis 提供了多种方法来执行多表查询,以下是一些常见的技术和方法:

1、使用嵌套查询:

这是最基本的多表查询方法,通过在 SQL 语句中嵌套子查询来联合多个表的数据。例如,你可以在 SELECT 语句中使用子查询来从一个表中获取数据,然后再将其用于主查询中。这种方法在某些简单情况下是有效的,但对于复杂的多表查询可能会变得冗长和难以维护。

2、使用多个 SQL 语句

在 MyBatis 中,你可以编写多个独立的 SQL 语句,每个语句都从一个表中检索数据,然后在 Java 代码中将这些数据组合起来。这通常需要在 Java 代码中手动执行每个查询并进行数据处理,但对于一些复杂的多表查询情况可能更加灵活。

3、使用关联查询:

 MyBatis 支持使用关联查询来执行多表查询,特别是在映射文件中配置了表之间的关联关系。通过在 Mapper XML 文件中配置 association 或 collection 来表示表之间的关联关系,MyBatis 可以自动根据关系从多个表中检索数据并构造结果对象。

4、使用自定义映射查询

有时候,多表查询的结果可能不适合于一个实体类,这时你可以使用自定义映射查询来将结果映射到一个 Map 或者其他自定义的数据结构中,以适应查询的需要。

二、业务场景

模拟的业务场景为订单与用户的关系,可以是一对一、一对多。

比如,一个用户有多个订单,一个订单只有一个用户。

还有就是用户与角色的关系,多个用户拥有多个角色,一个角色可以被多个用户拥有,一个用户可以拥有多个角色。

三、示例

1、一对一查询

案例:查询所有订单信息,关联查询下单用户信息。 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

数据库:

对应的SQL语句:

select o.id,o.ordername,o.ordercount,s.studentname,s.address from orders o,student s where o.student_id = s.id

用户表student

public class Student {private int id;private String studentName;private String gender;private String address;private String email;private String remark;public Student() {}public Student( String studentName, String gender, String address, String email, String remark) {this.studentName = studentName;this.gender = gender;this.address = address;this.email = email;this.remark = remark;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}}
}

订单表order

public class Order {private int id;private String ordername;private int ordercount;private Student student;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getOrdername() {return ordername;}public void setOrdername(String ordername) {this.ordername = ordername;}public int getOrdercount() {return ordercount;}public void setOrdercount(int ordercount) {this.ordercount = ordercount;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}
}

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xinhua.mapper.StudentMapper"><!--查询出每个用户的信息和对应的所有订单--><resultMap id="studentOrder" type="Student"><id column="id" property="id"></id><result column="studentName" property="studentName"></result><result column="gender" property="gender"></result><result column="address" property="address"></result><collection property="listOrder" ofType="com.xinhua.domain.Order"><id column="order_id" property="id"></id><result column="ordername" property="ordername"></result><result column="ordercount" property="ordercount"></result></collection></resultMap><select id="findStudentOrderAll" resultMap="studentOrder">SELECT s.id,s.studentname,s.gender,s.address,o.id order_id,o.ordername,o.ordercount FROM student s LEFT JOIN Orders o ON s.id=o.student_id</select>
</mapper>

mapper接口类

public interface StudentMapper {public List<Student> findStudentOrderAll();
}

测试类:

public class TestDemo {SqlSessionFactory ssf = null;@Beforepublic void creatFactory(){InputStream input = null;try {input = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException e) {e.printStackTrace();}ssf = new SqlSessionFactoryBuilder().build(input);}@Testpublic void testMapper10() {SqlSession sqlSession = ssf.openSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> students = mapper.findStudentOrderAll();for (Student student : students){System.out.println(student.getId()+","+student.getStudentName()+","+student.getGender()+","+student.getAddress());List<Order> listOrder = student.getListOrder();for (Order order : listOrder){System.out.println("   "+order.getOrdername()+","+order.getOrdercount());}}}

2、一对多查询

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

主查询表:订单表

关联查询表:用户表、订单明细表、商品表

订单表

用户表

商品表

订单明细表 

对应的SQL语句:

 SELECTorders.id o_id,orders.ordername,student.studentname,student.gender,orderdetail.id od_id,orderdetail.items_count,orderdetail.items_all_price ,items.id it_id,items.items_name,items.items_price
FROM ORDERs,student,orderdetail,itemsWHERE orders.student_id = student.idAND orders.id = orderdetail.orders_idAND orderdetail.items_id = items.id

用户表

相比之前一对一,变化在student类多了一个List<Order> orderList

public class Student {private int id;private String studentName;private String gender;private String address;private String email;private String remark;private List<Order> listOrder;public Student() {}public Student( String studentName, String gender, String address, String email, String remark) {this.studentName = studentName;this.gender = gender;this.address = address;this.email = email;this.remark = remark;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public List<Order> getListOrder() {return listOrder;}public void setListOrder(List<Order> listOrder) {this.listOrder = listOrder;}
}

Order

public class Order {private int id;private String ordername;private int ordercount;private Student student;private List<OrderDetail> orderDetailList;public List<OrderDetail> getOrderDetailList() {return orderDetailList;}public void setOrderDetailList(List<OrderDetail> orderDetailList) {this.orderDetailList = orderDetailList;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getOrdername() {return ordername;}public void setOrdername(String ordername) {this.ordername = ordername;}public int getOrdercount() {return ordercount;}public void setOrdercount(int ordercount) {this.ordercount = ordercount;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}
}

商品表items

    private int id;private String items_name;private int items_price;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getItems_name() {return items_name;}public void setItems_name(String items_name) {this.items_name = items_name;}public int getItems_price() {return items_price;}public void setItems_price(int items_price) {this.items_price = items_price;}
}

订单明细表 

public class OrderDetail {private int id;private int items_count;private int items_all_price;private Order order;private List<Items> listItems;public List<Items> getListItems() {return listItems;}public void setListItems(List<Items> listItems) {this.listItems = listItems;}public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getItems_count() {return items_count;}public void setItems_count(int items_count) {this.items_count = items_count;}public int getItems_all_price() {return items_all_price;}public void setItems_all_price(int items_all_price) {this.items_all_price = items_all_price;}
}

OrderMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xinhua.mapper.OrderMapper">
<resultMap id="orderStudentDetailItems" type="com.xinhua.domain.Order"><id column="o_id" property="id"></id><result column="ordername" property="ordername"></result><association property="student" javaType="Student"><result column="studentName" property="studentName"></result><result column="gender" property="gender"></result></association><!-- 一对多关联映射 --><collection property="orderDetailList" ofType="com.xinhua.domain.OrderDetail"><id column="od_id" property="id"></id><result column="items_count" property="items_count"></result><result column="items_all_price" property="items_all_price"></result><collection property="listItems" ofType="com.xinhua.domain.Items"><id column="it_id" property="id"></id><result column="items_name" property="items_name"></result><result column="items_price" property="items_price"></result></collection></collection></resultMap><select id="findOrderStudentDetailItems" resultMap="orderStudentDetailItems">SELECTorders.id o_id,orders.ordername,student.studentname,student.gender,orderdetail.id od_id,orderdetail.items_count,orderdetail.items_all_price ,items.id it_id,items.items_name,items.items_priceFROM ORDERs,student,orderdetail,itemsWHERE orders.student_id = student.idAND orders.id = orderdetail.orders_idAND orderdetail.items_id = items.id</select>
</mapper>

mapper接口类

public interface OrderMapper {public List<Order> findOrderStudentDetailItems();
}

测试类:

public class TestDemo {SqlSessionFactory ssf = null;@Beforepublic void creatFactory(){InputStream input = null;try {input = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException e) {e.printStackTrace();}ssf = new SqlSessionFactoryBuilder().build(input);}@Testpublic void testMapper11() {SqlSession sqlSession = ssf.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = mapper.findOrderStudentDetailItems();for (Order order : orderList){System.out.println(order.getId()+","+order.getOrdername()+","+order.getOrdercount()+","+order.getStudent().getStudentName());List<OrderDetail> orderDetailList = order.getOrderDetailList();for (OrderDetail orderDetail : orderDetailList){System.out.println("   "+orderDetail.getId()+","+orderDetail.getItems_count()+","+orderDetail.getItems_all_price());List<Items> list = orderDetail.getListItems();for (Items listItems : list){System.out.println("        "+listItems.getId()+","+listItems.getItems_name()+","+listItems.getItems_price());}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

/bin/bash: cannot execute binary file

容器内部无法执行二进制文件 原因是docker镜像的 入口点不能指向/bin/bash。移除ENTRYPOINT ["/bin/bash"]就足以使其正常工作。 如果是下载的镜像&#xff0c;不能修改ENTRYPOIN&#xff0c;可以使用dockerfile覆盖掉原来的ENTRYPOINT FROM ubuntu ENTRYPOINT [ …

常见的软件架构风格

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 以下是最常见的建筑风格&#xff1a; 整体式&#xff1a;将整个应用程序构建为一个单元&#xff0c;其中所有功能和组件都从一个位置进行管理和服务。整体架构的例…

使用“反向代理服务器”的优点是什么?

反向代理服务器是一种网络架构模式&#xff0c;通常位于客户端和实际服务器之间&#xff0c;用于处理客户端请求并转发到实际服务器。以下是使用反向代理服务器的优点&#xff1a; 1.安全性&#xff1a;反向代理服务器可以提供额外的安全层。通过在反向代理服务器上配置防火墙和…

Prometheus-blackbox

一. 部署 apiVersion: v1 kind: ConfigMap metadata:name: blackbox-confignamespace: monitor data:blackbox.yml: |-modules:http_2xx: # http 检测模块 Blockbox-Exporter 中所有的探针均是以 Module 的信息进行配置prober: httptimeout: 10shttp:valid_http_versions: […

Android中的Intent

一.显式Intent 显示Intent是明确目标Activity的类名 1. 通过Intent(Context packageContext, Class<?> cls)构造方法 2.通过Intent的setComponent()方法 3.通过Intent的setClass/setClassName方法 通过Intent(Context packageContext, Class<?> cls)构造方法 通…

羊大师解读,羊奶的口味更适合哪些人群?

羊大师解读&#xff0c;羊奶的口味更适合哪些人群&#xff1f; 羊奶作为一种营养丰富的乳制品&#xff0c;拥有许多独特的品质和口味&#xff0c;备受消费者的青睐。它不仅含有丰富的蛋白质、维生素和矿物质&#xff0c;还具有更易消化的特点&#xff0c;适合许多人群的饮用。…

【KingbaseES】实现MySql函数WEEKS_BETWEEN

WEEKS_BETWEEN CREATE OR REPLACE FUNCTION weeks_between(start_date date, end_date date) RETURNS integer AS $$ BEGIN RETURN EXTRACT(WEEK FROM end_date) - EXTRACT(WEEK FROM start_date); END; $$ LANGUAGE plpgsql IMMUTABLE;结果展示

【C语言】stdbool.h——有关bool的总结

在编程和日常生活中&#xff0c;经常需要一种只能具有两个值之一的数据类型&#xff0c;如是否、开关、真假等&#xff0c;因此&#xff0c;C 有一种bool数据类型&#xff0c;称为booleans。布尔值表示 或true的值false。 C 中的 bool 是大多数语言中的基本数据类型&#xff0…

图片上传下载

数据模型: imageUrl: , <el-form-item label"楼盘图片:" prop"pic" class"uploadImg" v-model"emp.pic"> <el-upload class"avatar-uploader" …

自制java工具实现 ctrl+c+c 翻译鼠标选中文本

前言 本功能的实现基于这篇笔记 http://t.csdnimg.cn/1I8ln&#xff0c;本文阅读过程中有疑惑都可以查看此笔记 实现思路&#xff1a;检测到按压ctrl c c 后&#xff0c;获取当前剪切板文字&#xff0c;调用百度翻译api。 实现结果&#xff1a; 完整代码在最后 实现过程 1 监控…

Java中请求生成唯一追溯TraceId

Java中请求生成唯一追溯TraceId 一&#xff1a;背景 因为是微服务架构,平常日志太多,看日志不太好查,所以想要从一整个链路当中获取一个唯一标识,比较好定位问题&#xff0c; 原理就是从gateway网关将标识传递到下游,下游服务拿到这个标识,响应结束后将traceId反向写入响应体…

[论文笔记] Megtron_LM 0、报错:vscode调试无法传进去参数 launch.json文件获取args参数

解决方法&#xff1a; 配置好launch.json文件后&#xff0c;应该点运行和调试里面的运行按钮。而不是直接点文件右上角的debug。 可以看到terminal中&#xff0c;如果没有正常加载launch.json&#xff0c;则参数中没有args的参数。 如果正常加载&#xff0c;可以看到args的很多…

Java中的IO与NIO篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、NIO 的非阻塞二、Channel三、Buffer四、Selector前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、NIO 的非阻塞 I…

C++ OpenGL 3D GameTutorial 1:Making the window with win32 API学习笔记

视频地址https://www.youtube.com/watch?vjHcz22MDPeE&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg 一、入口函数 首先看入口函数main代码&#xff1a; #include<OGL3D/Game/OGame.h>int main() {OGame game;game.Run();return 0; } 这里交代个关于C语法的问题&#x…

释放创造力:可视化页面渲染引擎在低代码开发平台的应用

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 什么是页面渲染引擎? 页面渲染引擎是低代码开发平台的核心组件之一&#xff0c;它负责将开发者设计的页面布局和用户…

计算机网络学习笔记(5)——运输层

本文继续整理计算机网络体系架构知识内容。今日主讲——运输层。 网络层只把分组发送到目的主机&#xff0c;但是真正通信的并不是主机而是主机中的进程。 运输层提供了应用进程间的逻辑通信。运输层向高层用户屏蔽了下面网络层的核心细节&#xff0c;使应用程序看 见的好像在两…

python+selenium爬虫笔记

本文只是做例子&#xff0c;具体网站路径麻烦你们换下&#xff0c;还有xpath路径也换下 一、安装所需要的组件&#xff08;此处采用谷歌&#xff09; 1、安装驱动 查看你的浏览器版本&#xff0c;去安装对应的版本 下载驱动 下载驱动路径 之前版本的 输入这个路径下载下来解压…

TikTok革新游戏规则:解读短视频对社交媒体的影响

在社交媒体的巨浪中&#xff0c;TikTok以其独特的短视频形式和强大的创意社区&#xff0c;重新定义了游戏规则。这个以15秒视频为核心的平台&#xff0c;不仅让用户获得了表达自我的新方式&#xff0c;更深刻地影响了社交媒体的演进。本文将深入解读TikTok对社交媒体的影响&…

支持下载和阅读的漫画管理工具Teemii

什么是 Teemii &#xff1f; Teemii 是一款专为狂热漫画读者设计的精简 Web 应用程序。它为阅读和管理漫画集提供了一个简单而高效的平台。主要功能包括跨平台访问、浏览器内阅读、强大的元数据聚合器以及馆藏自动更新。Teemii 是专为那些寻求更加个性化和自主的方法来管理漫画…

[Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目

前面讲解了通过命令行方式来部署k8s项目,下面来讲讲通过腾讯云TKE来快速创建Pod、Deployment、Service部署k8s项目,云平台搭建Kubernetes可参考[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群 一.通过腾讯云TKE创建集群 1.创建集群 参考上…