一个页面不仅要展示他的套餐游信息,还要展示跟团游的具体人与人的信息,所以涉及到多表联查,然后套餐游中有多个跟团游的信息,所以要根据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>