OneToMany 查询

一对多查询

需求场景

tgoods中每一个商品(goodsid 字段)在 t_goods_detail 中对对应了多个商品详情(gd_pic_url 字段), 如何通过goods_id 查询到其对应的多个 gd_pic_url 字段呢?

创建 GoodsDetail 实体类

创建MyBatis\src\main\java\indi\chester\mybatis\entity\GoodsDetail.java. 成员变量即为 t_goods_detail 表内经过驼峰转换后的字段名

package indi.chester.mybatis.entity;

public class GoodsDetail {
    private Integer gdId;
    private Integer goodsId;
    private String gdPicUrl;
    private Integer gdOrder;
    

    public Integer getGdId() {
        return gdId;
    }

    public void setGdId(Integer gdId) {
        this.gdId = gdId;
    }

    public Integer getGoodsId() {
        return goodsId;
    }

    public void setGoodsId(Integer goodsId) {
        this.goodsId = goodsId;
    }

    public String getGdPicUrl() {
        return gdPicUrl;
    }

    public void setGdPicUrl(String gdPicUrl) {
        this.gdPicUrl = gdPicUrl;
    }

    public Integer getGdOrder() {
        return gdOrder;
    }

    public void setGdOrder(Integer gdOrder) {
        this.gdOrder = gdOrder;
    }
}

Goods 实体类中增加存储 GoodsDetail 对象的列表

MyBatis\src\main\java\indi\chester\mybatis\entity\Goods.java中添加下面这个成员属性, 并为其设置 getter 和 setter 方法:

    private List<GoodsDetail> goodsDetailList;

    public List<GoodsDetail> getGoodsDetailList() {
        return goodsDetailList;
    }

    public void setGoodsDetailList(List<GoodsDetail> goodsDetailList) {
        this.goodsDetailList = goodsDetailList;
    }

添加 selectOneToMany 标签

MyBatis\src\main\resources\mappers\goods.xml 添加下面两个标签:

    <!-- 将SELECT * FROM t_goods LIMIT 0,1 的结果转换为一个个Goods 对象, 然后将goods_id传入到
    goodsDetail.selectByGoodsId 中的查询语句进行查询,查询结果放回到 goodsDetailList-->
    <resultMap id="rmGoods1" type="indi.chester.mybatis.entity.Goods">
        <id column="goods_id" property="goodsId"/> <!-- 这一句也可以不写 -->
        <collection property="goodsDetailList" select="goodsDetail.selectByGoodsId"
                    column="goods_id"/>
    </resultMap>
    <select id="selectOneToMany" resultMap="rmGoods1">
        SELECT * FROM t_goods LIMIT 0,1;
    </select>

创建goods_detail.xml

创建 MyBatis\src\main\resources\mappers\goods_detail.xml

<?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="goodsDetail">
    
    <select id="selectByGoodsId" parameterType="Integer" resultType="indi.chester.mybatis.entity.GoodsDetail">
        SELECT  * FROM  t_goods_detail WHERE goods_id = #{value}
    </select>
    
</mapper>     

xml</mapper​

并在D:\introJava\MyBatis\src\main\resources\mybatis-config.xml的 <mappers> 标签下将 goodsdetail.xml 加入进去。

    <mappers>
        <mapper resource="mappers/goods.xml" />
        <mapper resource="mappers/goods_detail.xml" />
    </mappers>

修改 MyBatisTest.java

MyBatis\src\test\java\MyBatisTest.java 下添加这个方法:

    @Test
    public void testOneToMany () throws Exception{
        SqlSession sqlSession=null;
        try {
            sqlSession=MyBatisUtils.openSession();
            List<Goods> list= sqlSession.selectList("goods.selectOneToMany");
            for (Goods goods:list){
                System.out.println(goods.getTitle()+":"+ goods.getGoodsDetailList().size());
            }

        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            MyBatisUtils.closeSession(sqlSession);
        }
    }

这个方法也就是选中一个商品, 根据它的 goods_id 查询到它对应的 多个 gd_pic_url 并且 存储到 Goods 对象的 goodsDetailList 当中。最后将goodsDetailList 的 size 打印出来,以证明确实查询到了多个 gd_pic_url。

运行结果:

12:03:32:981 [main]  DEBUG goods.selectOneToMany -==>  Preparing: SELECT * FROM t_goods LIMIT 0,1;  
12:03:33:019 [main]  DEBUG goods.selectOneToMany -==> Parameters:  
12:03:33:043 [main]  DEBUG goodsDetail.selectByGoodsId -====>  Preparing: SELECT * FROM t_goods_detail WHERE goods_id = ?  
12:03:33:043 [main]  DEBUG goodsDetail.selectByGoodsId -====> Parameters: 739(Integer) 
12:03:33:051 [main]  DEBUG goodsDetail.selectByGoodsId -<====      Total: 14 
12:03:33:055 [main]  DEBUG goods.selectOneToMany -<==      Total: 1 
亲润 孕妇护肤品豆乳大米盈润保湿胶原蚕丝面膜(18片装):14

Last updated