MyBatis 一对多结果集嵌套查询

嵌套查询的实现原理为两次查询,比如产品表为主表图片表为从表通过product_id字段与产品表id字段关联实现一对多,嵌套查询 首先查询 主表的数据 然后将主表id字段赋值给从表实体类中product_id 字段(productId)然后通过dao接口路径映射找到对应的MyBatis XMl文件SQL语句ID如:com.liao.dao.DImgMapper.selectDImgByProductId 进行子查询也就是第二次查询。然后返回数据

数据库建表语句和测试数据如下:

数据库版本为 MySQL 8.0

产品表

DROP TABLE IF EXISTS `d_product`;
CREATE TABLE `d_product`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '产品ID',`product_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '产品名称',`product_introduction` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT '产品介绍',`product_category` int(11) NULL DEFAULT NULL COMMENT '产品ID',`product_status` int(1) NULL DEFAULT NULL COMMENT '产品状态',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '产品表' ROW_FORMAT = Dynamic;INSERT INTO `d_product` VALUES (1, '测试产品名称修改', '测试产品介绍修改', NULL, 1, '2020-02-02 12:40:06');
INSERT INTO `d_product` VALUES (2, '产品名称', '产品介绍', NULL, 1, '2020-03-02 18:15:07');
INSERT INTO `d_product` VALUES (3, 'bbb', 'bbb', NULL, 1, '2020-03-01 22:18:40');

图片表

DROP TABLE IF EXISTS `d_img`;
CREATE TABLE `d_img`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`product_id` int(11) NULL DEFAULT NULL COMMENT '产品图片ID',`img` varchar(500) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '图片',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`) USING BTREE,INDEX `product_id`(`product_id`) USING BTREE,CONSTRAINT `d_img_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `d_product` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 86 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '产品图片' ROW_FORMAT = Dynamic;INSERT INTO `d_img` VALUES (40, 1, '1491803633034_683819.jpg', '2020-03-03 17:21:20');
INSERT INTO `d_img` VALUES (40, 1, '1491803633034_683819.jpg', '2020-03-03 17:21:20');
INSERT INTO `d_img` VALUES (41, 1, '1568950881751_702421.jpg', '2020-03-03 17:21:20');

Java实体类:

// 将这个注解写在类上之后,就会忽略类中不存在的字段,否则可能会报错
@JsonIgnoreProperties(value = {"handler"})
/*** * TODO: 产品类* @author LiAo* @date 2020/5/20 17:04*/
public class DProduct {private Integer id;private String productName;private Integer productCategory;private Integer productStatus;private Date createTime;private String productIntroduction;private List<DImg> dImgs;     // 用于存放图片集合// .. get set toString
}/*** * TODO: 产品图片类* @author LiAo* @date 2020/5/20 17:05*/
@JsonIgnoreProperties(value = {"handler"})
public class DImg {private Integer id;private Integer productId;private String img;private Date createTime;// .. get set toString
}

实体类创建好后要编写Dao接口 和Mapper XML了

持久层接口DAO:

/**** TODO: 产品 Dao接口* @author LiAo* @date 2020/5/20 17:08*/
public interface DProductMapper {/*** 产品图片一对多嵌套* @param record 查询条件* @return 返回参数*/List<DProduct> productSelect(DProduct record);
}

产品MyBatis xml:

<!--映射的Dao接口类 可以通过这个路径找到先关的SQL语句和resultMap 映射-->
<mapper namespace="com.liao.dao.DProductMapper"><resultMap id="BaseResultMap" type="com.liao.entity.DProduct"><id column="id" property="id" jdbcType="INTEGER"/><result column="product_name" property="productName" jdbcType="VARCHAR"/><result column="product_category" property="productCategory" jdbcType="INTEGER"/><result column="product_status" property="productStatus" jdbcType="INTEGER"/><result column="create_time" property="createTime" jdbcType="TIMESTAMP"/><result column="product_introduction" property="productIntroduction" jdbcType="LONGVARCHAR"/></resultMap><!--产品图片一对多查询映射--><!--id:配置映射的名称--><!--type:返回值类型 --><!--extends:继承id为BaseResultMap的映射 --><!--select:子查询所在的XML绑定的DAO接口路径.SQL语句id --><!--column="{productId = id} productId:从表关联主表的实体类属性,作为子查询的条件  id:主表中被关联的数据库字段--><resultMap id="dProductResultMap" type="com.liao.entity.DProduct" extends="BaseResultMap"><collection property="dImgs" fetchType="lazy"select="com.liao.dao.DImgMapper.selectDImgByProductId" column="{productId = id}"/></resultMap><!--查询语句--><select id="productSelect" parameterType="com.liao.entity.DProduct" resultMap="dProductListMapSelect">selectd.id,d.product_name,d.product_category,d.product_status,d.create_time,d.product_introductionfrom d_product dwhere 1 = 1<!-- 使用if标签拼接条件语句 实现动态SQL--><if test="id != null and id != ''">and d.id = #{id}</if><if test="productName != null and productName != ''">and d.product_name like concat(#{productName},'%')</if><if test="productStatus != null and productStatus != ''">and d.product_status = #{productStatus}</if><if test="createTime != null and createTime != ''">and d.create_time like concat(#{createTime},'%')</if><if test="productIntroduction != null and productIntroduction != ''">and d.product_introduction like concat(#{productIntroduction},'%')</if>
</select>
</mapper>

图片MyBatis xml:

<mapper namespace="com.liao.dao.DImgMapper"><resultMap id="BaseResultMap" type="com.liao.entity.DImg"><id column="did" property="id" jdbcType="INTEGER"/><result column="product_id" property="productId" jdbcType="INTEGER"/><result column="img" property="img" jdbcType="VARCHAR"/><result column="create_time" property="createTime" jdbcType="TIMESTAMP"/></resultMap><!--一对多嵌套查询 子查询语句--><select id="selectDImgByProductId" resultMap="BaseResultMap">select i.id as did,i.product_id,i.img,i.create_timefrom d_img iwhere i.product_id = #{productId}</select>
</mapper>

测试查询结果
查询结果为一个产品对象里有若干个产品图片对象。

             {"id": 18,"productName": "产品添加图片上传测试","productCategory": null,"productStatus": 1,"createTime": "2020-04-14T13:40:40.000+0000","productIntroduction": "产品添加图片上传测试","dImgs": [{"id": 92,"productId": 18,"img": "01.jpg","createTime": "2020-04-26T02:33:04.000+0000"},{"id": 93,"productId": 18,"img": "1554103835292_610234.jpg","createTime": "2020-04-26T02:33:04.000+0000"},{"id": 94,"productId": 18,"img": "1555484699771_582172.jpg","createTime": "2020-04-26T02:33:04.000+0000"},{"id": 95,"productId": 18,"img": "1554103835292_610234.jpg","createTime": "2020-04-26T02:33:04.000+0000"}]},

MyBatis 一对多嵌套查询相关推荐

  1. mybatis使用collection嵌套查询

    在开发中,可能会遇到一对多的关系,这个时候,一条sql语句就难以胜任这个任务了.只能先执行一条sql,然后根据返回的结果,再做一次sql关联查询,这个时候,使用mybatis的collection就可 ...

  2. java mybatis多层collection嵌套查询

    java mybatis多层collection嵌套查询 1.实体 package com.humi.iem.common.model.equipment;import io.swagger.anno ...

  3. mybatis一对多关联查询两种方式

    mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...

  4. mybatis一对多关联查询_一对一,一对多,多对多查询及延迟加载(N+1问题)分析

    推荐学习 重识SSM,"超高频面试点+源码解析+实战PDF",一次性干掉全拿走 全网独家的"MySQL高级知识"集合,骨灰级收藏,手慢则无 "吃&qu ...

  5. mybatis collection column 嵌套查询

    mybatis  嵌套查询 使用可行案例 collection定义关联集合类型的属性的封装规则 ofType:指定集合里面元素的类型 collection中的column属性是数据库中的列名,或着是列 ...

  6. Mybatis一对多分页查询问题

    一.背景引入 Mybatis提供了处理结果集的标签,其中子标签collection可以处理1对多的映射 <resultMap><collection></collecti ...

  7. Mybatis一对多关联查询,返回值Map,字段自动映射

    功能描述 由于查询字段和表名都要支持动态配置,故查询返回值需要为List<Map<String,Object>>,不定义值对象. 查询结果列需要支持自动映射,不配置类属性和数据 ...

  8. mybatis一对多关联查询_Mybatis 一对一、一对多的关联查询 ?

    <mapper namespace="com.lcb.mapping.userMapper"> <!--association 一对一关联查询 --> &l ...

  9. mybatis一对多关联查询将结果封装到嵌套list

    DishDto中有个List集合保存DishFlavor对象,DishFlavor根据关联查询获得,一个dish对应多个dishflavor.想要联合查询自动将DishFlavor封装成集合需要用co ...

最新文章

  1. Javascript基础知识 - 基础部分
  2. 基于VTK的MFC应用程序开发(3)
  3. 简单弄一个-个人主页
  4. MongoDB的基本shell操作(三)
  5. Python操作mySql数据库封装类
  6. docker 守护进程
  7. 如何使用Linux重置Windows密码
  8. element ui border表头设置背景颜色
  9. 学习总结——工作中的性能测试完整过程
  10. ireport怎么套打_柳州男孩小指被螺母套牢,还有熊娃被卡进这地方!消防员笑抽,网友:日常打“卡”...
  11. Python yield 的基本概念和用法
  12. npm i 报错 'match' of undefined 错误以及删除node_modules失败
  13. iOS开发音频格式转换
  14. Vue学习记录(三)——脚手架的使用和Vuex
  15. 中国程序员鼓励师都干啥? 美媒:按摩谈心样样通
  16. MFC中Wnd.PostMessage()的作用
  17. Python的Mann-Kendall非参数检验和计算Hurst指数
  18. Cannot read property ‘$message‘ of undefined
  19. h5调用Android 的方法
  20. 初学C++之——do while循环语句

热门文章

  1. 五分钟学会 Spring Boot Admin:微服务应用监控(小白必看,一看就会教程)
  2. python画一条竖直的直线_python – 动态地向matplotlib图添加一条垂直线
  3. Android百度地图开发(二)定位之自动定位及标注(及定位几日内瓦或坐标4.9E-324问题)
  4. html协议中目标端口,ICMP数据包的过滤主要基于()A、目标端口B、源端口C、消息源代码D、协议prot...
  5. 首届中国智慧交通大会上,5000万用户的“乘车码”成了主角
  6. Apache Flume
  7. 22年抖音小店蓝海项目,操作流程分享,建议收藏!
  8. 数据结构-实验1 顺序表
  9. Java网络爬虫小案例(详细版)
  10. 公众号文章中怎么添加承诺书附件下载?