标签:XML xml 多表 映射 映射器 查询 嵌套 id 属性
01-高级查询结果映射
emp表
dept表
02-多表关联查询映射
多对一映射
项目中Emp类的数据
项目中dept类的数据
想要多表查询需要建个公共类里面写入两个表中的属性,如下面方法
type里要写用到的类型,由于继承Emp所有Emp里面的属性直接写,column是写数据库的别字,property是写字段就是对象里属性的名字,由于是多表查询类中只声明了一个Dept属性,所以可以用对象属性名.属性的方式获取
当前发现一点问题如果我们要返回多个对象的时候需要用到集合在接口中我们声明方法的时候需要用到集合但是集合里<>符号里应该写什么呢,有人会写下图type里面类名,由于下面的类名是继承Emp类的所以也有人写Emp,不管写那个都是调用的EmpDeptDIO的tostring方法,即使你再<>里面写的是String类型它也会调用EmpDeptDIO的tostring方法,博主亲身测试过
第二种方法用association里面的property要写多表连接的另一个表名,也就是对应pojo里面另一个表名,javaType是对应表的全类名
或者可以创建另一个表的xml方法然后再另一个xml里面进行引用
这种方法可以不用指定javaType
association还有一个作用是强制会把多对多的情况变成多对一的情况
像下面这种数据库有两个相同id的情况
查到的多对一会出现如下图数据
用association会查询出5条但是显示出3条把相同id的要不就是去掉了要不就是和一样id的数据覆盖了(但是用它的前提主表必须查询id必须得有id这个属性)
当主表和子表里属性有相同的时候,我们需要用as给另一个表里的id其别名然后再association里面用columnPrefix属性可以去掉指定类里属性的前缀字母使得主表和子表即使用此方法去掉后一样但是实际的值不是一样的,但是用上后此类中的所有属性都得加上这个前缀
一对多的映射
嵌套结果: 一对多
首先在数据库查询到的结果如下
如果我们要查询一对多的话需要再公共类中继承一写多为什么下面会写
在对应的xml文件中写入sql语句和resultMap,这里重点是第二个resultMap,第二个resultMap继承了第一个就不用写一对多里的一的属性了,但是在写多的时候我们在公共类里把多声明成了list集合所以我们需要用collection来实现用list集合来接受结果的多的数据
创建对应接口用list集合因为要返回多个数据
最后打印输出的结果发现一个dept里面含有多个emp数据实现了一对多,而我们在数据库软件中看到的数据是有很多条的也就是一个部门不只出现一次而是出现了很对次,而在java里实现了一个部门只出现一次加上对应多个员工
嵌套查询(异步查询): 一对多
首先声明一对多的一表id是QueryDeptAndEmp,resultMap里面property为公共类里的类名,column为多表中sql语句中的参数,select为多表查询语句的sql id全类名
多表里的sql语句根据部门id来查找
在接口中声明方法
最后的查询结果
注意嵌套结果的方法和嵌套分布的方法有区别在分页的时候有区别
我们根据部门编号查询的时候嵌套结果只能查询数据表中前五条数据而不是按照部门的前五个序号查询的,如下图所示就只有五条数据
但是我们用嵌套分布查询的时候能查到前五个部门下所有的员工有那些
延迟查询(只适用于嵌套分布)
在某一个类中设置延迟查询也就是懒加载在嵌套分布里面用fetchType设置懒加载
在公共类中并且删除蓝色框里的内容,也就是先删除一对多里的多表
在mybatis_config.xml里面配置setting lazyLoadTriggerMethods属性
在mybatis_config.xml里面配置setting lazyLoadingEnabled属性可以把全局都设置成懒加载
但是我们想要有的不是懒加载变成立即加载怎么办,在对应的xml文件中把fetchType设置成eager
在mybatis_config.xml里面配置setting aggressiveLazyLoading属性并且设置成true可以把全局都设置成了立即加载
标签:XML,
xml,
多表,
映射,
映射器,
查询,
嵌套,
id,
属性
From: https://blog.csdn.net/kkkkkkkok/article/details/142307701