• MyBatis学习之一----多表查询


    1、mybatis实际上并不是pojo和数据库的字段的对应,而是pojo和sql语句的对应。

      两个表通过相同的主键来查询

    (1)内连接查询

      select * from tb_order o,tb_user u where o.user_id = u.id;

     查询tb_order和tb_user两个表中id相等的信息。

    (2)外链接查询

      select * from tb_order o LEFT JOIN tb_user u ON o.user_id = u.id      //on后面是关联条件

    与(1)结果相同。以外链接为主,以订单为主不管是否对应客户,都要把订单查询出来。

    那么如何将两个表中查询的结果封装到一个对象中呢?既包含订单信息也包含用户信息。

      第一种解决方案:新建一个类,包含订单和用户信息。将查询结果集和对象对应上。

      

    扩展Order对象,来映射结果集。

      

    面向对象的思想解决方式:

      在Order对象中添加User对象

      在Order类中,添加private User user;并添加getter和setter方法。

      但是mapper用原来的sql并不能封装进来,无法完成自动映射。那么如何解决呢?

      使用resultMap

      association完成对象中 的某个对象的映射

      

        <resultMap id="OrderUserDetailsResultMap" type="Order">
            <!--order_id是sql中起的别名,property是数据库里面的实际名称-->
            <id column="order_id" property="id" />
            <!--association是在一个对象中加入其它的单个对象。不能是集合对象。-->
            <association property="user" javaType="User" autoMapping="true">
                <!--association子标签的内容参考resultMap-->
                <id column="user_id" property="id"/>
            </association>
        </resultMap>
    

      

        <resultMap id="OrderUserDetailsResultMap" type="Order">
            <!--order_id是sql中起的别名,property是数据库里面的实际名称-->
            <id column="order_id" property="id" />
            <!--association是在一个对象中加入其它的单个对象。不能是集合对象。-->
            <association property="user" javaType="User" autoMapping="true">
                <!--association子标签的内容参考resultMap-->
                <id column="user_id" property="id"/>
            </association>
            <!--完成集合映射
                property:集合的属性的名字
                javaType:集合的类型
                ofType:集合中保存对象的数据类型
                在这里details是List类型的List<Orderdetail>
            -->
            <collection property="details" javaType="List" ofType="Orderdetail" autoMapping="true">
                    <!--collection子标签,参考resultMap的书写-->
                <id column="detail_id" property="id"/>
            </collection>
        </resultMap>
    

      

        <select id="queryOrderAndUserAndOrderDetailByOrderNumber" resultMap="OrderUserDetailsResultMap">
            SELECT
            *,o.id as order_id,
            u.id as user_id,
            d.id as detail_id
            FROM
                tb_order o
            LEFT JOIN tb_user u ON o.user_id = u.id
            LEFT JOIN tb_orderdetail d ON d.order_id = o.id
            WHERE o.order_number = #{orderNumber}
        </select>
    

      

    2、多对多查询

      需求:查询订单,查询出下单人信息并且查询出订单详情中的商品数据。

      

    3、resultMap的继承

      resultMap标签内增加extends标签,继承其他resultMap,那么该resultMap内就不用再写重复的字段了。

      

    4、延迟加载

      需要的时候查,不需要的时候不查。

      关联查询的时候才会有延迟加载

      怎么实现分布查询,

    坚持就是胜利
  • 相关阅读:
    147-21. 合并两个有序链表
    146-14. 最长公共前缀
    145-如何查看python帮助文档
    144-38. 外观数列
    143-121. 买卖股票的最佳时机
    142-206. 反转链表
    141-98. 验证二叉搜索树
    Nginx中文域名配置
    Keepalived+Nginx架构整理版
    Tomcat启动脚本
  • 原文地址:https://www.cnblogs.com/xiaotieblog/p/8343020.html
Copyright © 2020-2023  润新知