ResultMap的使用

在Mybatis中,可以使用resultMap(结果集映射)作为sql的返回类型

一般用来解决如下问题:

  • 数据库表字段名和实体类属性名不一致的问题;
  • 多对一问题:
    • 例如:多个学生对应同一个老师,查询每个学生信息(包含老师对象属性)
  • 一对多问题:
    • 例如:一个老师教学多个学生,查询某个老师信息及其属下学生(包含学生列表)

1、字段名和属性名不一致问题

数据库表字段名和实体类属性名不一致的问题处理

  1. id name pwd //数据库字段名
  2. id name password //实体类属性名

Mapper中SQL语句编写如下:

  1. <!--结果集映射-->
  2. <resultMap id="UserMap" type="User">
  3. <!--column为数据库中的字段名,property为实体中的属性-->
  4. <result column="id" property="id"/>
  5. <result column="name" property="name"/>
  6. <result column="pwd" property="password"/>
  7. </resultMap>
  8. <select id="getUserById" resultType="UserMap">
  9. select * from mybatis.user where id=#{id};
  10. </select>

2、多对一处理

获得所有学生及其对应老师(多个学生对应一个老师)

Student类

  1. @Data //get,set
  2. @NoArgsConstructor //无参构造
  3. @AllArgsConstructor //有参构造
  4. public class Student{
  5. int id;
  6. String name;
  7. Teacher teacher;
  8. }

Teacher类

  1. @Data //get,set
  2. @NoArgsConstructor //无参构造
  3. @AllArgsConstructor //有参构造
  4. public class Teacher{
  5. int id;
  6. String name;
  7. public Teacher() {
  8. }
  9. public Teacher(int id, String name) {
  10. this.id = id;
  11. this.name = name;
  12. }
  13. }

按照结果集嵌套处理

联表查询

  1. <select id="getStudents" resultMap="StudentMap">
  2. select s.id sid, s.name sname, t.name tname
  3. from student s
  4. join teacher t
  5. on s.tid = t.id
  6. </select>
  7. <resultMap id="StudentMap" type="Student">
  8. <!--这里的column是与查询结果的字段名对应,字段重命名了则对应命名后的字段-->
  9. <result property="id" column="sid"/>
  10. <result property="name" column="sname"/>
  11. <!--复杂的属性需要单独处理 对象:association 集合:collection-->
  12. <association property="teacher" javaType="Teacher">
  13. <result property="name" column="tname"/>
  14. </association>
  15. </resultMap>

按照查询嵌套处理

相当于子查询:

  1. <select id="getStudent2" resultMap="StudentMap2">
  2. select * from student;
  3. </select>
  4. <select id="getTeacher" resultType="Teacher">
  5. select * from teacher where id = #{tid};
  6. </select>
  7. <!--这里将学生和对应老师分开查询,将查询结果组合-->
  8. <resultMap id="StudentMap2" type="Student">
  9. <result property="id" column="sid"/>
  10. <result property="name" column="sname"/>
  11. <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
  12. </resultMap>

查询结果:

  1. Student{id=1, name='zhangsan', teacher=Teacher{id=1, name='spong'}}
  2. Student{id=2, name='lisi', teacher=Teacher{id=1, name='spong'}}

3、一对多处理

按指定ID查询老师及其所管理的学生(一个老师对应多个学生)

Student类

  1. @Data //get,set
  2. @NoArgsConstructor //无参构造
  3. @AllArgsConstructor //有参构造
  4. public class Student {
  5. int id;
  6. String name;
  7. int tid;
  8. public Student() {
  9. }
  10. public Student(int id, String name, int tid) {
  11. this.id = id;
  12. this.name = name;
  13. this.tid = tid;
  14. }
  15. }

Teacher类

  1. @Data //get,set
  2. @NoArgsConstructor //无参构造
  3. @AllArgsConstructor //有参构造
  4. public class Teacher {
  5. int id;
  6. String name;
  7. List<Student> students;
  8. }

按照结果嵌套处理

  1. <select id="getTeacherById" resultMap="TeacherById">
  2. select t.id id, t.name tname, s.id sid,s.name sname,s.tid tid
  3. from teacher t
  4. join student s
  5. on t.id = s.tid;
  6. </select>
  7. <resultMap id="TeacherById" type="Teacher">
  8. <result property="id" column="id"/>
  9. <result property="name" column="tname"/>
  10. <!--获取List<Student>中的泛型使用 ofType-->
  11. <collection property="students" ofType="Student">
  12. <result property="id" column="sid"/>
  13. <result property="name" column="sname"/>
  14. <result property="tid" column="tid"/>
  15. </collection>
  16. </resultMap>

查询结果:

  1. [Teacher{id=1, name='spong', students=[Student{id=1, name='zhangsan', tid=1}, Student{id=2, name='lisi', tid=1}]}]

小结:

  • 关联:association【多对一】
  • 集合:collection【一对多】
  • javaType & ofType
    • javaType 用来指定实体类中属性的类型
    • ofType 用来指定映射到List或者集合中pojo类型,即泛型的类型

Mybatis——ResultMap(结果集映射)的使用的更多相关文章

  1. Mybatis学习笔记-ResultMap结果集映射

    解决属性名与字段名不一致的问题 新建项目 --> 测试实体类字段不一致的情况 数据库字段:id,name,pwd 实体类属性:id,name,password 输出结果 User{id=1, n ...

  2. mybatis百科-结果集映射类ResultMap

    目录 1 成员变量 2 构造函数 3 其他函数 3.1 setter 和 getter 函数 4 静态内部类 4.1 成员变量 4.2 构造函数 4.3 建造者相关的函数 4.4 获取配置的构造方法参 ...

  3. resultMap结果集映射解决属性名和字段不一致问题

    解决属性名和字段名不一致的问题 1.出现的问题 数据库中的字段 ​ 新建一个项目,拷贝之前的,测试实体类与数据库字段不一致的情况 public class User { private int id; ...

  4. mybatis resultmap标签type属性什么意思

    mybatis resultmap标签type属性什么意思? :就表示被转换的对象啊,被转换成object的类型啊 <resultMap id="BaseResultMap" ...

  5. mybatis ResultMap详解

    前言 MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而res ...

  6. mybatis - resultMap

    resultMap有比较强大的自动映射,下面是摘自mybatis中文官网的的片段: 当自动映射查询结果时,MyBatis会获取sql返回的列名并在java类中查找相同名字的属性(忽略大小写). 这意味 ...

  7. mybatis resultMap映射学习笔记

    这几天,百度mybatis突然看不到官网了,不知道百度怎么整的.特此贴出mybatis中文官网: http://www.mybatis.org/mybatis-3/zh/index.html 一个学习 ...

  8. Mybatis resultMap空值映射问题解决

    Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的 ...

  9. ibatis resultMap 结果集映射

    1.结果集映射 就是将返回的记录,逐个字段映射到java对象上:如果数据库字段与java对象的成员变量名对应的话,则使用resultClas即可 2.实现 结合 ibatis初探这篇文章中提到的pro ...

随机推荐

  1. Ethical Hacking - GAINING ACCESS(7)

    Server Side Attacks - NEXPOSE NeXpose is a vulnerability management framework, it allows us to disco ...

  2. Puppeteer爬虫实战(二)

    连接浏览器 上一篇说到了Puppeteer本质是使用了Chrome Devtools协议控制浏览器,本篇就说说连接方式. 常规Hook浏览器 此方式其实就是需要一个浏览器可执行文件(不同平台需要下载对 ...

  3. 究竟什么时候该使用MQ?

    究竟什么时候该使用MQ? 原创: 58沈剑 架构师之路  昨天 任何脱离业务的组件引入都是耍流氓.引入一个组件,最先该解答的问题是,此组件解决什么问题. MQ,互联网技术体系中一个常见组件,究竟什么时 ...

  4. IntelliJ IDEA 2019.3.4永久破解(持续更新)--已更新

    第一步,下载最新破解包: 链接: https://pan.baidu.com/s/1djUF9TiNZC4rIfxczxfIew 提取码: f521 把破解包两个文件放进bin目录下,这一步极为重要! ...

  5. layui实现图片上传

    页面代码: <style> .uploadImgBtn2{ width: 120px; height: 92px; cursor: pointer; position: relative; ...

  6. luogu P5473 [NOI2019]I 君的探险 交互 随机 二分 分治 整体二分

    LINK:I 君的探险 神仙题! 考虑一个暴力的做法 每次点亮一个点 询问全部点 这样询问次数为 \(\frac{n\cdot (n-1)}{2}\) 可以通过前5个点. 考虑都为A的部分分 发现一个 ...

  7. Asp.Net项目发布 到 IIS、 Core3.1 发布到 IIS CentOS8.x

    摘要:发布项目到IIS或者.Net Core 项目发布到IIS服务器或者CentOS记录一下,后面忘了又来看看. 1.服务器安装IIS 1.1.不管你是本地的电脑还是网上购买的服务器,只要是能通过远程 ...

  8. 关于tf.cond函数中“正确”与“错误”函数中的普通python语句始终执行的问题

    import tensorflow as tf import numpy as np x = tf.constant(2) y = tf.constant(3) global mask0 mask0 ...

  9. OJ评测状态

    Pending/Waiting 排队等待中 Pending Rejudge 答案重判中 Compiling 正在编译 Running/Judging 运行判断中 Accepted(AC) 程序通过 C ...

  10. JDK下载和安装教程,超详细

    下载并安装JDK JDK的全称是JavaSE Development Kit,即java开发工具包,是sun公司提供的一套用于开发java应用程序的开发包,它提供了编译.运行java程序所需的各种工具 ...