级联查询(注解版)

        牵扯多张表的查询时,我们往往就要思考多表关联,表与表之间的关联关系通过那两个键来体现?实体类之间的属性嵌套,最终返回的结果集可能牵扯好几个实体类,这又要如何统一?

        在mybatis的XML版,给我们提供了一种解决方案,可以通过定义ResultMap来定义返回结果集,再加上连接(JOIN)表操作就可很好的解决问题。

        但当表的数量有很多而且实体类里属性关联越来越复杂时,这个ResultMap结果集以及SQL语句就会很复杂,并且很乱。

        如果我们利用级联查询,就不一样,为什么这么说呢?

请看下面代码:

Order实体类:                                                       对应表 t_order

76f8174466d84b248b2734d36d07d740.png   e254dc404eb44f04bc8039db8bb35614.png

SetMeal 实体类:                                                        对应表 t_setmeal

3804bfc4b2aa43f491a08e445766f620.png       9ca20e29e0154963946e7543f7be2f0d.png

CheckGroup实体类:                                                 对应表 t_checkgroup

75dbf001dd0a498ba6da1b70319a7e10.png   ac47549c9cfb4cfb9ca8e640491bd1c7.png

CheckItem 实体类:                                        对应表 t_checkitem

42d175f8c2654656bbe8ec45ae1a55a9.png   e812030cd5ac4883b696a38914d2cb2f.png

 ​​​​​

   四个实体类间的关系通过下面三张表关联起来:

1.Order实体类中包含SetMeal的setmealId。

2.SetMeal与CheckGroup:

635ef89646ca4c75b368895e72eb88bf.png

3.CheckGroup与CheckItem:

5c34b7242ac14c6280c7522bfdfb3035.png

如果有这样一个需求,要查询关于Order类的SetMeal的详细信息,即包含CheckGroup集合,而CheckGroup又包含CheckItem集合,一般SQL语句我们会这么写:

accfebb34af742b6ac7e8cb29f51b553.png

        在编写具体数据访问层时,遇到了一个问题,返回一行数据ResultMap集合可以写(用一个具体的对象来对应),多行数据呢?这样恐怕就不行了,

        所以我们想到了利用级联查询,来嵌套调用具体DAO的方法实现五表的查询。

如下:

OrderDao利用@Many注解调用SetMealDao的selectGroupBySid查询出List<CheckGroup>集合。

@Mapper
public interface OrderDao {
    //根据ID查询套餐详情(五表查询)
    @Results(value = {
            @Result(column = "id",property = "id"),
            @Result(column = "ts.name",property = "name"),
            @Result(column = "remark",property = "remark"),
            //checkGroups集合
            @Result(column = "id",property = "checkGroups",
                    many = @Many(select = "com.apesource.ressetmealservice.mapper.SetMealDao.selectGroupBySid"))

    })
    @Select("select * from t_setmeal where id=#{sid}")

SetMealDao利用@Many注解调用.CheckGroupDao的findCheckItemsByGroupId查询出List<CheckItem>集合。

@Mapper
public interface SetMealDao {
    //根据套餐id查询检查组
    @Results(value = {
            @Result(column = "name",property = "name"),
            @Result(column = "helpCode",property = "helpCode"),
            @Result(column = "id",property = "checkItems",
                    many = @Many(select = "com.apesource.ressetmealservice.mapper.CheckGroupDao.findCheckItemsByGroupId"))
    })
    @Select("SELECT tc.* FROM t_checkgroup tc LEFT JOIN t_setmeal_checkgroup tsc ON tc.id=tsc.checkgroup_id " +
            "WHERE tsc.setmeal_id=#{sid}")
    List<CheckGroup> selectGroupBySid(int sid);
}
@Mapper
public interface CheckGroupDao {
    //根据组ID查询所有检查项
    @Select("SELECT tcm.* FROM t_checkitem tcm LEFT JOIN t_checkgroup_checkitem tcc ON tcm.id=tcc.checkitem_id WHERE tcc.checkgroup_id=#{gid}")
    List<CheckItem> findCheckItemsByGroupId(int gid);

}

        postman调用相应的控制层测试结果:

        2fb2e733be33468292291168c67b7d1b.png

                                   06273b2351d2488d85395a43b04f4e2e.png

             2cd647321f6f4052a04886aa7cbe9507.png

        利用方法的完全限定名一级一级的调用不同的数据访问层方法,来达到多表查询的目的,这就是级联查询。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值