MyBatis之OneToMany对象关联查询

1 对多关联查询

创建t_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="com.mybatis.entity.GoodsDetail">
        select * from t_goods_detail where goods_Id = #{value}
    </select>
</mapper>

在goods.xml中添加一个select标签

    <!--    在对象关联的情况下是通过resultMap这个标签来实现的
        resultMap可用于说明一对多或者多对一的映射逻辑
        id是resultMap属性引用的标志
        type是指向One的实体(Goods)
    -->
    <resultMap id="rmGoods1" type="com.mybatis.entity.Goods">
        <!--  映射goods对象的主键到goods_Id字段  -->
        <id column="goods_Id" property="goodsId"/>
        <!--
             collection 的含义是,在
             select * from t_goods limit 0.1 得到结果后,对所有Goods对象遍历得到goods_id字段值,
             并代入到goodsDetail命名空间的findByGoodsId的SQL中的执行查询。
             将得到的“商品详情”集合赋值给goodsDetails list对象
             -->
        <collection property="goodsDetail" select="goodsDetail.selectByGoodsId" column="goods_id"/>


    </resultMap>
    <select id="selectOneToMany" resultMap="rmGoods1">
        select * from t_goods limit 0, 10
    </select>

config文件中增加mapper映射

在Goods类中添加一个属性 private List goodsDetail;,并创建get、set方法
测试

 @Test
    /**
     * 一对多
     *
     */
    public void testOneToMany() throws Exception {
        SqlSession session = null;
        try{
            session = MyBatisUtils.openSession();
            List<Goods> goods = session.selectList("goods.selectOneToMany");
            for(Goods g :goods){
                System.out.println(g.getTitle() + ":" +g.getGoodsDetails().size());
            }
        }catch(Exception e){
            throw e;
        }finally{
            MyBatisUtils.closeSession(session);
        }

    }
2 多对一关联查询

在goods_detail.xml中添加select标签

<resultMap id="rmgoodsDetail" type="com.mybatis.entity.GoodsDetail">
        <id column="gd_id" property="gdId"/>
        <result column="goods_Id" property="goodsId"/>
        <association property="goods" select="goods.selectById" column="goods_Id"/>
    </resultMap>
    <select id="selectManyToOne" resultMap="rmgoodsDetail">
        select * from t_goods_detail limit 0,4
    </select>

在GoodsDetail中添加Goods对象,和get、set方法
测试

@Test
    /**
     * 多对一
     *
     */
    public void testManyToOne() throws Exception {
        SqlSession session = null;
        try{
            session = MyBatisUtils.openSession();
            List<GoodsDetail> goods = session.selectList("goodsDetail.selectManyToOne");
            for(GoodsDetail gd :goods){
                System.out.println(gd.getGdPicUrl() + ":" +gd.getGoods().getTitle());
            }
        }catch(Exception e){
            throw e;
        }finally{
            MyBatisUtils.closeSession(session);
        }

    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus是一个基于MyBatis的轻级ORM框架,它提供了一系列的增强功能,使得我们可以更便捷地操作数据库。在MyBatis-Plus中,一对多查询可以通过使用关联查询(Join查询)来实现。 在进行一对多查询时,我们需要定义两个实体类,一个表示一的一方,另一个表示多的一方。假设我们有一个订单(Order)和订单项(OrderItem)的关系,一个订单可以对应多个订单项。 首先,我们需要在Order实体类中定义一个属性,用于保存与订单项的关联关系。可以使用@OneToMany注解来标识一对多关系,并指定关联的属性名: ```java public class Order { //... @OneToMany(mappedBy = "order") private List<OrderItem> orderItems; //... } ``` 接下来,在OrderItem实体类中定义一个属性,用于保存与订单的关联关系。可以使用@ManyToOne注解来标识多对一关系,并指定关联的属性名: ```java public class OrderItem { //... @ManyToOne @JoinColumn(name = "order_id") private Order order; //... } ``` 在进行查询时,我们可以使用MyBatis-Plus提供的Wrapper对象来构建查询条件。通过使用leftJoin方法可以进行关联查询,并使用select方法指定要查询的字段: ```java public List<Order> selectOrderWithItems() { return orderMapper.selectList(new QueryWrapper<Order>() .select("order.id", "order.name", "order_item.id as order_item_id", "order_item.name as order_item_name") .leftJoin("order_item", "order.id = order_item.order_id") .eq("order.id", 1) ); } ``` 以上是一个简单的示例,通过关联查询查询订单及其对应的订单项信息。你可以根据自己的实际情况进行修改和扩展。 希望对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值