mybatis collection_MyBatis之关联查询

前言

我们进行数据库查询时往往需要的不止一张表的数据,需要将多张表的数据一起查询出来,大家学习过数据库的连接查询,那么在MyBatis中如何将有关系的多张表数据进行关联查询呢。

表的结构

商品和订单是典型的一对多关系,下面的案例我们将以商品表和订单表作为示例,演示如何配置最常见的一对多关系,下面是两张表的结构:

商品表:

eefca9003be49f52a2f6a62c9a654084.png

订单表:

4ed410972bdee4a045c58871be69f69c.png

实体类的设计

一种商品有多个订单,每个订单对应一种商品,在实体类中体现这个关系。

订单实体类:

/** * 订单类 */public class Order { private Integer id; private Integer num; private Integer goodsId; private String time; /** * 订单对应的商品对象 */ private Goods goods;

商品实体类:

/** * 商品类 */public class Goods { private Integer id; private String name; private Double price; private String address; /** * 订单集合 */ private List<Order> orders;

Mapper接口设计

这里我们只介绍关联查询,所以只定义了基本的查询方法

/** * 商品接口 */public interface GoodsDAO{ //根据编号查询商品 Goods selectById(int id);}

/** * 订单接口 */public interface OrderDAO{ //根据订单id查询订单 Order selectById(int orderId); //根据商品id查询订单 List<Order> selectByGoodsId(int goodsId);}

collection标签

接下来就是重点了,我们在商品类中定义了订单集合属性orders,那么这个集合的数据如何进行查询呢?这就需要我们在mapper文件中使用collection标签。

collection标签用在resultMap标签中,用于配置集合的查询,用法是:

<collection property="集合属性名" column="传入查询方法的列名" select="查询集合所调用的方法"/>

示例:

<?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是设置对应的DAO接口--><mapper namespace="com.qianfeng.mybatis01.dao.GoodsDAO">

<!--配置数据库返回结果映射--> <resultMap id="goodsMap" type="com.qianfeng.mybatis01.entity.Goods"> <!--id用于配置主键,property是实体类的属性名,column是表中的字段名--> <id property="id" column="goods_id"></id> <!--result配置主键外其他列--> <result property="name" column="goods_name"></result> <result property="price" column="goods_price"></result> <result property="address" column="goods_address"></result> <!--配置订单集合--> <collection property="orders" column="goods_id" select="com.qianfeng.mybatis01.dao.OrderDAO.selectByGoodsId"/> </resultMap> <select id="selectById" parameterType="int" resultMap="goodsMap"> select * from tb_goods where goods_id = #{id} </select></mapper>

collection的意思是:

当商品对象需要orders集合时,就会调用OrderDAO的selectByGoodsId按商品id查询所有订单,商品id就是当前商品的goods_id值。

association标签

association标签的用法类似于collection,用于配置一对一的关系,每个订单中有一个商品对象goods,这个对象查询可以用association来进行配置。

用法:

<association property="对象属性名" column="传入查询方法的列名" select="查询对象所调用的方法"/>

示例:

<?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是设置对应的DAO接口--><mapper namespace="com.qianfeng.mybatis01.dao.OrderDAO"> <!--配置数据库返回结果映射--> <resultMap id="orderMap" type="com.qianfeng.mybatis01.entity.Order"> <!--id用于配置主键,property是实体类的属性名,column是表中的字段名--> <id property="id" column="order_id"></id> <!--result配置主键外其他列--> <result property="num" column="order_num"></result> <result property="goodsId" column="order_goods_id"></result> <result property="time" column="order_time"></result> <!--配置商品对象映射--> <association property="goods" column="order_goods_id" select="com.qianfeng.mybatis01.dao.GoodsDAO.selectById"/> </resultMap> <select id="selectById" parameterType="int" resultMap="orderMap"> select * from tb_order where order_id = #{id} </select> <select id="selectByGoodsId" parameterType="int" resultMap="orderMap"> select * from tb_order where order_goods_id = #{goodsId} </select></mapper>

association的意思是:

当订单对象需要goods对象时,就调用GoodsDAO的selectById按商品id查询商品,此商品id就是订单中的外键列order_goods_id。

单元测试

@Testpublic void testGoodsAndOrders(){ GoodsDAO goodsDAO = MyBatisUtils.getSession().getMapper(GoodsDAO.class); //查询商品 Goods goods = goodsDAO.selectById(1); System.out.println("查询商品:"+goods); //获得商品所有的订单 goods.getOrders().stream().forEach((order)->System.out.println("商品的订单"+order)); OrderDAO orderDAO = MyBatisUtils.getSession().getMapper(OrderDAO.class); //查询订单 Order order = orderDAO.selectById(4); System.out.println("查询订单"+order); //获得订单对应的商品 System.out.println("订单的商品:" + order.getGoods());}

运行结果:

查询商品:Goods{id=1, name='小米9手机', price=2000.0, address='上海'}

商品的订单Order{id=1, num=2, goodsId=1, time='2019-9-12'}

商品的订单Order{id=4, num=4, goodsId=1, time='2019-9-14'}

查询订单Order{id=4, num=4, goodsId=1, time='2019-9-14'}

订单的商品:Goods{id=1, name='小米9手机', price=2000.0, address='上海'}

总结

MyBatis中配置表的关联关系,需要在resultMap中配置collection或association标签

collection配置的是一对多关系,property属性是集合的名称,select配置的是查询集合的方法,column配置查询方法的参数对应的列名

association配置的是一对一关系,property属性是对应对象的名称,select配置的是查询集合的方法,column配置查询方法的参数对应的列名

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

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

相关文章

项目经理职责

一位在软件企业的朋友抱怨说公司的项目经常失控,客户意见非常大.由于我在一家软件外企负责PMO(项目管理办公室),他期望我能够推荐一些项目经理&#xff0c;职责要求是:1)领导项目团队&#xff0c;制定工作计划&#xff1b;2)需求分析;3)数据库设计4)系统设计&#xff1b;5)搭建…

mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下对于一些数据量较大的系统&#xff0c;数据库面临的问题除了查询效率低下&#xff0c;还有就是数据入库时间长。特别像报表系统&#xff0c;每天花费在数据…

数组 参数传递

/************************作者:张平*创建日期:2009 04 07*功能:************************//*void main(){ char str1[30]{"Peoples Republic of "}; char str2[]{"China"}; int a[2][3]{{1,2,3},{4,5,6}}; int b[3][2],i,j; printf("array a:\n&quo…

不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然

很多时候&#xff0c;要求文档要有目录&#xff0c;比如书籍/杂志/论文/标书等等。目录可以让文档结构一目了然。如果不了解 Word &#xff08;包括 Microsoft Office 和 WPS Office 下的Word&#xff09;操作&#xff0c;目录的各标题及对应页码可能是手动一个一个码上去。其实…

合成/聚合原则: 桥接模式

假想场景&#xff1a;hp和apple是全球知名的电脑生产厂家&#xff0c;起初他们各自的电脑操作系统分别是linux和macintosh&#xff0c;microsoft是软件行业的龙头。为了吸引更多客户购买电脑&#xff0c;hp和apple请ms为他们开发两款最常用的软件&#xff0c;办公软件和及时通讯…

java查看jdk源码_Java-如何查看JDK源码

一、引言学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档&#xff0c;然而&#xff0c;开发文档只是开发者对Java代码的功能做出简略的说明&#xff0c;它只是告诉你这个类能干嘛&#xff0c;并没告诉你这个类怎么干&#xff0c;所以&#xff0c;阅读Java源码是每个开…

arrays中copyof复制两个数组_数据结构与算法(3)数组

前言数组(Array)是一种线性表数据结构&#xff0c;利用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。概念介绍首先我们说一下什么是线性表&#xff0c;线性表就是数据排成一条线的数据结构&#xff0c;每个线性表最多只有前和后两个方向&#xff0c;数组、链表、…

java做的一个将中文转换成Unicode码的工具类【转载】做个标记,明天研究下

这两天在使用RBManager&#xff08;一个开源工具&#xff0c;用于多国化字符转化&#xff09;工具的时候觉得很不方便&#xff0c;有的时候只需要知道中文对应的unicode码是多少&#xff0c;不需要这么麻烦的操作&#xff0c;所以就自己写了一个工具&#xff0c;专门用于将中文…

java lambda 实现_Java 8 Lambda实现原理分析

PDF文档已上传Github为了支持函数式编程&#xff0c;Java 8引入了Lambda表达式&#xff0c;那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后&#xff0c;到底会生成什么东西呢?在没有深入分析前&#xff0c;让我们先想一想&#xff0c;Java 8中每一…

unity game和scene效果不一样_KTV装修设计:如何让消费者体验到不一样的KTV娱乐效果...

现代KTV装修设计要尽显奢华与高贵,但起到吸引消费者的却是浓烈的欢快氛围和愉悦的歌唱体验.KTV想要有一个好的装修效果,需要了解各方面的细节问题.下面怡元小编讲述如何设计能让消费者体验到不一样的KTV娱乐效果?1、氛围设计在KTV装修设计中,氛围设计非常考究,尤其是消费者进入…

SQL學習

1.模糊表名的联合查询..create table tz2008_1_1(id int,name varchar(50))insert into tz2008_1_1 select 1,acreate table tz2008_1_2(id int,name varchar(50))insert into tz2008_1_2 select 2,bcreate table tz2008_1_3(id int,name varchar(50))insert into tz2008_1_3 s…

feather 设置坐标刻度_Matlab中将坐标轴放在原点位置

转载一篇文章&#xff0c;原文链接&#xff1a;https://blog.csdn.net/xiaobiyin9140/article/details/84519419​blog.csdn.net需求使用matlab画图&#xff1a;设置y轴位置&#xff0c;使y轴在x轴的中间示例画一个sigmoid函数MATLAB代码x-10:0.1:10; ysigmf(x,[1 0]); plot(…

hana数据库导入mysql_【SAP HANA】新建表以及操作数据(3)

账号和数据库都创建好之后&#xff0c;接下来就可以创建表了。来见识一下这个所谓“列式”存储方式的表是长啥样的&#xff01;一、可视化新建表然后输入所需栏位&#xff0c;设置好类型和长度&#xff1a;上图右上角可以看到类型是Column Store&#xff0c;代表列式存储&#…

(转)Asp.net 中 Get和Post 的用法

单form的提交有两种方式&#xff0c;一种是get的方法&#xff0c;一种是post 的方法.看下面代码,理解两种提交的区别: <form id"form1" method"get" runat"server"> <div> 你的名字<asp:TextBox ID"name" ru…

matlab lu分解求线性方程组_计算方法(二)直接三角分解法解线性方程组

封面是WH2里春希在编辑部的上司麻理前辈&#xff0c;有一说一&#xff0c;这条线的第一次H有点恶趣味&#xff0c;不是很喜欢。一&#xff1a;概述矩阵分解我学过的挺多种&#xff0c;比如极分解&#xff0c;谱分解&#xff0c;满秩分解&#xff0c;正交三角分解还有这里的直接…

java pdf添加图片水印图片_Java 在PDF中添加文本水印、图片水印

(推荐)方式1&#xff1a;创建Maven项目程序&#xff0c;通过maven仓库下载导入。以IDEA为例&#xff0c;新建Maven项目&#xff0c;在xml文件中配置maven仓库路径&#xff0c;并指定spire.cloud.sdk的依赖&#xff0c;如下&#xff1a;com.e-icebluecloudhttp://repo.e-iceblue…

html弹出保存文件对话框_有没有遇到过CAD文件损坏或打不开的情况?养成这个习惯很重要...

经常使用CAD制图&#xff0c;难免会遇到CAD文件损坏或者打不开的情况&#xff0c;遇到这种情况&#xff0c;我们会想尽办法来恢复文件&#xff0c;而最有效的办法之一就是从备份文件中恢复我们的图形&#xff0c;因此在制图过程中&#xff0c;我们应养成备份的好习惯&#xff0…

用javascript读取xml,并进行修改xml数据,解决保存没有权限问题

从 fsdy2000&#xff08;乡愁&#xff09;提供的方法获得思路&#xff0c;参考公司web gis 脚本实现 http://topic.csdn.net/t/20060105/15/4499889.html可以这样&#xff1a; 在脚本中修改xml文档后。再用xmlhttp进行页面申请。 xmlhttp new Acti…

linux java uml_简单实用UML关系图解

一句话UML&#xff0c;再记不住就要DPP了&#xff1a;关系图解代码备注1&#xff1a;继承关系(Generalization)2&#xff1a;实现关系(Realization)3&#xff1a;依赖关系(Dependency)方法的参数、局部变量、返回值4&#xff1a;关联关系(Association)互为类属性5&#xff1a;方…

python接口和抽象类的区别_接口和抽象类有什么区别?

最近团队在招人&#xff1a;阿里新零售事业群CBU技术部招Java高级&专家&#xff0c;团队主要负责B2B工业品牌业务&#xff0c;坐标杭州滨江&#xff0c;有兴趣的小伙伴私戳我。 ******************************************** 以下是原文&#xff1a; 本身的设计目的就是不…