MyBatis一对多嵌套查询的完整实例
作者:LiAo_01 时间:2023-07-12 02:49:56
前言
嵌套查询的实现原理为两次查询,比如产品表为主表,图片表为从表通过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
标签:mybatis,一对多,嵌套查询
0
投稿
猜你喜欢
Android 安全加密:Https编程详解
2023-11-08 06:58:51
利用Python+Java调用Shell脚本时的死锁陷阱详解
2023-01-10 13:40:20
Java sleep方法及中断方式、yield方法代码实例
2023-10-22 10:59:49
基于Java Springboot + Vue + MyBatis实现音乐播放系统
2023-07-09 16:01:41
Android UI控件Switch的使用方法
2023-01-28 13:41:15
分析Java设计模式之组合模式
2023-11-25 13:13:30
C++初阶教程之类和对象
2021-07-24 18:53:46
C#制作简单的多人在线即时交流聊天室
2023-02-23 12:12:23
如何在Mac下配置多个Java版本
2023-11-07 05:14:34
新手了解java 数组基础知识
2023-10-22 03:19:12
详解Java环境变量配置方法(Windows)
2022-05-09 02:39:33
浅谈String.split()遇到空字符串的几种情况
2021-11-24 00:18:38
springmvc用于方法鉴权的注解拦截器的解决方案代码
2022-06-02 10:30:18
详解JAVA 抽象类
2022-12-15 19:29:20
Kotlin中的5种单例模式示例详解
2022-03-01 22:51:58
基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]
2022-02-04 00:41:18
MAC配置java+jmeter环境变量过程解析
2021-09-30 00:16:23
谈C# using的用法与好处
2022-02-10 08:20:01
C#使用StopWatch获取程序毫秒级执行时间的方法
2023-12-21 02:44:06
使用HandlerMethodArgumentResolver用于统一获取当前登录用户
2023-04-20 12:09:16