MyBatis多對(duì)多一對(duì)多關(guān)系查詢嵌套處理
1. 數(shù)據(jù)準(zhǔn)備
數(shù)據(jù)庫
student 數(shù)據(jù)庫字段:
id int(10)
name varchar(30)
tid int(10)
teacher 數(shù)據(jù)庫字符:
id int(10)
name varchar(30)
實(shí)體類
Student:
@Data
public class Student {
private int id;
private String name;
private Teacher teacher;
}Teacher:
@Data
public class Teacher {
private int id;
private String name;
}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`),
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');實(shí)體接口
編寫實(shí)體類對(duì)應(yīng)的Mapper接口 【兩個(gè)】
public interface StudentMapper {
}
public interface TeacherMapper {
}mapper.xml
編寫Mapper接口對(duì)應(yīng)的 mapper.xml配置文件
StudentMapper.xml:
<?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.kuang.mapper.StudentMapper">
</mapper>TeacherMapper.xml:
<?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.kuang.mapper.TeacherMapper">
</mapper>2.一對(duì)多的關(guān)系
多個(gè)學(xué)生對(duì)應(yīng)一個(gè)老師.
2.1 按查詢嵌套處理
1、給StudentMapper接口增加方法:
//獲取所有學(xué)生及對(duì)應(yīng)老師的信息 public List<Student> getStudents();
- 編寫對(duì)應(yīng)的Mapper文件:
<mapper namespace="com.dao.StudentMapper">
<!--
需求:獲取所有學(xué)生及對(duì)應(yīng)老師的信息
思路:
1. 獲取所有學(xué)生的信息
2. 根據(jù)獲取的學(xué)生信息的老師ID->獲取該老師的信息
3. 思考問題,這樣學(xué)生的結(jié)果集中應(yīng)該包含老師,該如何處理呢,數(shù)據(jù)庫中我們一般使用關(guān)聯(lián)查詢?
1. 做一個(gè)結(jié)果集映射:StudentTeacher
2. StudentTeacher結(jié)果集的類型為 Student
3. 學(xué)生中老師的屬性為teacher,對(duì)應(yīng)數(shù)據(jù)庫中為tid。
多個(gè) [1,...)學(xué)生關(guān)聯(lián)一個(gè)老師=> 一對(duì)一,一對(duì)多
4. 查看官網(wǎng)找到:association – 一個(gè)復(fù)雜類型的關(guān)聯(lián);使用它來處理關(guān)聯(lián)查詢
-->
<select id="getStudents" resultMap="studentAllInfo" >
select * from student
</select>
<resultMap id="studentAllInfo" type="com.pojo.Student">
<result column="id" property="id" />
<result column="name" property="name" />
<!--association關(guān)聯(lián)屬性 property屬性名 javaType屬性類型 column在多的一方的表中的列名-->
<association property="teacher" column="tid" javaType="com.pojo.Teacher" select="getTeacher" />
</resultMap>
<!--
這里傳遞過來的id,只有一個(gè)屬性的時(shí)候,下面可以寫任何值
association中column多參數(shù)配置:
column="{key=value,key=value}"
其實(shí)就是鍵值對(duì)的形式,key是傳給下個(gè)sql的取值名稱,value是片段一中sql查詢的字段名。
-->
<select id="getTeacher" resultType="com.pojo.Teacher">
select * from teacher where id = #{tid}
</select>
</mapper>2.2 按結(jié)果嵌套處理
- 接口方法編寫:
public List<Student> getStudents2(); - StudentMapper.xml:
<select id="getStudents2" resultMap="STInfo">
select s.id sid, s.name sname, t.id tid, t.name tname
from student s, teacher t
where s.tid = t.id
</select>
<resultMap id="STInfo" type="com.pojo.Student">
<result property="id" column="sid"/>
<result property="name" column="sname" />
<association property="teacher" javaType="com.pojo.Teacher">
<result property="id" column="tid" />
<result property="name" column="tname" />
</association>
</resultMap>Test:
@Test
public void testStudent01(){
SqlSession sqlsession = MyBatisUtils.getSqlSession();
StudentMapper studentMapper = sqlsession.getMapper(StudentMapper.class);
List<Student> listStudent = studentMapper.getStudents2();
for (Student student : listStudent) {
System.out.println(student);
}
}3. 多對(duì)一的關(guān)系
一個(gè)老師對(duì)應(yīng)多個(gè)學(xué)生
數(shù)據(jù)準(zhǔn)備
Student
@Data
public class Student {
private int id;
private String name;
// private Teacher teacher;
private int tid;
}Teacher
@Data
public class Teacher {
private int id;
private String name;
// 一個(gè)老師擁有多個(gè)學(xué)生
private List<Student> studentList;
}3.1 按結(jié)果嵌套處理
Mapper接口
TeacherMapper接口編寫方法:
//獲取指定老師,及老師下的所有學(xué)生 public Teacher getTeacher(int id);
編寫接口對(duì)應(yīng)的Mapper配置文件
<mapper namespace="com.dao.TeacherMapper">
<!--
思路:
1. 從學(xué)生表和老師表中查出學(xué)生id,學(xué)生姓名,老師姓名
2. 對(duì)查詢出來的操作做結(jié)果集映射
* 集合的話,使用collection!
* JavaType和ofType都是用來指定對(duì)象類型的
* JavaType是用來指定pojo中屬性的類型
* ofType指定的是映射到list集合屬性中pojo的類型。
-->
<select id="getTeacher" resultMap="TeacherStuent" >
select s.id sid, s.name sname, t.id tid, t.name tname from student s, teacher t
where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id="TeacherStuent" type="com.pojo.Teacher">
<result property="id" column="tid" />
<result property="name" column="tname" />
<!--集合的話,使用collection
property : 對(duì)應(yīng)著 Teacher類中的屬性;
javaType: 指定屬性的類型;
集合中的泛型,使用ofType獲取
!-->
<collection property="studentList" ofType="com.pojo.Student">
<result property="id" column="sid" />
<result property="name" column="sname" />
<result property="tid" column="tid" />
</collection>
</resultMap>
</mapper>Test:
@Test
public void testgetTeacher(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = teacherMapper.getTeacher(1);
System.out.println( teacher );
sqlSession.close();
}
}3.2 按查詢嵌套處理
數(shù)據(jù)準(zhǔn)備
@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;
}TeacherMapper接口編寫方法 :public Teacher getTeacher2(int id);
編寫接口對(duì)應(yīng)的Mapper配置文件
<mapper namespace="com.dao.TeacherMapper">
<select id="getTeacher2" resultMap="TeacherStuent">
select * from teacher where id = #{tid}
</select>
<resultMap id="TeacherStuent" type="com.pojo.Teacher">
<result property="id" column="id" />
<result property="name" column="name" />
<!--column是一對(duì)多的外鍵 , 寫的是一的主鍵的列名-->
<collection property="studentList" javaType="ArrayList" ofType="com.pojo.Student" select="getStudentByTId" column="id"/>
</resultMap>
<select id="getStudentByTId" resultType="com.pojo.Student">
select * from student where tid = #{id}
</select>
</mapper>Test:
@Test
public void testgetTeacher2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = teacherMapper.getTeacher2(1);
System.out.println(teacher);
sqlSession.close();
}以上就是MyBatis多對(duì)多一對(duì)多關(guān)系查詢嵌套處理的詳細(xì)內(nèi)容,更多關(guān)于MyBatis多對(duì)多一對(duì)多嵌套查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
openfeign使用nacos服務(wù)注冊(cè)方式調(diào)用的實(shí)現(xiàn)
文章說明如何將項(xiàng)目注冊(cè)到Nacos,使OpenFeign調(diào)用時(shí)通過服務(wù)名自動(dòng)發(fā)現(xiàn)服務(wù),無需手動(dòng)配置URL,需添加Nacos和Sentinel依賴,啟動(dòng)類使用@FeignClient注解并指定fallback,服務(wù)名稱直接填入value屬性即可實(shí)現(xiàn)動(dòng)態(tài)調(diào)用2025-09-09
mybatis-plus 擴(kuò)展批量新增的實(shí)現(xiàn)
本文主要介紹了mybatis-plus 擴(kuò)展批量新增的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼
Ribbon 是 Netflix 發(fā)布的負(fù)載均衡器,它有助于控制 HTTP 和 TCP 客戶端的行為。這篇文章主要介紹了Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼,需要的朋友可以參考下2020-11-11
解決IDEA maven 項(xiàng)目修改代碼不生效,mvn clean、install后才生效
這篇文章主要介紹了解決IDEA maven 項(xiàng)目修改代碼不生效,mvn clean、install后才生效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
springboot實(shí)現(xiàn)全局異常處理及自定義異常類
這篇文章主要介紹了springboot實(shí)現(xiàn)全局異常處理及自定義異常類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解
要將日期值格式化為特定格式,請(qǐng)使用DATE_FORMAT函數(shù),下面這篇文章主要給大家介紹了關(guān)于java開發(fā)之SQL語句中DATE_FORMAT函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
Java如何向主函數(shù)main中傳入?yún)?shù)
這篇文章主要介紹了Java如何向主函數(shù)main中傳入?yún)?shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
spring boot集成shiro詳細(xì)教程(小結(jié))
這篇文章主要介紹了spring boot 集成shiro詳細(xì)教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01

