前言:

结合实际生活来看联表,拿一个习以为常的例子来说,学生和老师:
多个学生对应一个老师 -- 多对一 (当然是在一个课堂上,嘻嘻)
一个老师对应多个学生 -- 一对多 (同上)
在实际操作时,我们需要看到的结果往往不是一个常见的类型(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实现联表(一对多,多对一)相关推荐

  1. 数据库建表-- 一对多/多对一/一对一/多对多 关系

     转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...

  2. Mybatis联表查询:多对多(注解实现)

    1.数据库表结构 2.返回结果类封装 CommentWithTag .java @Getter @Setter @ToString @Builder @AllArgsConstructor @NoAr ...

  3. 《Mybatis实现数据库多表查询》——————多对一

    1.准备工作 1.1数据库准备 在数据库中建立员工表(t_emp)和部门表(t_dept) Idea准备 项目目录结构 1.2.1pom.xml <?xml version="1.0& ...

  4. mybatis plug 只查id_Mybatis一对多/多对多查询时只查出了一条数据

    问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据. 三个表,权限表(Permission),权限组表(Permission ...

  5. 6.2 、MyBatis 高级映射(resultMap 标签多表联查 , 一对多,多对一关系)

    文章目录 一.创建表结构,添加数据,实现表中数据的关联关系 二. association 标签:用于一对一.多对一场景使用 1.实现一对一,多对一关系结果集映射 1.1 按照查询嵌套处理 1.2 按照 ...

  6. mybatis联表查询的几种方式,association和collection的用法

    mybatis的association以及collection的用法 前言: 一.association 的三种用法: 第一种用法:association中使用select 第二种方法,嵌套 resu ...

  7. 使用Mybatis联表查询的几种方式

    mybatis的association以及collection的用法 前言: 在项目中,某些实体类之间肯定有关联关系,比如一对一,一对多等.mybatis 中使用 association 和 coll ...

  8. Mybatis(第二篇:联表查询)

    Mybatis(第二篇:联表查询) 目录 Mybatis(第二篇:联表查询) 一.前期 项目的搭建 1.数据库 2.IDEA项目架构搭建 2.1 pom.xml 2.2 domain包 2.2.1 D ...

  9. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

最新文章

  1. 每天5分钟玩转python3算法:选择排序
  2. boost::sort模块实现跨并行线程的整数排序速度基准的测试程序
  3. c语言穷举算法 枚举法,c语言枚举法 穷举法 ppt课件
  4. HTML文字阴影荧光,小编,文章里的“发光”文字怎么做的?
  5. 对Java中字符串的进一步理解
  6. win7更新_Win7最新更新!由微软亲自集成的安装包来袭!
  7. 【083】毛笔字在线生成器-在线生成几十种毛笔字
  8. 聚类分析原理及R语言实现过程
  9. 人脸识别打卡项目(7)
  10. Java处理时间,得到指定几天前的凌晨0点时间戳
  11. 图数据挖掘--六度分隔
  12. python elif是什么意思_python elif是什么意思
  13. 3D Food Printing【3D食物打印】
  14. 2019秋-走的太久忘记了为什么出发
  15. EKL日志平台架构概括
  16. 如何在游戏中设置游戏的帧率和显示帧率
  17. 湖南师范大学计算机专业研究生读几年,湖南师范大学计算机专业在职研究生培养方式是怎样的?...
  18. 瑞萨电子第一家Preferred Partner-武汉万象奥科
  19. 教你破解Android手机图案锁
  20. 腾讯云点播 - 视频防盗加密 - 使用总结

热门文章

  1. android中在progressBar上添加文字显示百分比进度
  2. C语言绘制足球 世界杯
  3. B.Duck母公司顺利上市,德盈能否孵化更多“小黄鸭”?
  4. SSL是什么?SSL怎么用?
  5. 神奇的网站安全狗,我的网站守护神!
  6. linux中写crontab脚本,Linux中crond服务与crontab用法
  7. 解析java异常中的finally关键字
  8. 主副路由器的两种方式
  9. 【PHP】php Composer 安装使用
  10. Spring Security(2)——remember me