• 1 ResultMap 的结果集映射

    • 1.1 ResultMap 的使用
  • 1.2 多对一的处理

    • 1.2.1 需求
  • 1.2.2 建表

  • 1.2.3 建立实体类

  • 1.2.4 编写对应的 Mapper 接口

  • 1.2.5 编写对应的 Mapper.xml 文件

  • 1.2.6 在 MyBatis 配置文件中绑定对应的 Mapper 接口

  • 1.2.7 利用 ResultMap 实现需求

  • 1.2.8 编写测试类测试

  • 1.3 一对多的处理

    • 1.3.1 需求
  • 1.3.2 SQL 语句

  • 1.3.3 建立实体类

  • 1.3.4 编写对应的 Mapper 接口

  • 1.3.5 编写对应的 Mapper.xml 文件

  • 1.3.6 在 MyBatis 配置文件中绑定对应的 Mapper 接口

  • 1.3.7 利用 ResultMap 实现需求

  • 1.3.8 编写测试类测试

  • 1.4 总结

1 ResultMap 的结果集映射

=====================================================================================

1.1 ResultMap 的使用


在 xml 中有两个结果集,一个是 resultType,另一个是 resultMap。前者表示的是具体类型的结果,后者则是将结果集映射。

还记得在 JavaWeb 中,自己老是不能将某一个字段的值注入到 JavaBean 中吗?原因就是这两者的名称不同,而 ResultMap 就实现了即使两者名称不同,依旧可以将数据库中的值注入到 JavaBean 中。

示例:数据库中 User 表中密码的字段是 password,而对应的 JavaBean 的变量名是 pwd,这个时候,是不能表中的值注入到 JavaBean 中的。

解决方法为

select * from mybatis.user

其中,resultMap 中的属性是单一属性,所以比较好理解,接下来,将详细说明该属性是一个对象的情况。

1.2 多对一的处理


1.2.1 需求

有两张表,其中一张是学生表,另一张是老师表,其中多个学生对应一个老师,现在想查询所有学生及对应老师的信息

即如下结果:

1.2.2 建表

利用 SQL 语句建立如上的两张表用来测试:

CREATE TABLE teacher (

id INT(10) NOT NULL,

name VARCHAR(30) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO teacher(id, name) VALUES (1, ‘赵老师’);

CREATE TABLE student (

id INT(10) NOT NULL,

name VARCHAR(30) DEFAULT NULL,

tid INT(10) DEFAULT NULL,

PRIMARY KEY (id),

FOREIGN KEY (tid) REFERENCES teacher (id)

) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO student (id, name, tid) VALUES (‘1’, ‘Sharm’, ‘1’);

INSERT INTO student (id, name, tid) VALUES (‘2’, ‘Luma’, ‘1’);

INSERT INTO student (id, name, tid) VALUES (‘3’, ‘Lilei’, ‘1’);

INSERT INTO student (id, name, tid) VALUES (‘4’, ‘Noma’, ‘1’);

INSERT INTO student (id, name, tid) VALUES (‘5’, ‘Yiha’, ‘1’);

此时,如果想得到需求的结果,是可以直接用 SQL 语句得到的,如:

select s.id , s.name student_name, t.name teacher_name

from student s, teacher t

where s.tid = t.id;

但要想清楚,怎么使用 MyBatis 得到如上结果?继续看下去吧。

1.2.3 建立实体类

在实际工作中,无论有没有需求,都应该写上,以备后来之需

下面的实体类我只书写属性部分,因为后面的 getter、setter 等方法都是相同的。

1)Teacher 实体类

public class Teacher {

private int id;

private String name;

}

2)Student 实体类

public class Student {

private int id;

private String name;

private Teacher teacher;

}

1.2.4 编写对应的 Mapper 接口

package sharm.dao;

import sharm.pojo.Student;

import java.util.List;

public interface StudentsMapper {

List selectStudents();

}

1.2.5 编写对应的 Mapper.xml 文件

为了便于阅读,我们在 main 文件夹中存放接口,在 resource 文件夹中存放 xml 文件,在编译后,会发现两者是在同一个文件下的。

代码内容见本章 9.2.7 小节。

1.2.6 在 MyBatis 配置文件中绑定对应的 Mapper 接口

1.2.7 利用 ResultMap 实现需求

1)按照结果进行嵌套处理

<?xml version="1.0" encoding="UTF-8" ?>

select s.id sid, s.name sname , t.name tname

from student s,teacher t

where s.tid = t.id

2)按照查询进行嵌套处理

<?xml version="1.0" encoding="UTF-8" ?>

select * from mybatis.student

select * from mybatis.teacher where id = #{tid}

1.2.8 编写测试类测试

@Test

public void testSelectStudents(){

SqlSession sqlSession = MyBatisUtils.getSession();

StudentsMapper mapper = sqlSession.getMapper(StudentsMapper.class);

List students = mapper.selectStudents();

for (Student student: students) {

System.out.println(student);

}

sqlSession.close();

}

1.3 一对多的处理


1.3.1 需求

有两张表,其中一张是学生表,另一张是老师表,其中一个老师对应多个学生,现在想查询一个老师及对应所有学生的信息

1.3.2 SQL 语句

此时,如果想得到需求的结果,是可以直接用 SQL 语句得到的,如:

select s.id sid, s.name sname , t.name tname, t.id tid

from student s,teacher t

where s.tid = t.id and t.id= 1;

但该怎么使用 MyBatis 得到如上结果呢?继续看下去吧。

1.3.3 建立实体类

1)Teacher 实体类

public class Teacher {

private int id;

private String name;

private List Students;

}

2)Student 实体类

public class Student {

private int id;

private String name;

// 对应老师的 ID 号

private int tid;

}

1.3.4 编写对应的 Mapper 接口

MyBatis08:ResultMap 的结果集映射,面试官问的那些Java原理你都懂吗相关推荐

  1. 【吐血整理】面试官问的那些Java原理你都懂吗

    Spring思维导图 Spring源码学习笔记 有关微服务的面试题: Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么? Dubbo 的整体架构设计有哪些 ...

  2. 面试官问:为什么 Java 线程没有 Running 状态?我懵了

    转载自 面试官问:为什么 Java 线程没有 Running 状态?我懵了 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNN ...

  3. 面试官问:为什么 Java 线程没有Running状态?我懵了

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 title: 面 ...

  4. 面试官问:一个Java字符串中到底能有多少个字符?

    作者 | 鸟窝 来源 | urlify.cn/qYNR3q 依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \u0000 (0),最大值是\uffff(65535) ...

  5. 面试官问你为什么离职,HR都认可的离职原因,你学会了吗?

    文章目录 ⭕参考话术 ✅1. 实际离职原因:`上一家公司钱给的太少了` 离职原因可以这样说: ✅2. 实际离职原因:` 跟同事处不来` ✅3. 实际离职原因:`扯皮甩锅大战` 离职原因可以说: ✅4. ...

  6. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了

    点击上方"占小狼的博客",选择"设为星标" 本文阅读时间大约4分钟. 来源:https://dwz.cn/dLRLBZab Java虚拟机层面所暴露给我们的状态 ...

  7. java反射 虚拟机优化_面试官问我:Java反射是什么?我回答竟然不上来......

    每天凌晨00点00分,第一时间与你相约 每日英文 We all have moments of desperation. But if we can face them head on, that's ...

  8. 当面试官问我Mybatis初始化原理时,我笑了

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. MyBatis的初始化做了什么 MyBatis基于XML配置文件创建C ...

  9. inputstream 初始化_如何完美回答面试官问的Mybatis初始化原理!

    前言 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. MyBatis的初始化做了什么 MyBatis基于XML配置文件 ...

最新文章

  1. 隐藏17年的Office远程代码执行漏洞(CVE-2017-11882)
  2. 快速接入 GitHub、QQ 第三方登录方式
  3. node 生成随机头像_微信头像新玩法?二次元头像自己捏,每款都独一无二
  4. jQuery load()方法特殊用法!
  5. 浏览器是指在用户计算机上,自考《网页设计与制作》测试题及答案
  6. python 反射机制
  7. np.unique( )--去除数组中的重复数字,并进行排序之后输出
  8. Java进阶篇设计模式之一 ----- 单例模式
  9. 使用DAO模式实现电子宠物数据更新
  10. NOR Flash 和 NAND Flash 闪存详解
  11. android GMS介绍
  12. 从键盘输入若干个学生成绩,计算出平均成绩。
  13. 不同图像的噪声,选用什么滤波器去噪,图像处理的噪声和处理方法
  14. IT民工系列 —— 前言
  15. 麒麟操作系统安装/卸载微信
  16. mui用ajax上拉加载更多,mui 中的一个上拉加载及下拉刷新的方法 ,但是我使用ajax拿不到url中的数据,是为什么?...
  17. matlab 中trace,trace命令和tracert命令的用途 matlab中的trace 怎么用的?
  18. CGAN模型——pytorch实现
  19. apa引用要在文中吗_引用还是抄袭?80%的大学生都搞不懂的学术写作!
  20. 全力以赴地完成书稿中

热门文章

  1. 阶乘计算(Java版)
  2. PDF阅读授权解决方法
  3. 2022 虎年春节寄语
  4. 【机器学习】决策树案例二:利用决策树进行鸢尾花数据集分类预测
  5. 基于STM32 电机库(5.4.4)的单电阻采样调试总结
  6. 什么是TCN?什么时候会发送TCN消息?
  7. uni-app调手机系统的GPS定位服务
  8. Struts2框架中的Action接口和ActionSupport类
  9. php yaf环境启动,yaf框架教程(3)- yaf框架环境配置
  10. 【渝粤题库】陕西师范大学192202 信息技术课程与教学论 作业