MyBatis 高级查询之一对多

描述:有一个商品类,一件商品对应多个图片,在数据库中分别有一个商品表和一个图片表,在显示商品详情的时候,需要查询改图片及其所对应的所有图片。

  • 实体类中的关系
public class Product{
	private Integer id;
    private List<ProductImg> productImgs;
    //省略其他属性...
}
public class ProductImg{
    private Integer id;
    private Integer productId;
    //省略其他属性...
}
  • 数据库中的相对应的表结构
CREATE TABLE `product`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  ...   	...			...
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 79 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

CREATE TABLE `product_img`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NULL DEFAULT NULL COMMENT '商品id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

  • mybatis 实现一对多查询
    • 一对多使用<collection>标签
    • 使用<resultMap>标签,该标签是Mybatis的结果集映射的配置标签
    • 在select标签中写resultMap属性,其值为resultMap标签的id属性值
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="xx.xxx.xxx.ProductDao">
<!-- id 该封装规则的唯一标识,
	type返回值的全限定类名或类型别名
	autoMapping值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在`resultMap`内明确注明映射关系才会调用对应的setter方法。
-->
	<resultMap type="xx.xxx.xxx.Product" id="productMap">
		<id property="id" column="id"></id>
		<result property="..." column="..."></result>
   							 ....
		<!-- 配置product对象里面productImgs集合的映射 
		property对应的是Product中的List<ProductImg>集合的变量名
		ofType对应数据返回的类型ProductImg
		-->
		<collection property="productImgs" ofType="xxx.xxx.xxx.ProductImg(全类名或者是别名)">
		<!--property对应实体类的属性名称,column为数据库字段名-->
			<id property="id" column="id"></id>
			<result property="productId" column="product_id"></result>
						...			...			...
		</collection>
	</resultMap>
	<select id="getById" resultMap="productMap">
		SELECT
		*
		FROM
		product p left outer join product_img pi on p.id = pi.product_id 
		WHERE p.state = 1 AND
		pi.state = 1 AND p.id = #{id}
	</select>
</mapper>
  • 映射结果
[
        {
            "id":58,
           ...
            "productImgs":[
                {
                    "id":16,
                    "productId":58,
                   ...
                },
                {
                    "id":15,
                    "productId":58,
                   ...
                }],
           ...
        },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值