目录
- 一、介绍,
- 二、关联映射步骤
- 1.接口文件编写接口
- 2.修改关联实体类
- 3.编写映射文件
- 3.1 配置映射关联
- 3.2 编写SQL语句
- 4.测试
一、介绍,
关联映射查询:
查询的结果涉及数据库中多个表格的列,则这种查询称为关联映射查询
存在的问题:
如何处理查询到的结果,而不创建新的类?我TM也不知道为啥非有这种设定
解决方案:
在从表的关联实体类中创建主表关联实体类的属性类,也就衍生出另一个问题,粗暴点说“到底在哪个实体类里创建别的实体类的属性类?”
代码:
注意创建了属性类,记得增加set和get语句,否则没有意义
二、关联映射步骤
以查询结果涉及Emp、Dept、Salgrade三个关联实体类的search( )函数接口为例
1.接口文件编写接口
在mapper文件中编写
复制代码
1
2List<Emp> search(Dto dto);
2.修改关联实体类
由于Emp是唯一有外键的关联实体类,所以在Emp实体类里创建Dept和Salgrade的属性类,记得创建对应属性类的Set和Get访问方法。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46package com.upc.homework2.po; public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private String hiredate; private Double sal; private Double comm; private Integer deptno; // 创建属性类 private Dept dept; private Salgrade grade; // 创建Dept的访问 public Dept getDept() { return dept;} public void setDept(Dept dept) {this.dept = dept;} // 创建Salgrade的访问 public Salgrade getGrade() {return grade;} public void setGrade(Salgrade grade) {this.grade = grade;} // Emp实体类属性本身的访问 public Integer getEmpno() {return empno;} public void setEmpno(Integer empno) {this.empno = empno;} public String getEname() {return ename;} public void setEname(String ename) {this.ename = ename;} public String getJob() {return job;} public void setJob(String job) {this.job = job;} public Integer getMgr() {return mgr;} public void setMgr(Integer mgr) {this.mgr = mgr;} public String getHiredate() { return hiredate;} public void setHiredate(String hiredate) {this.hiredate = hiredate;} public Double getSal() {return sal;} public void setSal(Double sal) {this.sal = sal;} public Double getComm() {return comm;} public void setComm(Double comm) {this.comm = comm;} public Integer getDeptno() {return deptno;} public void setDeptno(Integer deptno) {this.deptno = deptno;} }
3.编写映射文件
3.1 配置映射关联
个人理解:
所谓配置映射关联,就是创建了一种新的数据类型
配置的原因:
由于自动创建的Emp关联实体类计算机默认只与emp表关联,即使我们在里面添加了表属性,计算机是不会识别的,所以我们直接让resultType=“com.upc.homework2.po.Emp”电脑会报错,需要重新弄配置一个新的类型
语法:
- id 标签 将数据库表格的主键 与关联实体类的属性进行关联
- resul 标签 将数据库表格的列 与关联实体类的属性进行关联
- association 标签 将 关联实体类 与关联实体类的属性类进行关联
说是配置、关联,也可以说是一种声名,声名数据类型都是来自哪
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<!-- 创建新的resultMap,名为empMap,数据类型是com.upc.homework2.po.Emp --> <resultMap id="empMap" type="com.upc.homework2.po.Emp"> <!-- 关联-Emp实体类与emp表格的主键 --> <id column="empno" property="empno"/> <!-- 关联-Emp的属性和emp表的列名 --> <result column="ename" property="ename" /> <result property="job" column="job" /> <!-- 关联-Emp中的属性类dept与关联实体类Dept --> <association property="dept" javaType="com.upc.homework2.po.Dept"> <!-- 关联-属性类dept与数据库表dept的主键、列名 --> <id column="deptno" property="deptno"/> <result property="dname" column="dname"/> <result property="loc" column="loc"/> </association> <!-- 关联-Emp实体类里的属性类grade与关联实体类Salgrade --> <association property="grade" javaType="com.upc.homework2.po.Salgrade"> <!-- 关联-属性类grade与数据库表salgrade的主键、列名 --> <id column="grade" property="grade"/> <result column="losal" property="losal"/> <result column="hisal" property="hisal"/> </association> </resultMap>
注意:
- 配置关联关系,查询结果涉及到的属性都要配置,多写了可以,少了不行
- 关联语法中property与colunmn的前后位置有什么意义、区别 :没有任何意义,谁在前都可以
3.2 编写SQL语句
唯一的区别是保存结果的数据类型变了
由 resultType=“com.upc.homework2.po.Emp” 变为
resultMap=“empMap”
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14<select id="search" resultMap="empMap" parameterType="com.upc.homework2.dto.Dto"> select e.ename,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal <if test="lowsal != null and lowsal != ''"> and losal >= #{lowsal} </if> <if test="higsal != null and higsal != ''"> and hisal <= #{higsal} </if> </select>
4.测试
关键在于如何调用关联实体类的属性类
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16@Test // emp.getDept().getDname():emp.getDept()获取emp里的Dept表,.getDname()再获取Dept表里的danme属性 // emp.getGrade().getGrade() 同理,获取Grade表里的grade属性 //与Salgrade salgrade = emp.getGrade(); salgrade.getGrade()同理 void search() { Dto dto = new Dto(); List<Emp> emps = mMapper.search(dto); // 一个for循环在总台输出 emps.forEach(emp->{ Salgrade salgrade = emp.getGrade(); System.out.println(emp.getEname()+"t"+emp.getDept().getDname()+"t"+salgrade.getGrade()); }); }
最后
以上就是沉默玉米最近收集整理的关于基于MyBatis的关联映射查询一、介绍,二、关联映射步骤的全部内容,更多相关基于MyBatis内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复