MyBatis之关联查询
2018-01-12 18:03
176 查看
MyBatis之关联查询
mybatis实现表与表之间的查询,将查询结果集进行映射,主要是resultMap完成高级映射,了解resultMap的使用方法。1.数据模型
订单商品模型:目标:分析表与表之间的关系。
分析步骤:
1、按模块去分析表,不要将系统全部表一次性分析
2、了解每个表存储了什么业务数据
3、了解表中关键字段(主键、外键、索引字段、非空字段)
4、了解表与表之间数据库级别的关系(外键关系)
5、表与表之间的业务关系(一对一、一对多、多对多)
注意:分析表与表之间的业务关系时一定要建立 在某种业务意义基础上
user表:存储了购买用户信息
网民,在电商系统中注册成为购买用户
orders表:存储了用户创建的订单信息
用户购买东西,一次不管购买多少商品只会创建一个订单
比如:张三一次购买手机、电脑,在orders表插入一条订单记录
orderdetail表:存储用户创建订单的详细信息,记录当时用户购买商品的购买信息
比如:张三一次购买手机、电脑,在orders表插入一条订单记录,在订单明细表插入两条记录,订单明细表每条记录对应一个商品信息
items商品表:存储了电商系统中的商品信息,用户在网站查看的商品信息就是来源与这张表
比如:网站销售手机,在这个表中插入很多的不同型号手机商品信息
orders—>user:
一个订单只能由一个用户创建,一对一关系
user—>orders:
一个用户可以创建多个订单,一对多关系
2.一对一查询
2.1.需求查询订单关联查询用户信息
2.2.分析
使用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
2.3基本数据模型po
一个表对应一个po类,表名和po类名一致,表的属性和po的属性一致。
2.4.resultType实现
resultType映射规则:sql查询出几条记录,只要保证sql列名和resulttype指定的pojo类型的属性一致,可以映射成功,sql查询出几条记录最终映射生成的List<pojo>就有几个对象。
2.4.1.自定义pojo
由于与表对应的po类的属性不能够全部包括下边列名,所以自定义pojo,属性名和下边的列名保持一致
2.4.2.mapper.xml
2.4.3.mapper.java
2.5.resultMap实现
2.5.1.需求
主查询是订单信息,要将主查询订单信息映射到orders对象中,在orders中创建user属性,让关联查询出来的用户信息映射到orders对象中的user属性中。其主要目标为了获取信息方便,如果想获取用户的信息,调用orders对象的getUser()方法即可。
2.5.2.在orders中创建user属性
2.5.3.mapper.xml
2.5.4.resultMap
2.5.5.mapper.java
2.6.小结
如果没有特殊的要求,使用resultType是比较方便,只要能够保证sql查询的列和pojo属性名一致可以映射成功,如果pojo中属性少了,添加属性即可。
特殊的要求:
如果需要将关联查询的信息映射到pojo的pojo属性中, 为了获取数据方便,可以使用resultMap。
如果使用延迟加载,只能使用resultMap。
建议是使用resultMap即可,在实际中,数据库中查询处来的字段名与实体类的属性名不一定一样。当一样的也可以不用去定义,resultMap会自动封装。
3.一对多查询
3.1.需求查询订单关联查询明细信息
3.2.分析
主查询表:orders订单表
关联查询表:orderdetail订单明细表
使用内连接
select orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num FROM orders, USER , orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id = orders.id
3.3.映射需求
将主查询的订单信息映射到orders对象中,将订单关联的明细信息映射到orders对象中List<Orderdetail>
根据此需求分析使用resultType不能实现,只能使用resultMap
3.4.修改orders类添加List属性
3.5.mapper.xml
3.6.resultMap
3.7.mapper.java
4.association和collection小结
association:用于将关联查询信息映射到单个对象中。标签注意使用javaType指定关联映射的对象类型
collection:用于将关联查询信息映射到集合对象中。
标签注意使用ofType指定关联映射的List中pojo的类型。
5.多对多查询
5.1.需求查询用户信息及用户购买的商品信息
5.2.分析
主查询表: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
5.3.映射需求
在user中设置一个List orders属性,在order对象中设置List<Orderdetail> orderdeils 属性,在Orderdetail中设置Items属性。
最终查询出来的用户列表,用户信息映射到List<User>中,用户创建的订单信息映射到user中的List<Orders> orders属性,订单下的明细映射到order对象中List<Orderdetail> orderdeils 属性,订单明细所对应的商品信息映射到Orderdetail中Items属性
5.4.修改po类
5.5.mapper.xml
5.6.resultMap
5.7.mapper.java
6.resultMap总结
resultMap实现高级映射,如果对结果有高级映射的需求可以使用reusltMap,需求比如:将一个列表数据映射到pojo的list属性中采用resultmap。如果仅仅是将查询列表简单映射为List<pojo>方式,列表中每个pojo对应一条记录,采用resultType即可。
7.延迟加载
如果刚开始仅仅查询一些简单的数据能够 满足用户的需求时,只需要查询简单的数据(尽量从单表中取数据),当用户需要查询关联信息时,此时我们再关联查询关联信息,叫延迟加载,对关联查询的信息进行延迟加载。延迟加载其目的为了提高查询性能,减轻数据的压力。
7.1.需求
查询订单关联查询用户信息,对关联查询用户进行延迟加载。
7.2.实现方式一
定义两个mapper:
1、查询订单列表(只从订单表查询),单表查询
2、根据用户id查询用户信息。
service调用第一个mapper查询出订单信息在页面显示出来
当用户在页面点击“查看用户”链接时通过service调用第二个mapper查询用户信息。
7.3.resultMap实现延迟加载
7.3.1.打开延迟加载的开关
在SqlMapConfig.xml中配置:
7.3.2.sql语句
查询订单的sql:
单表查询:
select * from orders;
查询用户信息:
根据用户id查询用户信息
select * from user where id=?
7.3.3.mapper.xml
7.3.4.resultMap定义延迟加载
7.3.5.mapper.java
7.3.6.测试延迟加载
7.3.7.总结
resultMap提供延迟加载,通过association可以延迟加载一个对象,通过collection可以延迟加载多个对象即集合对象。
延迟加载要注意实现的方法多种多样,主要目的是提高查询性能,减轻数据库压力,先查询简单数据,按 需查询关联数据。
相关文章推荐
- 【SSM-MyBatis框架】关联查询--多对多查询
- SSM框架day02-MyBatis——042——关联查询-one2many-多表连接查询
- MyBatis:关联查询——多对一查询(详解association)
- mybatis基于注解的关联查询
- mybatis 关联查询 含有集合的嵌套查询 并传多个参数
- MyBatis与mysql内接关联查询
- MyBatis几种关联查询配置
- Mybatis学习笔记四:关联查询
- Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询
- MyBatis--关联查询
- Mybatis关联查询一对一和一对多的实现
- mybatis关联查询
- mybatis关联查询
- Mybatis的关联查询
- Mybatis 关联查询(多对一,一对多)
- SSM框架day02-MyBatis——041 关联查询-外键
- SSM框架day02-MyBatis——043——关联查询-多表单独查询、044关联查询——many2one
- MyBatis:关联查询——一对多 多表连接、单独查询(详解resultMap)
- MyBatis关联查询(一对一)
- mybatis关联查询(多对多)