mybatis-关联查询(resultType&resultMap)
2018-01-12 22:05
423 查看
关联查询
数据模型
订单商品模型:目标:分析表与表之间的关系。
分析步骤:
1、按模块去分析表,不要将系统全部表一次性分析
2、了解每个表存储了什么业务数据
3、了解表中关键字段(主键、外键、索引字段、非空字段)
4、了解表与表之间数据库级别的关系(外键关系)
5、表与表之间的业务关系(一对一、一对多、多对多)
注意:分析表与表之间的业务关系时一定要建立 在某种业务意义基础上
user表:存储了购买用户信息
网民,在电商系统中注册成为购买用户
orders表:存储了用户创建的订单信息
用户购买东西,一次不管购买多少商品只会创建一个订单
比如:张三一次购买手机、电脑,在orders表插入一条订单记录
orderdetail表:存储用户创建订单的详细信息,记录当时用户购买商品的购买信息
比如:张三一次购买手机、电脑,在orders表插入一条订单记录,在订单明细表插入两条记录,订单明细表每条记录对应一个商品信息
items商品表:存储了电商系统中的商品信息,用户在网站查看的商品信息就是来源与这张表
比如:网站销售手机,在这个表中插入很多的不同型号手机商品信息
orders—>user:
一个订单只能由一个用户创建,一对一关系
user—>orders:
一个用户可以创建多个订单,一对多关系
一对一查询
需求查询订单关联查询用户信息
分析
使用mybatis开发持久层的dao接口时,要分析的重点就是sql语句如何实现?
主查询表:orders订单表
关联查询表:user用户信息
确定关联查询方法:包括内链接、外链接
由于orders表有外键user_id,根据user_id去查询user只能查询到一条记录的。就可以使用内链接。
SELECT
orders.*,
user.username,
user.address
FROM
orders,
USER
WHERE orders.user_id = user.id
- 基本数据模型po
一个表对应一个po类,表名和po类名一致,表的属性和po的属性一致。
resultType实现
resultType映射规则:sql查询出几条记录,只要保证sql列名和resulttype指定的pojo类型的属性一致,可以映射成功,sql查询出几条记录最终映射生成的List就有几个对象。- 自定义pojo
由于与表对应的po类的属性不能够全部包括下边列名,所以自定义pojo,属性名和下边的列名保持一致
mapper.xml
mapper.java
resultMap实现
需求主查询是订单信息,要将主查询订单信息映射到orders对象中,在orders中创建user属性,让关联查询出来的用户信息映射到orders对象中的user属性中。其主要目标为了获取信息方便,如果想获取用户的信息,调用orders对象的getUser()方法即可。
在orders中创建user属性
mapper.xml
resultMap
mapper.java
多对多查询
需求查询用户信息及用户购买的商品信息
分析
主查询表:user用户信息
关联查询表:orders订单、orderdetail订单明细、items商品信息
采用内链接关联。
SELECT orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, items.name items_name, items.pic items_pic FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orderdetail.orders_id = orders.id AND items.id = orderdetail.items_id
映射需求
在user中设置一个List orders属性,在order对象中设置List orderdeils 属性,在Orderdetail中设置Items属性。
最终查询出来的用户列表,用户信息映射到List中,用户创建的订单信息隐射到user中的List orders属性,订单下的明细映射到order对象中List orderdeils 属性,订单明细所对应的商品信息映射到Orderdetail中Items属性
修改po类
mapper.xml
resultMap
<!-- 查询用户及用户购买的商品信息 最终要将查询结果映射成List<User> --> <resultMap type="user" id="userAndItemsResultMap"> <!-- 用户信息 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="address" property="address"/> <!-- 订单信息 一个用户可以创建多个订单 --> <collection property="ordersList" ofType="cn.itcast.mybatis.po.Orders"> <id column="id" property="id" /> <result column="user_id" property="userId" /> <result column="number" property="number" /> <result column="createtime" property="createtime" /> <result column="note" property="note" /> <!-- 订单明细信息 一个订单包括多个明细信息 --> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id column="orderdetail_id" property="id"/> <result column="id" property="ordersId"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <!-- 商品信息 一个明细对应一个商品 --> <association property="items" javaType="cn.itcast.mybatis.po.Items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_pic" property="pic"/> </association> </collection> </collection> </resultMap>
mapper.java
resultMap总结
resultMap实现高级映射,如果对结果有高级映射的需求可以使用reusltMap,需求比如:将一个列表数据映射到pojo的list属性中采用resultmap。
如果仅仅是将查询列表简单映射为List方式,列表中每个pojo对应一条记录,采用resultType即可。
相关文章推荐
- mybatis中的resultType="java.util.Map",返回有重复数据
- 【Mybatis框架】输出映射-resultType与resultMap
- Mybatis 入门之resultMap与resultType讲解实例
- mybatis resultmap标签type属性什么意思
- MyBatis中的resultType和resultMap
- Mybatis中的resultType和resultMap
- mybatis中报错:resultType还是resultMap
- MyBatis(九) resultType 和 resultMap 总结
- Mybatis中的resultType和resultMap
- Mybatis中的resultType和resultMap
- MyBatis的resultType和resultMap的区别
- mybatis之resultType resultMap(一)
- Mybatis 入门之resultMap与resultType讲解实例
- 后台(40)——MyBatis输出映射resultType以及resultMap
- mybatis学习之路----输出映射之resultType resultMap
- MyBatis之输入与输出(resultType、resultMap)映射
- MyBatis中resultType和resultMap的区别
- Mybatis中的resultType和resultMap 区别
- Mybatis (五)输入映射 HashMap输出 传递pojo包装 resultType resultMap 动态sql
- MyBatis关联查询,表字段相同,resultMap映射问题的解决办法