mybatis|mybatis框架之多表高级查询( 二 )

  • 一对一关系:比如用户和订单关系 。
  • 一对多关系:比如订单和订单详情关系 。
  • 多对多关系:比如订单和商品的关系 。
  • 二、一对一查询案例:根据订单号 , 查询出订单信息 , 以及下单人信息 。
    1案例分析
    ①需求分析
    因为涉及到订单信息表 , 和下单人信息表两张表的信息 , 所以需要使用到多表关联查询 。
    ②查询结果
    其结果有两张表的数据 , 那么如何在Java中接受查询到的数据呢?
    我们知道数据表可以对应一个Java实体类 , 现在有多张表数据如何对应一个Java实体类?
    就可以使用③这种方式 , 将User实体类对象作为Order实体类的成员变量 。
    2代码编写
    ①mapper层接口方法
    根据订单号查询订单和用户 , 参数为订单号 , 结果为一个order对象 。
    ②映射文件sql语句编写
    这不用多说 , 上述就已经分析了 。
    ③测试代码
    我们会发现其查询结果中 , order实体类中的user属性为null
    为什么会这样呢?
    因为mybatis并不能自动映射user实体类 , 所以需要自行配置resultMap 。
    3代码优化
    ①结果集类型为order
    指定结果集id , 编写对应的resultMap标签 。
    ②association标签
    其翻译过来本身就是联合的意思 。
    • property:也就是order中需要关联的属性 , 这里也就是user 。
    • javaType:关联属性对应的Java类型 , 这里也就是User实体类 。
    ③关联属性id
    User的id在order中对应的也就是user_id 。
    再次测试查询时 , 就能发现查询结果中user类中的数据也能获取了 。
    三、一对多查询案例:查询订单 , 查询出下单人信息并且查询出订单详情 。
    ①sql语句编写
    查询结果与三张表相关联 , 那么一共有两次表关联查询 。
    ②数据库查询结果
    通过结果我们可以发现一个订单号查询出了2个订单详情 。
    ③Order实体类拓展
    订单和订单详情是一对多关系 , 那么同理 , 将订单详情的集合封装成订单的一个属性 。
    分析完毕 , 代码编写 , 同样的方式使用resultMap标签 , 一次性将代码写完整 。
    ①mapper层接口方法说明
    ②映射文件中sql语句编写
    ③一对多查询 , collection标签 , 其本身翻译过来也就是集合的意思:
    • property:属性名 , 这里也就是封装到Order类中的orderdetails属性 。
    • javaType:集合类型 , 我们封装的是List 。
    • ofType:集合中的元素类型 , 即泛型 。
    • autoMapping:开启自动映射
    id子标签:要指定在查询结果中orderdetail表中的id , 其id我们使用了起别名的方式加以说明 , 也就是detail_id 。
    最后谢谢你的观看 。
    如果可以的话 , 麻烦帮忙点个赞 , 谢谢你 。