使用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进行复杂查询的主要内容,如果未能解决你的问题,请参考以下文章