• 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)


    视频地址:http://edu.51cto.com/sd/be679

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现。不过这里不说,做关联查询的步骤可以简单的总结为以下的几步:

        1.分析出表和表之间的关联关系

        2.Sql语句的写法

        3.在实体类中把附表的信息添加到主查询表中

        4.配置resulMap

          配置你主要查询表的信息

          配置你关联表的信息

    这里我先给出几个表的字段和关系,以三张表为例(用户表:users,订单表:orders,订单详情表:orderDetail)大概字段如下:

      Users

        Userid

        Uname

        Upassword

        Usex

      Orders

        Orderid

        Userid(外键指向用户表)

        Order_unmber

        createTime

        address

      Orderdetail

        Orderdetailid

        Orderid (外键指向订单表)

        Num 

      这三张表的关系简单的可以说成如下关系:

        用户表-->订单表   是一对一的关系

        订单表-->订单详情表  是一对多的关系

      一.这里先来看一下Mybatis中对于一对一关系的实现(以用户表和订单表举例):

      这里的一个需求是:查询订单表的所有信息和用户名

        1.SQL语句:  

          SELECT t_orders.* ,t_user.uname as 用户名

          FROM t_orders,t_user 

          where t_orders.userid=t_user.userid

        结果

        2.主要查询的订单信息(主要查询表),所有在订单中添加User的对象

    private Users user;//在订单表中关联用户表的属性,get,set别忘记

        3.配置一个resultMap

    <resultMap type="com.etc.entity.Orders" id="ordersResultMap">

      <!-- 配置你主要查询表的信息 -->

      <id column="orderid" property="orderid"/>

      <result column="userid" property="userid"/>

      <result column="order_number" property="order_number"/>

      <result column="createtime" property="createTime"/>

      <result column="address" property="address"/>

    <!-- 配置关联表的信息 -->

    <!--

    association:配置一对一关联表的信息

    property:主表中匹配关联表的那个属性

    javaType:该属性的全路径(包+类名)

     -->

      <association property="user" javaType="com.etc.entity.User">

        <id column="userid" property="userid"/>

        <result column="uname" property="uname"/>//如果还有查询别的信息只要配置column即可

      </association>

    </resultMap>

      调用:

    <select id="findByOrderUser" resultMap="ordersResultMap">
            SELECT t_orders.* ,t_user.uname as 用户名
            FROM t_orders,t_user 
            where t_orders.userid=t_user.userid
        </select>

      二.多对多关联表的实现(多对多的实现原理和一对一的类型,所以不多做解释,直接贴代码

        1.Sql语句:(查询的订单表的全部信息和订单详情表的ID和数量)

          SELECT t_orders.*,t_orderdetail.orderdetailid,t_orderdetail.num

         FROM t_orders,t_orderdetail

        WHERE t_orderdetail.orderid=t_orders.orderid

        结果:(从这个结果可以看出来,一个订单可以对应对个订单详细的记录)

        分析:这里的主要查询对象还是订单表,所以要在订单表中加入订单详情的对象

        2.主要查询的订单信息(主要查询表),所有在订单中添加OrderDetail的对象(并且要放在集合中)

    private List<OrderDetail> orderDetail;//get  set  别忘记

         3.配置一个resultMap(一对多使用collection)

    <resultMap type="com.etc.entity.Orders" id="orderResultMap">

      <!-- 配置 要映射的订单信息-->

      <id column="orderid" property="orderid"/>

      <result column="userid" property="userid"/>

      <result column="order_number" property="order_number"/>

      <result column="createtime" property="createTime"/>

      <result column="address" property="address"/>

      <!-- 关联表的映射信息 -->

    <!--

    collection:对应查询出来的结果有多条的映射记录

    property:对应的主表中添加的关联表的那个属性

    ofType:就相当于是一对一中的javaType

     -->

      <collection property="orderDetail" ofType="com.etc.entity.OrderDetail">

        <id column="orderdetailid" property="orderdetailid"/>

        <result column="num"  property="num"/>

      </collection>

    </resultMap>

      总结:

        一对一和一对多的配置原理都很类型,主要就是通过配置resultMap

        一对一关联表配置assocation,用javaType指定关联表类型

        一对多关联表配置collection,ofType指定关联表类型

  • 相关阅读:
    全栈工程师学习Linux技术的忠告
    实战CentOS系统部署Hadoop集群服务
    如何安装最新的 XFCE 桌面?
    scrapy爬虫框架(二)
    scrapy爬虫框架(一)
    数据结构与算法(二)
    IDEA 常用快捷键
    数据结构与算法(一)
    es6之模板字符串
    es6之箭头函数
  • 原文地址:https://www.cnblogs.com/huaixiaoz/p/5799705.html
Copyright © 2020-2023  润新知