MyBatis一对多嵌套查询的完整实例

 更新时间:2021年01月17日 12:40:51   作者:LiAo_01  
这篇文章主要给大家介绍了关于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"
     }
    ]
   },

总结

到此这篇关于MyBatis一对多嵌套查询的文章就介绍到这了,更多相关MyBatis一对多嵌套查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中如何用Stream分组并求各组数量

    Java中如何用Stream分组并求各组数量

    这篇文章主要给大家介绍了关于Java中如何用Stream分组并求各组数量的相关资料,文中通过实例代码,对大家学习或者Java具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java字符缓冲流面试精讲

    java字符缓冲流面试精讲

    这篇文章主要为大家介绍了java中字符缓冲流面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 详解Java语言中一个字符占几个字节?

    详解Java语言中一个字符占几个字节?

    这篇文章主要介绍了Java语言中一个字符占几个字节,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java中IO流解析及代码实例详解

    Java中IO流解析及代码实例详解

    流是一种抽象概念,它代表了数据的无结构化传递。。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出
    2021-08-08
  • mybatis调用mysql存储过程并获取返回值方式

    mybatis调用mysql存储过程并获取返回值方式

    这篇文章主要介绍了mybatis调用mysql存储过程并获取返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • eclipse下配置Spring环境的方法步骤

    eclipse下配置Spring环境的方法步骤

    这篇文章主要介绍了eclipse下配置Spring环境的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • springboot项目拦截器重定向循环问题的解决

    springboot项目拦截器重定向循环问题的解决

    这篇文章主要介绍了springboot项目拦截器重定向循环问题的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 5分钟教你使用java搞定网站登录验证码

    5分钟教你使用java搞定网站登录验证码

    这篇文章主要为大家介绍了使用java搞定网站登录验证码的快速实现方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • java实现京东秒杀功能分享 京东秒杀软件

    java实现京东秒杀功能分享 京东秒杀软件

    这篇文章主要介绍了秒杀京东手机的程序,实现了下面三个功能,大家参考使用吧
    2014-01-01
  • SpringCloud中Eureka的配置及使用讲解

    SpringCloud中Eureka的配置及使用讲解

    Eureka 服务注册中心,主要用于提供服务注册功能,当微服务启动时,会将自己的服务注册到 Eureka Server,这篇文章主要介绍了SpringCloud中Eureka的配置及详细使用,需要的朋友可以参考下
    2023-01-01

最新评论