MyBatis一对多嵌套查询的完整实例
作者:LiAo_01 发布时间:2023-07-12 02:49:56
标签: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">
select
d.id,
d.product_name,
d.product_category,
d.product_status,
d.create_time,
d.product_introduction
from d_product d
where 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_time
from d_img i
where 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"
}
]
},
来源:https://blog.csdn.net/weixin_44560583/article/details/112662442


猜你喜欢
- 大白话讲解:从广义上 Spring 注解可以分为两类:一类注解是用于注册 Bean假如 IoC 容器是一间空屋子,首先这间空屋子啥都没有,我
- 前言每种语言都会有字符串的操作,因为字符串是我们平常开发使用频率最高的一种类型。今天我们来聊一下Java的字符串操作及在某些具体方法中与C#
- 前言想象一下生活中哪些是和线程沾边的?饭店炒菜就是一个很好的例子首先客人要吃菜,前提是厨师要炒好,也就是说,厨师不炒好的话客人是没有饭菜的。
- 定义JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动
- 1. 传统方式:在内存中读取文件内容读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速
- 用户关闭软件时,软件一般会给“是否确认关闭”的提示。通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭;否则把FormC
- 想要实现一个功能:同一个用户在两个不同的浏览器中登录,后面的踢掉之前的登录。本来的思路是在httpSession * 中进行判断。但是在使用
- Vitamio是一个功能强大而稳定的播放器库,它支持多种视频格式和编解码方式,并且具有快速、流畅的播放效果,因此在一些对播放质量要求比较高的
- 意义:由于每个应用进程都有自己的独立进程空间,在android平台上,一个进程通常不能访问另一个进程的内存空间,而我们经常需要夸进程传递对象
- 全局配置无效依赖 <dependency> &n
- 目录一 、EasyExcel简介二、常用注解三、依赖四、监听五、接口导入Excel六、接口 导出Excel (HttpServletResp
- 主要思想:将一个view设计成多层:背景层,含中奖信息等;遮盖层,用于刮奖,使用关联一个Bitmap的Canvas在该Bitmap上,使用它
- 基于jsr303 通过自定义注解实现,实现思路:存在一些瑕疵,后续补充完善。加入依赖部分版本已不默认自动引入该依赖,选择手动引入<de
- 可能有些同学不明白,为啥要图片反转(不是旋转哦),我们在游戏开发中,为了节省图片资源(空间) 有可能会使用到图片反转,例如,一个人物图片,面
- 问题在讨论原子性操作时,我们经常会听到一个说法:任意单个volatile变量的读写具有原子性,但是volatile++这种操作除外。所以问题
- 重载:方法名相同,但参数不同的多个同名函数注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同2.返回值和异常以及访问修饰符
- 写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的一些理解。这
- 以下摘自胖哥分享的 2022开工福利教程。在学习Spring Security的时候你有没有下面这两个疑问:Spring Security的
- @TransactionalEventListener监听事务项目背景最近在项目遇到一个问题A方法体内有 INSERT、UPDATE或者DE
- java操作json对象出现StackOverflow错误今天在做项目的时候,遇到一个非常怪异的问题。一个java实体类中存在多个属性,每一