失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > MyBatis08:ResultMap 的结果集映射 面试官问的那些Java原理你都懂吗

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

时间:2022-10-23 00:03:52

相关推荐

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

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 TABLEteacher(

idINT(10) NOT NULL,

nameVARCHAR(30) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=INNODB DEFAULT CHARSET=utf8;

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

CREATE TABLEstudent(

idINT(10) NOT NULL,

nameVARCHAR(30) DEFAULT NULL,

tidINT(10) DEFAULT NULL,

PRIMARY KEY (id),

FOREIGN KEY (tid) REFERENCESteacher(id)

) ENGINE=INNODB DEFAULT CHARSET=utf8;

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

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

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

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

INSERT INTOstudent(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原理你都懂吗》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。