Mybatis一對(duì)多和多對(duì)一處理的深入講解
建表
SQL:
create table teacher(
id int not null,
name varchar(30) default null,
primary key (id)
);
insert into teacher (id, name) values (1, '蔡老師');
create table student(
id int not null ,
name varchar(30) default null,
tid int default null,
constraint fk_tid foreign key (tid) references teacher(id)
);
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);
多對(duì)一處理
- 多個(gè)學(xué)生對(duì)應(yīng)一個(gè)老師
- 對(duì)于學(xué)生這邊而言,關(guān)聯(lián)。即多個(gè)學(xué)生關(guān)聯(lián)一個(gè)老師【多對(duì)一】
- 對(duì)于老師這邊而言,集合。即一個(gè)老師有很多的學(xué)生【一對(duì)多】
mapper
//查詢所有的學(xué)生信息以及對(duì)應(yīng)的老師的信息 List<Student> queryStudentAndTeacher();
實(shí)體類
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
//學(xué)生需要關(guān)聯(lián)一個(gè)老師
private Teacher teacher;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
}
按照查詢嵌套處理
<!--思路:
1.查詢所有的學(xué)生
2.根據(jù)查詢出來(lái)的學(xué)生的tid尋找對(duì)應(yīng)的老師 尋找對(duì)應(yīng)的老師,子查詢
-->
<resultMap id="rStuAndTea" type="student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- 復(fù)雜的屬性我們需要單獨(dú)處理
指定屬性的類型
對(duì)象使用association javaType
集合使用collection ofType
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="queryStudentAndTeacher" resultMap="rStuAndTea">
select * from student
</select>
<select id="getTeacher" resultType="teacher">
select * from teacher where id = #{id}
</select>
按照結(jié)果嵌套處理
<!--方式二 按照結(jié)果嵌套處理-->
<resultMap id="rStuAndTea2" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
<select id="queryStudentAndTeacher2" resultMap="rStuAndTea2">
select s.id sid, s.name sname, t.name tname
from student s, teacher t
where s.tid = t.id
</select>
回顧Mysql多對(duì)一查詢方式
- 子查詢
- 聯(lián)表查詢
一對(duì)多處理
- 一個(gè)老師有多個(gè)學(xué)生
- 對(duì)于老師這邊而言,集合。即一個(gè)老師有很多的學(xué)生【一對(duì)多】
mapper
//查詢指定老師的信息及其所有的學(xué)生
Teacher queryTeaAndStu(@Param("tid") int id);
實(shí)體類
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
//一個(gè)老師擁有多個(gè)學(xué)生
private List<Student> students;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}
按照查詢嵌套處理
<!--按照結(jié)果嵌套查詢-->
<resultMap id="rTeaAndStu" 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>
<select id="queryTeaAndStu" resultMap="rTeaAndStu">
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 = #{tid}
</select>
按照查詢嵌套處理
<!--按照查詢嵌套處理-->
<select id="queryTeaAndStu2" resultMap="rTeaAndStu2">
select * from teacher where id = #{tid}
</select>
<resultMap id="rTeaAndStu2" type="teacher">
<collection property="students" javaType="ArrayList" ofType="Student"
select="queryStudentByTeacherId" column="id"/>
</resultMap>
<select id="queryStudentByTeacherId" resultType="Student">
select * from student where tid = #{tid}
</select>
結(jié)果映射

面試高頻點(diǎn)
- MySQL引擎
- InnoDB底層原理
- 索引
- 索引優(yōu)化
小結(jié)
- 關(guān)聯(lián) - association 【多對(duì)一】
- 集合 - collection 【一對(duì)多】
- javaType & ofType
- javaType 用來(lái)指定實(shí)體類中屬性的類型
- ofType 用來(lái)指定映射到List或者集合中的entity類型,泛型中的約束類型
注意點(diǎn):
- 保證SQL的可讀性,盡量保證通俗易懂
- 注意一對(duì)多和多對(duì)一中屬性名和字段的問(wèn)題
- 如果問(wèn)題不好排查錯(cuò)誤,可以使用LOG4J日志
總結(jié)
到此這篇關(guān)于Mybatis一對(duì)多和多對(duì)一處理的文章就介紹到這了,更多相關(guān)Mybatis一對(duì)多和多對(duì)一處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一篇文章教你如何用多種迭代寫法實(shí)現(xiàn)二叉樹(shù)遍歷
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)二叉樹(shù)遍歷的迭代算法,包括二叉樹(shù)的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下2021-08-08
log4j2的高并發(fā)死鎖問(wèn)題配置優(yōu)化方式
這篇文章主要介紹了log4j2的高并發(fā)死鎖問(wèn)題配置優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot實(shí)現(xiàn)接口參數(shù)加密解密的示例代碼
加密解密本身并不是難事,問(wèn)題是在何時(shí)去處理?SpringMVC?中給我們提供了?ResponseBodyAdvice?和?RequestBodyAdvice,利用這兩個(gè)工具可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理,非常方便。廢話不多說(shuō),我們一起來(lái)學(xué)習(xí)一下2022-09-09
Feign如何解決服務(wù)之間調(diào)用傳遞token
這篇文章主要介紹了Feign如何解決服務(wù)之間調(diào)用傳遞token,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
idea一招搞定同步所有配置(導(dǎo)入或?qū)С鏊信渲?
使用intellij idea很長(zhǎng)一段時(shí)間,軟件相關(guān)的配置也都按照自己習(xí)慣的設(shè)置好,如果需要重裝軟件,還得需要重新設(shè)置,本文就詳細(xì)的介紹了idea 同步所有配置,感興趣的可以了解一下2021-07-07
Java 單向隊(duì)列及環(huán)形隊(duì)列的實(shí)現(xiàn)原理
本文主要介紹了Java 單向隊(duì)列及環(huán)形隊(duì)列的實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

