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
  • asp之家 软件编程 m.aspxhome.com