Mybatis關(guān)聯(lián)查詢之一對(duì)多和多對(duì)一XML配置詳解
平時(shí)在開發(fā)過程中dao、bean和XML文件都是自動(dòng)生成的,很少寫XML的配置關(guān)系,今天記錄一下mybatis的關(guān)聯(lián)查詢中的多對(duì)一和一對(duì)多的情況。
首先是有兩張表(學(xué)生表Student和老師Teacher表,注:這里只是為了演示一對(duì)多和多對(duì)一的情況,請(qǐng)不要杠),為了更易懂,這里只設(shè)置了最簡(jiǎn)單的幾個(gè)必要字段。表結(jié)構(gòu)如下圖
Student表:

Teacher表:

創(chuàng)建實(shí)體bean
Teacher.java:
import java.util.List;
public class Teacher {
private Integer id;
private String name;
private String className;
private List<Student> students;
// get、set方法省略
}
Sfudent.java
public class Student {
private Integer id;
private String name;
private Integer teacherId;
private String className;
private Teacher teacher;
// get、set方法省略
}
下面重點(diǎn)來(lái)了:配置Mapper.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.tz.mybatis.dao.studentDao">
<!-- ///一對(duì)多的第一種寫法/// -->
<resultMap type="Teacher" id="teacherMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="students" ofType="Student" column="id">
<!-- 這里的column對(duì)應(yīng)的是下面查詢的別名,而不是表字段名 -->
<id column="sid" property="id"/>
<!-- property對(duì)應(yīng)JavaBean中的屬性名 -->
<result column="sname" property="name"/>
<result column="className" property="className"/>
</collection>
</resultMap>
<!-- 查詢所有的老師級(jí)各自的所有學(xué)生 -->
<select id="getTeachers" parameterType="Teacher" resultMap="teacherMap">
SELECT
t.id,
t.NAME,
t.class_Name,
s.id AS sid,
s. NAME AS sname,
s.class_name as className
FROM
teacher t
LEFT JOIN student s ON t.id = s.teacher_id
</select>
</mapper>
測(cè)試類:
package com.tz.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.tz.mybatis.bean.Student;
import com.tz.mybatis.bean.Teacher;
public class TeacherTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void getTeachers() {
SqlSession session = sqlSessionFactory.openSession();
List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getTeachers");
System.out.println(list);
}
}
下面給出第二種寫法:
<!-- //一對(duì)多的第二種寫法/ -->
<resultMap type="Teacher" id="teacherMaps">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_name" property="className"/>
<collection property="students" ofType="Student" select="getStudents" column="id">
</collection>
</resultMap>
<!-- 查詢所有的老師級(jí)各自的所有學(xué)生 -->
<select id="getAllTeacher" parameterType="Teacher" resultMap="teacherMaps">
SELECT
t.id,
t.NAME,
t.class_name
FROM
teacher t
</select>
<select id="getStudents" parameterType="int" resultType="Student">
select
s.id,
s. NAME,
s.class_name as className
from student s
where teacher_id = #{id}
</select>
測(cè)試類:
@Test
public void getTeachers2() {
SqlSession session = sqlSessionFactory.openSession();
List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getAllTeacher");
System.out.println(list);
}
查詢學(xué)生信息(多對(duì)一):
首先還是配置文件:
<resultMap type="Student" id="studentMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_name" property="className"/>
<result column="teacher_id" property="teacherId"/>
<association property="teacher" select="getTeacher" column="teacher_id" javaType="Teacher">
<!-- 這里要注意的是column對(duì)應(yīng)的是student中的外鍵,而且需是表字段名 -->
</association>
</resultMap>
<select id="getStudent" resultMap="studentMap">
SELECT
s.id,
s.name,
s.class_name,
s.teacher_id
FROM
student s
</select>
<select id="getTeacher" resultType="Teacher" parameterType="int">
SELECT
t.id,
t.name,
t.class_name as className
FROM teacher t
where id = #{teacher_id}
</select>
測(cè)試類:
@Test
public void getStudents() {
SqlSession session = sqlSessionFactory.openSession();
List<Student> list = session.selectList("com.tz.mybatis.dao.studentDao.getStudent");
System.out.println(list);
}
最后:當(dāng)然如果不想配置這么麻煩的信息,可以直接寫一個(gè)關(guān)聯(lián)查詢的SQL語(yǔ)句,返回結(jié)果直接由Map接受即可。不過這樣就不太符合面向?qū)ο蟮睦砟盍恕?nbsp;
到此這篇關(guān)于Mybatis關(guān)聯(lián)查詢之一對(duì)多和多對(duì)一XML配置詳解的文章就介紹到這了,更多相關(guān)Mybatis關(guān)聯(lián)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式
- Mybatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)(DEMO)
- Mybatis 一對(duì)多和多對(duì)一關(guān)聯(lián)查詢問題
- mybatis-plus多表關(guān)聯(lián)查詢功能的實(shí)現(xiàn)
- mybatis如何使用注解實(shí)現(xiàn)一對(duì)多關(guān)聯(lián)查詢
- MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢
- MyBatis 三表外關(guān)聯(lián)查詢的實(shí)現(xiàn)(用戶、角色、權(quán)限)
- Mybatis實(shí)現(xiàn)一對(duì)一、一對(duì)多關(guān)聯(lián)查詢的方法(示例詳解)
- Mybatis-Plus多表關(guān)聯(lián)查詢的使用案例解析
- MyBatis的關(guān)聯(lián)查詢實(shí)現(xiàn)(一對(duì)一、一對(duì)多、多對(duì)多)
相關(guān)文章
詳解rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋
這篇文章主要介紹了rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Java實(shí)現(xiàn)精準(zhǔn)Excel數(shù)據(jù)排序的方法詳解
在數(shù)據(jù)處理或者數(shù)據(jù)分析的場(chǎng)景中,需要對(duì)已有的數(shù)據(jù)進(jìn)行排序,在Excel中可以通過排序功能進(jìn)行整理數(shù)據(jù),而在Java中,則可以借助Excel表格插件對(duì)數(shù)據(jù)進(jìn)行批量排序,下面我們就來(lái)學(xué)習(xí)一下常見的數(shù)據(jù)排序方法吧2023-10-10
SpringBoot整合Mybatis-Plus實(shí)現(xiàn)關(guān)聯(lián)查詢
Mybatis-Plus(簡(jiǎn)稱MP)是一個(gè)Mybatis的增強(qiáng)工具,只是在Mybatis的基礎(chǔ)上做了增強(qiáng)卻不做改變,MyBatis-Plus支持所有Mybatis原生的特性,本文給大家介紹了SpringBoot整合Mybatis-Plus實(shí)現(xiàn)關(guān)聯(lián)查詢,需要的朋友可以參考下2024-08-08
偵聽消息隊(duì)列的Message Listener類示例詳解
Spring AMQP 是基于 Spring 框架的AMQP消息解決方案,提供模板化的發(fā)送和接收消息的抽象層,提供基于消息驅(qū)動(dòng)的 POJO的消息監(jiān)聽等,簡(jiǎn)化了我們對(duì)于RabbitMQ相關(guān)程序的開發(fā),本文給大家介紹偵聽消息隊(duì)列的Message Listener類,感興趣的朋友一起看看吧2023-12-12
基于SpringBoot和Vue3的博客平臺(tái)文章詳情與評(píng)論功能實(shí)現(xiàn)
在前面的教程中,我們已經(jīng)實(shí)現(xiàn)了基于Spring Boot和Vue3的發(fā)布、編輯、刪除文章功能以及文章列表與分頁(yè)功能。本教程將引導(dǎo)您實(shí)現(xiàn)博客平臺(tái)的文章詳情與評(píng)論功能,需要的朋友可以參考一下2023-04-04
mybatis初始化SqlSessionFactory失敗的幾個(gè)原因分析
這篇文章主要介紹了mybatis初始化SqlSessionFactory失敗的幾個(gè)原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

