• Mybatis学习总结四(关联查询)


    一、一对一查询

    实例:查询所有订单信息,关联查询下单用户信息。

    Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息。

    1 public class OrdersCustom extends Orders {
    2 
    3     private String username;// 用户名称
    4     private String address;// 用户地址
    5 get/set。。。。
    View Code

    Mapper.xml

    <!-- 查询所有订单信息 -->
        <select id="findOrdersList" resultType="cn.itcast.mybatis.po.OrdersCustom">
        SELECT
        orders.*,
        user.username,
        user.address
        FROM
        orders,    user
        WHERE orders.user_id = user.id 
        </select>
    View Code

    Mapper接口

    1 public List<OrdersCustom> findOrdersList() throws Exception;

    测试:

     1 Public void testfindOrdersList()throws Exception{
     2         //获取session
     3         SqlSession session = sqlSessionFactory.openSession();
     4         //获限mapper接口实例
     5         UserMapper userMapper = session.getMapper(UserMapper.class);
     6         //查询订单信息
     7         List<OrdersCustom> list = userMapper.findOrdersList();
     8         System.out.println(list);
     9         //关闭session
    10         session.close();
    11     }
    View Code

    总结:定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。

    Method2:使用resultMap,定义专门的resultMap用于映射一对一查询结果。

    tips:在Orders类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。

    Mapper.xml

    <!-- 订单信息resultmap -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="userordermap">
    <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 -->
    <id property="id" column="id"/>
    <result property="user_id" column="user_id"/>
    <result property="number" column="number"/>
    <association property="user" javaType="cn.itcast.mybatis.po.User">
    <!-- 这里的id为user的id,如果写上表示给user的id属性赋值 -->
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <result property="address" column="address"/>
    </association>
    </resultMap>
    <!--
    association:表示进行关联查询单条记录
    property:表示关联查询的结果存储在cn.itcast.mybatis.po.Orders的user属性中
    javaType:表示关联查询的结果类型
    <id property="id" column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id />表示user_id是关联查询对象的唯一标识。
    <result property="username" column="username"/>:查询结果的username列对应关联对象的username属性。
    -->
    View Code
    1     <select id="findOrdersListResultMap" resultMap="userordermap">
    2     SELECT
    3     orders.*,
    4     user.username,
    5     user.address
    6     FROM
    7     orders,    user
    8     WHERE orders.user_id = user.id 
    9     </select>
    View Code

    二、一对多查询

    实例:查询所有订单信息及订单下的订单明细信息。

    定义po类:在Orders类中加入User属性,在Orders类中加入List<Orderdetail> orderdetails属性。

    Mapper.xml

    <select id="findOrdersDetailList" resultMap="userorderdetailmap">
        SELECT
        orders.*,
        user.username,
        user.address,
        orderdetail.id orderdetail_id,
        orderdetail.items_id,
        orderdetail.items_num
        FROM orders,user,orderdetail
        WHERE orders.user_id = user.id
        AND orders.id = orderdetail.orders_id
    </select>
    
    <!-- 订单信息resultmap -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap">
    <id property="id"column="id"/>
    <result property="user_id" column="user_id"/>
    <result property="number" column="number"/>
    <association property="user" javaType="cn.itcast.mybatis.po.User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <result property="address" column="address"/>
    </association>
    <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
        <id property="id" column="orderdetail_id"/>
        <result property="items_id" column="items_id"/>
        <result property="items_num" column="items_num"/>
    </collection>
    </resultMap>
    
    <--
    黄色部分和上边一对一查询订单及用户信息定义的resultMap相同,
    collection部分定义了查询订单明细信息。
    collection:表示关联查询结果集
    property="orderdetails":关联查询的结果集存储在cn.itcast.mybatis.po.Orders上哪个属性。
    ofType="cn.itcast.mybatis.po.Orderdetail":指定关联查询的结果集中的对象类型即List中的对象类型。
    <id /><result/>的意义同一对一查询。
    -->
    View Code

    tips:上边定义的resultMap中黄色部分和一对一查询订单信息的resultMap相同,这里使用继承可以不再填写重复的内容,如下:

    1 <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap">
    2 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
    3     <id property="id" column="orderdetail_id"/>
    4     <result property="items_id" column="items_id"/>
    5     <result property="items_num" column="items_num"/>
    6 </collection>
    7 </resultMap>
    View Code

    三、多对多查询

    案例:需要关联查询映射的信息是:订单、订单明细、商品信息;订单:一个用户对应多个订单,使用collection映射到用户对象的订单列表属性中;订单明细:一个订单对应多个明细,使用collection映射到订单对象中的明细属性中;商品信息:一个订单明细对应一个商品,使用association映射到订单明细对象的商品属性中。

    <!-- 一对多查询
        查询用户信息、关联查询订单、订单明细信息、商品信息
         -->
         <resultMap type="cn.itcast.mybatis.po.User" id="userOrderListResultMap">
             <id column="user_id" property="id"/>
            <result column="username" property="username"/>
             <collection property="orders" ofType="cn.itcast.mybatis.po.Orders">
              <id  column="id" property="id"/>
              <result property="number" column="number"/>
                 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
                      <id  column="orderdetail_id" property="id"/>
                      <result property="ordersId" column="id"/>
                     <result property="itemsId" column="items_id"/>
                      <result property="itemsNum" column="items_num"/>
                      <association property="items" javaType="cn.itcast.mybatis.po.Items">
                           <id column="items_id" property="id"/>
                            <result column="items_name" property="name"/>
                            <result column="items_detail" property="detail"/>
                    </association>
                   </collection>
           </collection>
    </resultMap>
    View Code
  • 相关阅读:
    如何提取Redis中的大KEY
    VIM标记 mark 详解
    JAVA编写的一个简单的Socket实现的HTTP响应服务器
    onenote 直接发布文章到CSDN
    guava学习笔记--字符串处理
    带打印子结点的自底向上算法
    动态规划算法3
    动态规划算法2
    一个菜鸟学习动态规划算法的过程
    php取得当前时间函数
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/10480578.html
Copyright © 2020-2023  润新知