怎么在MyBatis中实现一个一对多嵌套查询功能
创始人
2024-12-28 19:41:39
0次

前言

嵌套查询的实现原理为两次查询,比如产品表为主表,图片表为从表通过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 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 productSelect(DProduct record);
}

产品MyBatis xml:



 
  
  
  
  
  
  
 
 
 
 
 
 
 
 
  
 
 
 
 
 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
 
 
  and d.id = #{id}
 
 
  and d.product_name like concat(#{productName},'%')
 
 
  and d.product_status = #{productStatus}
 
 
  and d.create_time like concat(#{createTime},'%')
 
 
  and d.product_introduction like concat(#{productIntroduction},'%')
 

图片MyBatis xml:


 
  
  
  
  
 
 
 
  select i.id as did,
    i.product_id,
    i.img,
    i.create_time
  from d_img i
  where i.product_id = #{productId}
 

测试查询结果

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

 			{
 				"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"
     }
    ]
   },

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...