MyBatis中多對(duì)一和一對(duì)多數(shù)據(jù)的處理方法
多對(duì)一的處理
多對(duì)一的理解:
- 多個(gè)學(xué)生對(duì)應(yīng)一個(gè)老師
- 如果對(duì)于學(xué)生這邊,就是一個(gè)多對(duì)一的現(xiàn)象,即從學(xué)生這邊關(guān)聯(lián)一個(gè)老師!
1、數(shù)據(jù)庫(kù)設(shè)計(jì)

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`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小紅', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小張', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');2、搭建測(cè)試環(huán)境
【Lombok的使用】
1. IDEA安裝Lombok插件
2. 引入Maven依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>3. 在代碼中增加注解
@Data
public class Teacher {
private int id;
private String name;
}@Data
public class Student {
private int id;
private String name;
//多個(gè)學(xué)生可以是同一個(gè)老師,即多對(duì)一
private Teacher teacher;
}4. 編寫實(shí)體類對(duì)應(yīng)的Mapper接口 【兩個(gè)】
無論有沒有需求,都應(yīng)該寫上,以備后來之需!
public interface StudentMapper {
}public interface TeacherMapper {
}5. 編寫Mapper接口對(duì)應(yīng)的 mapper.xml配置文件 【兩個(gè)】
無論有沒有需求,都應(yīng)該寫上,以備后來之需!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hang.mapper.StudentMapper">
</mapper><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hang.mapper.TeacherMapper">
</mapper>3、按查詢嵌套處理
1. 給StudentMapper接口增加方法
//獲取所有學(xué)生及對(duì)應(yīng)老師的信息 public List<Student> getStudents();
2. 編寫對(duì)應(yīng)的Mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hang.mapper.StudentMapper">
<select id="getStudents" resultMap="studentTeacher">
select * from mybatis.student;
</select>
<resultMap id="studentTeacher" type="student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--association關(guān)聯(lián)屬性 property屬性名 javaType屬性類型 column在多的一方的表中的列名-->
<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="teacher">
select * from mybatis.teacher;
</select>
</mapper>3. 編寫完畢去Mybatis配置文件中,注冊(cè)Mapper!
4.測(cè)試
@Test
public void getStudents(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students= mapper.getStudents();
for (Student student : students) {
System.out.println(
"學(xué)生名:"+ student.getName()
+"\t老師:"+student.getTeacher().getName());
}
sqlSession.close();
}4 、按結(jié)果嵌套處理
除了上面這種方式,還有其他思路嗎?
我們還可以按照結(jié)果進(jìn)行嵌套處理;
1. 接口方法編寫
public List<Student> getStudents2();
2. 編寫對(duì)應(yīng)的mapper文件
<select id="getStudents2" resultMap="studentTeacher2">
select s.id sid, s.name sname, t.id tid, t.name tname
from mybatis.student s, mybatis.teacher t
where t.id = s.tid
</select><br>
<resultMap id="studentTeacher2" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>3. 去mybatis-config文件中注入【此處應(yīng)該處理過了】
4. 測(cè)試
@Test
public void getStudents2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students= mapper.getStudents2();
for (Student student : students) {
System.out.println(
"學(xué)生名:"+ student.getName()
+"\t老師:"+student.getTeacher().getName());
}
sqlSession.close();
} 5、小結(jié)
- 按照查詢進(jìn)行嵌套處理就像SQL中的子查詢
- 按照結(jié)果進(jìn)行嵌套處理就像SQL中的聯(lián)表查詢
一對(duì)多的處理
一對(duì)多的理解:
一個(gè)老師擁有多個(gè)學(xué)生如果對(duì)于老師這邊,就是一個(gè)一對(duì)多的現(xiàn)象,即從一個(gè)老師下面擁有一群學(xué)生(集合)!
1、實(shí)體類編寫
@Data
public class Student {
private int id;
private String name;
private int tid;
}@Data
public class Teacher {
private int id;
private String name;
//一個(gè)老師多個(gè)學(xué)生
private List<Student> students;
}和之前一樣,搭建測(cè)試的環(huán)境!
2、按結(jié)果嵌套處理
1. TeacherMapper接口編寫方法
//獲取指定老師,及老師下的所有學(xué)生 public Teacher getTeacher(int id);
2. 編寫接口對(duì)應(yīng)的Mapper配置文件
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid, s.name sname, t.id tid, t.name tname
from mybatis.teacher t, mybatis.student s
where t.id = s.tid and t.id = #{tid};
</select>
<resultMap id="TeacherStudent" type="teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>3. 將Mapper文件注冊(cè)到MyBatis-config文件中
4. 測(cè)試
@Test
public void testGetTeacher(){
SqlSession session = MybatisUtils.getSession();
TeacherMapper mapper = session.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher.getName());
System.out.println(teacher.getStudents());
}3、按查詢嵌套處理
1. TeacherMapper接口編寫方法
public Teacher getTeacher2(int id);
2. 編寫接口對(duì)應(yīng)的Mapper配置文件
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<!--column是一對(duì)多的外鍵 , 寫的是一的主鍵的列名-->
<collection property="students" javaType="ArrayList" ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from student where tid = #{id}
</select>3. 將Mapper文件注冊(cè)到MyBatis-config文件中
4. 測(cè)試
@Test
public void testGetTeacher2(){
SqlSession session = MybatisUtils.getSession();
TeacherMapper mapper = session.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher2(1);
System.out.println(teacher.getName());
System.out.println(teacher.getStudents());
}4、小結(jié)
關(guān)聯(lián)-association集合-collection所以association是用于一對(duì)一和多對(duì)一,而collection是用于一對(duì)多的關(guān)系JavaType和ofType都是用來指定對(duì)象類型的
- 關(guān)聯(lián)-association
- 集合-collection
- 所以association是用于一對(duì)一和多對(duì)一,而collection是用于一對(duì)多的關(guān)系
- JavaType和ofType都是用來指定對(duì)象類型的
- JavaType是用來指定pojo中屬性的類型
- ofType指定的是映射到list集合屬性中pojo的類型。
注意說明:
- 保證SQL的可讀性,盡量通俗易懂
- 根據(jù)實(shí)際要求,盡量編寫性能更高的SQL語句
- 注意屬性名和字段不一致的問題
- 注意一對(duì)多和多對(duì)一 中:字段和屬性對(duì)應(yīng)的問題
- 盡量使用Log4j,通過日志來查看自己的錯(cuò)誤
到此這篇關(guān)于MyBatis中多對(duì)一和一對(duì)多數(shù)據(jù)的處理的文章就介紹到這了,更多相關(guān)MyBatis多對(duì)一和一對(duì)多處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在MyBatis中實(shí)現(xiàn)一對(duì)多查詢和多對(duì)一查詢的方式詳解(各兩種方式)
- Mybatis一對(duì)多和多對(duì)一處理的深入講解
- MyBatis如何實(shí)現(xiàn)多表查詢(多對(duì)一、一對(duì)多)
- Mybatis一對(duì)多與多對(duì)一查詢處理詳解
- MyBatisPlus 一對(duì)多、多對(duì)一、多對(duì)多的完美解決方案
- Mybatis關(guān)聯(lián)查詢之一對(duì)多和多對(duì)一XML配置詳解
- mybatis關(guān)系映射之一對(duì)多和多對(duì)一
- Mybatis 一對(duì)多和多對(duì)一關(guān)聯(lián)查詢問題
相關(guān)文章
java中實(shí)現(xiàn)漢字按照拼音排序(示例代碼)
這篇文章主要是對(duì)java中將漢字按照拼音排序的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
使用VS?Code進(jìn)行java開發(fā)與調(diào)試的圖文教程
這篇文章主要介紹了如何在計(jì)算機(jī)上安裝JDK、VSCode以及Java擴(kuò)展包,并詳細(xì)說明了配置Java運(yùn)行環(huán)境的過程,還展示了如何在VSCode中新建一個(gè)Java項(xiàng)目,需要的朋友可以參考下2025-02-02
解決@RequestBody使用不能class類型匹配的問題
這篇文章主要介紹了解決@RequestBody使用不能class類型匹配的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
springboot如何使用logback-spring配置日志格式,并分環(huán)境配置
這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java實(shí)現(xiàn)的日期處理類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的日期處理類,結(jié)合完整實(shí)例形式分析了Java針對(duì)日期的獲取、運(yùn)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Springboot整合Mybatispuls的實(shí)例詳解
這篇文章主要介紹了Springboot整合Mybatispuls的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

