## day15 Javaweb【mybatis】ResultMap标签、动态标签、关联查询

day15 Javaweb【mybatis】ResultMap标签、动态标签、关联查询

学习目标

(1)ResultMap(重要)
查询数据封装的原理
字段名和成员名不一致

(2)动态sql(重要)
动态sql-if标签
动态sql-foreach标签

(3)关联查询(重要)
关联查询-一对一
关联查询-一对多
关联查询-综合案例

字段名和成员名不一致

(1)为什么id属性能被Mybatis赋值?
》底层使用id生成setId
》使用反射调用setId方法,setId(10) 方法内完成赋值 id = 10

(2)为什么user_id属性能被Mybatis赋值?
》底层使用user_id生成setUser_id
》使用反射调用setUser_id方法,类中只有setUserId

(3)所以 为什么强调 表与类的对应关系?
字段名和成员名要一致

ResultMap

(1)ResultMap有什么用?
建立查询字段与实体类成员变量的映射关系
即 查询字段是user_id但是Mybatis去赋值userId
》字段名与变量名不一致,可以赋值
》实现一对多,多对多的查询

(2)ResultMap标签映射关系,resultMap使用

动态标签介绍 ****

•(1)动态标签是什么?
由于mybatis将sql与java代码分离(sql写在xml中)
if标签,where标签 forEach标签

•(2)动态标签有什么用?
用来根据数据的不同来生成对应的sql

•(3)应用场景
高级搜索功能
搜索有多个条件,不是每个条件输入框都有值 ,此时需根据值来生成where条件

动态sql-if标签与where标签
•(1)if标签
》 if标签:可以判断传入的参数是否为空,如果不为空则拼接sql

•(2)where标签
》1 where标签:添加了where标签
1:不用在初始sql后边写where 1=1
2: 不用在第一个拼接的sql前写and,但是你也可以手动写and

动态sql-foreach标签
•(1)foreach标签
向sql传递数组或List,mybatis使用foreach解析

•(2)如何使用
collection:表示方法传入的集合对象的名字 collection=“xxx”
item:遍历集合时,会将集合中的元素赋值给item
open表示你要拼接的sql以什么开始
close:表示你拼接的sql以什么结束
separator:表示拼接的分隔符
接口中的变量名不能被标签识别,必须在参数的前边加注解@Param(“xxx”)

关联查询

•(1)项目不可能只有一个表,一般是多表

•(2)多表关系为,一对一,一对多,多对多

•(3)查询的数据来自多个表,要使用多表查询
笛卡尔集,显示内连接inner join,左外连接left outer join,右外连接right outer join,子查询select嵌套select

•(4)查询的结果要封装成javaBean对象 ,在Mybatis中重点掌握resultType与resultMap
在这里插入图片描述
## day15 Javaweb【mybatis】ResultMap标签、动态标签、关联查询

关联查询-一对一(1)

•(1)关联查询的中的一对一是指,站在订单的角度看,一个订单有一个用户跟它对应

•(2)数据来自两个表,使用连接查询,需要输出所有订单,使用左外连接

(3)查询结果可以有两种方式封装数据
》resultType 指定一个自定义javaBean类(通常要再编写一个新的javaBean类)
》resultMap 指定映射关系(不用编写新的javaBean类 推荐使用)
映射文件

关联查询-一对一(2)

•(1)分析下属性

•(2)association 标签 用于 成员变量的类型为自定义实体类型

•(3)添加属性:autoMapping=“true”,自动映射

关联查询-一对多

•(1)关联查询的中的一对多是指,站在用户的角度看,一个用户会存在多个订单跟他对应。

•(2)数据来自两个表,使用连接查询,需要输出每一个用户有多少个订单

•(3)查询结果使用collection标签 映射List<元素>