使用mybatis的resultMap进行复杂查询

数据库表如下:

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 10.5pt; font-family: "Calibri", sans-serif }
.MsoChpDefault { font-size: 10pt }
div.WordSection1 { }

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

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模式查看:

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

原文地址:https://www.cnblogs.com/lesliehe/p/8206609.html

时间: 2024-11-10 12:01:09

使用mybatis的resultMap进行复杂查询的相关文章

好947 Mybatis 配置resultMap 带参数查询Map 注意selectOne数据库返回结果一条数据库 否则会报错

//TMD 写几个demo 还有大站采集 <a target=_blank href="http://hao947.com/" target="_blank">好947</a> 映射配置文件 <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 --> <RESULTMAP id=BaseResultMap type="person"><pre name="c

MyBatis测试resultMap,分步查询以及延迟加载

什么是resultMap?   resultMap即自定义结果集映射规则,之前我们使用的resultType是MyBatis为我们提供的默认映射规则,使用方法如下: <mapper namespace="com.zgz.MyBatis.dao.DeptMapper"> <select id="getDeptById" resultType="com.zgz.MyBatis.bean.Dept"> select id, de

Mybatis使用resultMap实现一对一查询

数据库设计,部分源文件请参照resulttype那篇随笔,不再次累赘. 创建Orders.java把User.java作为属性加入 import java.util.Date; import cn.zqq.bean.User; public class Orders{ private String number; private Date craetetime; private String note; private User user; public User getUser() { ret

使用MyBatis的resultMap高级查询时常用的方式总结

以下内容已经通过楼主测试, 从pd设计数据库到测试完成, 之前楼主也没有过Mybatis 使用resultMap觉得有点乱,最近抽出时间总结了一下也算对MyBatis的resultMap进行一次系统的学习, 希望与大家分享学习心得, 有说的不对的地方请大家帮指教 下面是PD设计的几张数据库模型 先说下表吧 多对多 采用 传统而经典的 用户角色表,并没有采用当今流行的联合主键方式 而是将 用户表_id 和 角色表_id 进行Unique 详情参见http://www.cnblogs.com/Yin

Mybatis 配置resultMap 查询全部sql

映射配置文件 <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 --> <resultMap type="person" id="BaseResultMap"> <!-- column:库表的字段名 property:实体类里的属性名 --> <id column="person_id" property="personId" /> <resul

MyBatis Review——使用resultType和resultMap实现一对一查询

例如: 查询订单信息,关联查询创建订单的用户信息. 查询语句: SELECT orders.*, USER .username ,USER .sex, USER .address FROM orders, USER WHERE orders.user_id = USER .id 查询结果: 1,使用resultType接受输出结果 用户信息: 订单信息: 用于接收结果的pojo: 为了将查询结果映射到pojo中,pojo必须包括所有查询列名.在原始orders对象不能接受所有查询字段的时候,定义

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

Mybatis的ResultMap的使用

本篇文章通过一个实际工作中遇到的例子开始吧: 工程使用Spring+Mybatis+Mysql开发.具体的业务逻辑很重,对象之间一层一层的嵌套.和数据库表对应的是大量的model类,而和前端交互的是Vo类.现在需要做一个需求,有两种方式来实现: 使用现有的Service接口,或者自己在编写一些用到的接口,手动使用Java代码来分别调用Service接口来查出各个model,然后在业务层将model转换为vo,最后返回给前端json串.       为需求相关的页面定义自己的vo,在vo中只定义前

mybatis系列-10-一对一查询

10.1     需求 查询订单信息,关联查询创建订单的用户信息 10.2     resultType 10.2.1      sql语句 确定查询的主表:订单表 确定查询的关联表:用户表 关联查询使用内链接?还是外链接? 由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可以使用内链接. SELECT orders.*, username, sex, address FROM orders, USER WHERE orders.user_id = u