使用mybatis的resultMap进行复杂查询

Posted 大热

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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模式查看:

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

以上是关于使用mybatis的resultMap进行复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Mybatis

Mybatis:resultMap的使用总结

Mybatis resultMap 嵌套集合

Mybatis的resultMap

mybatis基础_resultMap

mybatis中的resultMap