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

Posted 张小铁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、延迟加载

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

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

  怎么实现分布查询,

 

以上是关于MyBatis学习之一----多表查询的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis关于多表联查 关联关系之一--------一对多(单条sql语句查询)

MyBatis多表联查

mybatis学习——多表查询

mybatis学习——多表查询

mybatis学习——多表查询

mybatis学习——多表查询