高级MyBatis -- resultMap实现联表(一对多,多对一)
前言:
结合实际生活来看联表,拿一个习以为常的例子来说,学生和老师:
多个学生对应一个老师 -- 多对一 (当然是在一个课堂上,嘻嘻)
一个老师对应多个学生 -- 一对多 (同上)
在实际操作时,我们需要看到的结果往往不是一个常见的类型(int,String,或者实体类),而往往
是下面这个样子:
也就是我们看到的显示具体的对应关系,这时候常见的类型要实现这样的效果是非常困难的(当然大佬
除外),MyBatis 的创建者也考虑到了这个问题,所以 resultMap 应运而生。
resultMap 的介绍及使用:
直译过来就是结果映射,所谓映射简单来说就是一个地方映射到另一个地方,所以结果映射就是将原先
的结果应该到另一个地方进行处理,相当于去调用另一个函数。
resultMap 的参数属性:
<resultMap id="" type="" autoMapping="" ></resultMap>
1、id:
当前命名空间中的一个唯一标识,用于标识一个结果映射。即 resultMap 的名字(需唯一)
2、type:
类的完全限定名, 或者一个类型别名. 即 返回值类型(往往是实体类,视情况而定)。
3、autoMapping:
如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。
这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。
这个属性并不多用,默认值就可以。
resultMap 的属性:
<select id="selectUsers" resultMap="userResultMap">select user_id, user_name, hashed_passwordfrom some_tablewhere id = #{id}</select>
映射到下面的标签中:
各个子属性中的属性:properity: 呈现给用户的新列名(相当于起别名)column : 数据库中表的列名
<resultMap id="userResultMap" type="User"><id property="id" column="user_id" /><result property="username" column="user_name"/><result property="password" column="hashed_password"/></resultMap>
1、id:
对应一张表中的id属性,也是唯一的。
2、result:
对应表中的其他属性(sex,name,address,and so on)
3、association:
需要连接的表,例如 多个学生对应一个老师(在代码中会有深刻的体现)。这个属性有它自己的子属性 -- 与 resultMap 的子属性类似(id,name,and so on)
4、collection:
复杂类型的集合,在处理一对多的问题时比较常用,拿学生老师的例子来说,一个老师对应多个学生,所以说 实体类 Teacher 中有一个属性是 List<Student> 的,这时候就需要用该属性啦。(具体实现会在代码中有深刻展现,请继续往下看)
关于 resutlMap 的详细使用及相关的更多属性,在MaBatis 相关文档中有详细的介绍,有所疑问的
小伙伴可以访问官网进行深刻的学习。
Mybatis中文文档
MyBatis英文文档
联表实现多对一:
teacher table:
student table:
1、新增两张表,所以需要两个实体类:
Student.java
package rj.cool.bean;public class Student {private int id;private String name;private int tid;// 多个学生对应一个老师private Teacher teacher;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getTid() {return tid;}public void setTid(int tid) {this.tid = tid;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", tid=" + tid +'}';}
}
Teacher.java
package rj.cool.bean;import java.util.List;public class Teacher {private int id;private String name;// 一对多的关系private List<Student> students;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;}@Overridepublic String toString() {return "Teacher{" +"id=" + id +", name='" + name + '\'' +'}';}
}
2、需要有 映射文件 进行查询:
按照我们之前说的面向接口开发,有所疑问的小伙伴可以到我创建的 MyBatis 专栏进行查阅。
所以我们先创建接口,然后再创建映射文件。
StudentMapper.java – Student映射文件对应的接口:
package rj.cool.dao;import rj.cool.bean.Student;import java.util.List;public interface StudentMapper {public void addStudent();public void delStudent();public void updateStudent();public List selectStudent();public List<Student> findAllStudent();
}
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="rj.cool.dao.StudentMapper"><select id="selectStudent" resultMap="StudentTeacher">SELECT s.id sid ,s.name sname ,t.id tid,t.name tname FROM student s,teacher t WHERE s.tid = t.id</select><resultMap id="StudentTeacher" type="rj.cool.bean.Student"><id column="sid" property="id"/><result column="sname" property="name"/><association property="teacher" javaType="rj.cool.bean.Teacher"><id column="tid" property="id"/><result column="tname" property="name"/></association></resultMap>
</mapper>
TeacherMapper.java – Teacher 映射文件对应的接口:
package rj.cool.dao;import rj.cool.bean.Student;
import rj.cool.bean.Teacher;import java.util.List;public interface TeacherMapper {public void addTeacher();public void delTeacher();public void updateTeacher();public Teacher selectTeacher(int id);public List<Teacher> findAllTeacher();public Teacher selectMyStudents(int id);
}
TeacherMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="rj.cool.dao.TeacherMapper"><select id="selectMyStudents" resultMap="TeacherStudent" parameterType="int">SELECT s.id sid ,s.name sname ,t.id tid,t.name tname FROM student s,teacher t WHERE s.tid = t.id and t.id = #{id}</select><!-- column 数据库中表中的字段 --><resultMap id="TeacherStudent" type="rj.cool.bean.Teacher"><id column="tid" property="id"/><result column="tname" property="name"/><collection property="students" ofType="rj.cool.bean.Student"><id column="sid" property="id"/><result column="sname" property="name"/></collection></resultMap><select id="selectTeacher" parameterType="int" resultType="rj.cool.bean.Teacher">select * from teacher where id=#{id}</select>
</mapper>
3、告诉 Mybatis 配置文件去那里找对应的映射文件:
// 在 MyBatis-config.xml 中增加如下内容:<mappers><!-- 一张表对应一个映射文件 ,资源一般都是路径,所以用 '/',包名后面的类名时我们常常选择用'.' --><!-- 映射文件告诉 Mybatis 去哪里找相对应的映射文件--><mapper resource="rj/cool/dao/UserMapper.xml"/><mapper resource="rj/cool/dao/StudentMapper.xml"/><mapper resource="rj/cool/dao/TeacherMapper.xml"/></mappers>
4、测试:
多对一:
@Testpublic void selectStudent() throws IOException {SqlSession session = MyBatisDButils.getSession();
// List<Student> list = session.getMapper(StudentMapper.class).selectStudent();List<Student> list = session.selectList("rj.cool.dao.StudentMapper.selectStudent");for(Student s:list) {System.out.println("sid :" + s.getId() + " sname" + s.getName() + " tid" + s.getTeacher().getId() + " tname" + s.getTeacher().getName() );}session.close();}
效果图:
一对多:
@Testpublic void selectMyStudents() throws IOException {SqlSession session = MyBatisDButils.getSession();Teacher teacher = session.selectOne("rj.cool.dao.TeacherMapper.selectMyStudents",1);;System.out.println("tid:" + teacher.getId() + " tname :" + teacher.getName());
// List<Student> students = session.getMapper(TeacherMapper.class).selectMyStudents(1);List<Student> students = teacher.getStudents();
// List<Student> students = session.selectList("rj.cool.dao.TeacherMapper.selectMyStudents",1);for (Student student : students) {System.out.println("sid :" + student.getId() + " sname" + student.getName());}}
效果图:
后记:
到此,用 resultMap 实现联表的介绍就结束了,在本文中,可能有不足的地方或者疏漏的地方,希望各
位看官发现有误的地方能够悉数指出,在下万分感激。
如需要详细源码的小伙伴,欢迎随时私聊我。
高级MyBatis -- resultMap实现联表(一对多,多对一)相关推荐
- 数据库建表-- 一对多/多对一/一对一/多对多 关系
转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...
- Mybatis联表查询:多对多(注解实现)
1.数据库表结构 2.返回结果类封装 CommentWithTag .java @Getter @Setter @ToString @Builder @AllArgsConstructor @NoAr ...
- 《Mybatis实现数据库多表查询》——————多对一
1.准备工作 1.1数据库准备 在数据库中建立员工表(t_emp)和部门表(t_dept) Idea准备 项目目录结构 1.2.1pom.xml <?xml version="1.0& ...
- mybatis plug 只查id_Mybatis一对多/多对多查询时只查出了一条数据
问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...
- 6.2 、MyBatis 高级映射(resultMap 标签多表联查 , 一对多,多对一关系)
文章目录 一.创建表结构,添加数据,实现表中数据的关联关系 二. association 标签:用于一对一.多对一场景使用 1.实现一对一,多对一关系结果集映射 1.1 按照查询嵌套处理 1.2 按照 ...
- mybatis联表查询的几种方式,association和collection的用法
mybatis的association以及collection的用法 前言: 一.association 的三种用法: 第一种用法:association中使用select 第二种方法,嵌套 resu ...
- 使用Mybatis联表查询的几种方式
mybatis的association以及collection的用法 前言: 在项目中,某些实体类之间肯定有关联关系,比如一对一,一对多等.mybatis 中使用 association 和 coll ...
- Mybatis(第二篇:联表查询)
Mybatis(第二篇:联表查询) 目录 Mybatis(第二篇:联表查询) 一.前期 项目的搭建 1.数据库 2.IDEA项目架构搭建 2.1 pom.xml 2.2 domain包 2.2.1 D ...
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...
最新文章
- Python 是一门动态的、强类型语言
- gitlab备份与恢复操作整理
- 稳定多维table排序
- ci 数据库异常捕获_系统地捕获错误:如何通过4个步骤构建GitLab CI测试管道
- php session bug,thinkphp2.x中session的BUG及解决办法
- #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲...
- (对拍配套)随机生成数据
- U8普及版在win7系统中,UFO报表一点打印或预览就报错
- Apache,mysql,PHP,lanp环境
- R语言绘制中国地图,增加指北针、比例尺和九段线区域小图
- fprintf()函数相关说明
- 2021-2027全球及中国运动营养和体重管理食品行业研究及十四五规划分析报告
- C#语法基础05_switch
- Arrays.asList 转换数组成list集合失败的原因
- 两个long型数据相除结果错误问题解决
- win10自带邮箱怎么服务器,win10系统查看邮箱服务器信息的操作方法
- 力扣1217. 玩筹码
- 认真的雪歌词的c语言编码,认真的雪歌词
- net-java-php-python-医药库存管理系统计算机毕业设计程序
- “今日头条”发展困境与未来发展策略
热门文章
- pg_ctl: 目录 “/pgsql/data“不是一个数据库集群目录 | 致命错误: 角色 “postgres“ 不存在
- Problem 1802 —— 火车调度
- 合工大《数字媒体技术》课程调研报告-视频伪造
- impress.js 中文注释
- UI设计师做好这3点,还怕找不到一份高薪工作??
- html实现富文本编辑器,前端程序员福利,6款轻量级富文本编辑器,轻松实现富文本编辑...
- Java---MyBatis框架
- LM、GN算法原理及实现
- LabVIEW编程LabVIEW开发GSJ四轴运动控制器例程与相关资料
- Mac m1 react native android 环境搭建跳坑