mybatis分步式查询方法

一个页面不仅要展示他的套餐游信息,还要展示跟团游的具体人与人的信息,所以涉及到多表联查,然后套餐游中有多个跟团游的信息,所以要根据id查出中间表信息,通过中间表定位到具体跟团游的信息,跟团游中的自由行内容也要跟着显示出来;

一个接口的调用时,他的业务会涉及到在数据库中进行多次多表联查,为了简化,可以使用分步式查询,比如我的一个接口在数据库中会多次联表查询,每次查询的结果给到下一步sql去执行

controller层

@RequestMapping("/findById")
public Result findById(Integer id){
Setmeal setmeal = setmealService.findById(id);
return new  ......;
}

用户点击,触发查询功能 --> findById 一个接口的调用实现复杂的数据返回

Impl层

 @Override
    public Setmeal findById(Integer id) {
        return setmealMapper.findSetmealByStepOne(id);
    }

第一步:

前端传入一个id,通过id去查询--> 这是第一步,通过id查询出对应套餐信息,上面的resultMap就是根据查出的对应字段创建一个对应关系,重点就是标签<collection .........>

在我们的pojo类中还定义了一个list集合的属性,但是单个sql语句时没办法处理这个list集合属性的,所以这个list集合是通过其中select属性来满足的(也就是分步式查询),对应这个集合再写一个单独的Mapper

private Integer id;
    private String name;
    private String code;
    private String helpCode;
    private String sex;
    private String age;
    private Float price;
    private String remark;
    private String attention;
    private String img;//套餐对应图片存储路径
    private List<TravelGroup> travelGroups;//旅行套餐对应的报团分组,多对多关系
<resultMap id="setmealResultMap" type="Setmeal">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="code" column="code"></result>
        <result property="helpCode" column="helpCode"></result>
        <result property="sex" column="sex"></result>
        <result property="age" column="age"></result>
        <result property="price" column="price"></result>
        <result property="remark" column="remark"></result>
        <result property="attention" column="attention"></result>
        <result property="img" column="img"></result>
        <collection property="travelGroups"
                    select="com.atguigu.meinian.mapper.TravelGroupMapper.getSetmealByStepTwo"
                    column="id"></collection>
    </resultMap>



<select id="findSetmealByStepOne" resultMap="setmealResultMap">
        select * from t_setmeal where id = #{id}
    </select>

第二步:

创建独立的Mapper,然后将他的方法全类名值copy到上面第一步的select属性中,然后这个"setmealId"条件就是column中的"id"属性 , column的意思就是将我们查询出来的某一个字段作为条件传给select的方法中作为参数来使用的;

/**
     * 通过分步查询查询套餐游所对应的跟团游信息
     * @param setmealId
     * @return
     */
    List<TravelGroup> getSetmealByStepTwo(@Param("setmealId") Integer setmealId);
<resultMap id="travelGroupResultMap" type="TravelGroup">
        <id property="id" column="id"></id>
        <result property="code" column="code"></result>
        <result property="name" column="name"></result>
        <result property="helpCode" column="helpCode"></result>
        <result property="sex" column="sex"></result>
        <result property="remark" column="remark"></result>
        <result property="attention" column="attention"></result>
        <collection property="travelItems"
                    select="com.atguigu.meinian.mapper.TravelItemMapper.getSetmealByStepThree"
                    column="id"></collection>
    </resultMap>

    <!--List<TravelGroup> getSetmealByStepTwo(@Param("setmealId") Integer setmealId);-->
    <select id="getSetmealByStepTwo" resultMap="travelGroupResultMap">
        SELECT tt.* FROM t_setmeal_travelgroup tst
        LEFT JOIN t_travelgroup tt
        ON tst.travelgroup_id = tt.id
        WHERE tst.setmeal_id = #{setmealId}
    </select>

第三步:

重复第二步的操作

 /**
     * 通过分步查询查询跟团游所对应的自由行信息
     * @param travelGroupId
     * @return
     */
    List<TravelItem> getSetmealByStepThree(@Param("travelGroupId") Integer travelGroupId);
 <!--List<TravelItem> getSetmealByStepThree(@Param("travelGroupId") Integer travelGroupId);-->
    <select id="getSetmealByStepThree" resultType="TravelItem">
        SELECT tt.* FROM t_travelgroup_travelitem ttt
        LEFT JOIN t_travelitem tt
        ON ttt.travelitem_id = tt.id
        WHERE ttt.travelgroup_id = #{travelGroupId}
    </select>

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值