zoukankan      html  css  js  c++  java
  • 使用mybatis的resultMap进行复杂查询

    数据库表如下:

     

    拿到表的第一时间要学会分析陌生表的数据模型:

    1、学习单表记录了什么东西(去学习理解需求)

    2、学习单表重要字段的意义(优先学习不能为空的字段)

    3、学习表与表之间的关系(一对一、一对多、多对多)通过表的外键分析表之间的关系

    注意:分析表与表之间的关系时是要建立在具体 的业务意义基础之上

     

    用户表user:记录了购买商品的用户

    订单表orders:记录了用户所创建的订单信息

    订单明细表orderdetail:记录了用户创建订单的详细信息

    商品信息表items:记录了商家提供的商品信息

     

    分析表与表之间的关系:

    用户user和订单orders:

    user---->orders:一个用户可以创建多个订单   一对多

    orders-->user:一个订单只能由一个用户创建  一对一

    订单orders和订单明细orderdetail:

    orders-->orderdetail:一个订单可以包括多个订单明细  一对多

    orderdetail-->orders:一个订单明细只属于一个订单  一对一

    订单明细orderdetail和商品信息items:

    orderdetail-->items:一个订单明细对应一个商品信息 一对一

    items--> orderdetail:一个商品对应多个订单明细  一对多

    需求:查询所有用户信息,关联查询订单及订单明细信息及商品信息

    分析sql语句如何写:

    主查询表:用户信息

    关联查询:订单、订单明细,商品信息

    SELECT 
      orders.*,
      user.username,
      user.sex ,
      orderdetail.id orderdetail_id,
      orderdetail.items_num,
      orderdetail.items_id,
      items.name items_name,
      items.detail items_detail
    FROM
      orders,
      USER,
      orderdetail,
      items
    WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id
    

    运行------>

    主查询的表单出现重复数据,使用mybatis如下:

    pojo定义:

    User.java

    Orders.java

    Orderdetail.java

    Items.java

    mapper.xml(注意sql语句查询时是否使用别名,有的话一定要同步)

     1 <!-- 一对多查询,查询用户及订单明细和商品信息 -->
     2 <resultMap id="userOrdersAndItemsResultMap" type="user">
     3     <!-- 用户信息映射 -->
     4     <id column="id" property="id"/>
     5     <result column="username" property="username"/>
     6     <result column="sex" property="sex"/>
     7     <!-- 订单信息映射 -->
     8     <!-- 下边完成关联信息的映射
     9         collection:用于对关联信息映射到集合
    10         property:要将关联信息映射到User的哪个属性中
    11         ofType:关联信息映射到User的属性的类型,可以使用别名,不过全称方便确认
    12          -->
    13     <collection property="orderlist" ofType="com.emuii.mybatis.pojo.Orders">
    14         <!-- id:订单关联用户查询的唯一标识  -->
    15         <id column="id" property="id"/>
    16         <result column="user_id" property="userId"/>
    17         <result column="number" property="number"/>
    18         <result column="createtime" property="createtime"/>
    19         <result column="note" property="note"/>
    20         <!-- 订单详细信息映射 -->
    21         <collection property="orderdetails" ofType="com.emuii.mybatis.pojo.Orderdetail">
    22             <!-- id:关联信息订单明细的唯一标识
    23                 property:Orderdetail的属性名
    24                   -->
    25             <id column="orderdetail_id" property="id"/>
    26             <result column="items_num" property="itemsNum"/>
    27             <result column="items_id" property="itemsId"/>
    28             <association property="items" javaType="com.emuii.mybatis.pojo.Items">
    29                 <id column="id" property="id"/>
    30                 <result column="items_name" property="name"/>
    31                 <result column="items_detail" property="detail"/>
    32             </association>
    33         </collection>
    34     </collection>
    35 </resultMap>
    36 
    37 <!-- 一对多查询使用reusltMap完成
    38 查询用户及订单和订单明细,关联商品,的信息
    39 -->
    40 <select id="findUserOrdersAndItems" resultMap="userOrdersAndItemsResultMap">
    41     SELECT
    42       orders.*,
    43       user.username,
    44       user.sex ,
    45       orderdetail.id orderdetail_id,
    46       orderdetail.items_num,
    47       orderdetail.items_id,
    48       items.name items_name,
    49       items.detail items_detail
    50     FROM
    51       orders,
    52       USER,
    53       orderdetail,
    54       items
    55     WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id
    56 </select>

    mapper.java(代理接口)

    Test:

     1 public class OrdersMapperTest {
     2 
     3     // 会话工厂
     4     private SqlSessionFactory sqlSessionFactory;
     5     // 创建工厂
     6     @Before
     7     public void init() throws IOException {
     8 
     9         // 配置文件(SqlMapConfig.xml)
    10         String resource = "SqlMapConfig.xml";
    11 
    12         // 加载配置文件到输入流
    13         InputStream inputStream = Resources.getResourceAsStream(resource);
    14 
    15         // 创建会话工厂
    16         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    17     }
    18 
    19     @Test
    20     public void testFindUserOrdersAndItems() throws Exception {
    21 
    22         // 获取statement
    23         SqlSession sqlSession = sqlSessionFactory.openSession();
    24 
    25         // 创建mapper代理接口(Dao接口)
    26         OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
    27         // 调用方法
    28         List<User> list = ordersMapper.findUserOrdersAndItems();
    29 
    30         sqlSession.close();
    31         System.out.println(list);
    32     }
    33 }

    debug模式查看:

     出现两行数据,但是总共有四条数据~

  • 相关阅读:
    POJ_1698_Alice's Chance
    透过比特币看移动互联网创业产品立项的关键要素
    localhost与127.0.0.1的区别
    web service初探
    Oracle导出DMP文件的两种方法
    html大小写问题
    浏览器端数据存储
    CSS滚动条样式设置
    浅谈forword和sendRedirect
    Poi对excel的基本操作
  • 原文地址:https://www.cnblogs.com/lesliehe/p/8206609.html
Copyright © 2011-2022 走看看