【MyBatis】学习笔记15:通过分步查询解决一对多或多对多问题

一个部门有多个员工,通过部门名称,模糊查询部门,并得到部门相应的员工信息

同样的,一个公司(Provider)有多个订单(Bill),根据公司名称模糊查询,得到符合条件的公司,和公司相应的所有订单

image.png

对象

SmbmsProvider.java

下图蓝色框框圈起来的部分是我们要用到的关键部分

image.png

SmbmsBill.java

这个对象正常根据字段生成getter and setter就可以了,然后正常的重新toString()

image.png

接口

这里展示的是一个多对多的关系(因为是模糊查询)

providerMapper.java

public List<SmbmsProvider> getOrderByProviderNameStepOne(@Param("cname") String cname);

orderMapper.java

public List<SmbmsBill> getOrderByProviderNameStepTwo(@Param("pid") String pid);

映射文件

providerMapper.xml

<!--    public SmbmsProvider getOrderByProviderNameStepOne(@Param("cname") String cname);-->
    <resultMap id="getOrderByProviderName" type="SmbmsProvider">
        <id property="proCode" column="proCode"/>
        <result property="proName" column="proName"/>
        <collection  property="smbmsBills" select="cc.mllt.jdbc.utils.orderMapper.getOrderByProviderNameStepTwo" column="id" fetchType="eager"/>
    </resultMap>
    <select id="getOrderByProviderNameStepOne" resultMap="getOrderByProviderName">
        select * from smbms_provider where proName like concat('%',#{cname},'%')
    </select>

image.png

orderMapper.xml

    <select id="getOrderByProviderNameStepTwo" resultType="SmbmsBill">
        select * from smbms_bill where providerId=#{pid}
    </select>

image.png

测试

 @Test
    public void getBillsByProviderName(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        providerMapper mapper = sqlSession.getMapper(providerMapper.class);
        List<SmbmsProvider> result = mapper.getOrderByProviderNameStepOne("公司");
        System.out.println(result);
        for(SmbmsProvider provider:result){
            System.out.print("公司名字:"+provider.getProName()+"\n");
            try {
                for(SmbmsBill bill:provider.getSmbmsBills()){
                    System.out.print(" | 订单号:"+bill.getBillCode());
                    System.out.print(" | 商品名称:"+ bill.getProductName());
                    System.out.print(" | 商品价格:"+bill.getTotalPrice());
                    String st=(bill.getIsPayment()==2)?"已付款":"未付款";
                    System.out.println(" | 付款状态:"+ st);
                }
            }catch (Exception e){
                System.out.println("未获取到该公司订单数据!");
//                System.out.println(e.getCause()+" "+e.getMessage());
            }

image.png

萌狼工作室@萌狼蓝天

posted @ 2022-04-19 16:32  萌狼蓝天  阅读(115)  评论(0编辑  收藏  举报