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

Teacher表:

創(chuàng)建實體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方法省略
}
下面重點來了:配置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">
<!-- ///一對多的第一種寫法/// -->
<resultMap type="Teacher" id="teacherMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="students" ofType="Student" column="id">
<!-- 這里的column對應(yīng)的是下面查詢的別名,而不是表字段名 -->
<id column="sid" property="id"/>
<!-- property對應(yīng)JavaBean中的屬性名 -->
<result column="sname" property="name"/>
<result column="className" property="className"/>
</collection>
</resultMap>
<!-- 查詢所有的老師級各自的所有學(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>
測試類:
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);
}
}
下面給出第二種寫法:
<!-- //一對多的第二種寫法/ -->
<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>
<!-- 查詢所有的老師級各自的所有學(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>
測試類:
@Test
public void getTeachers2() {
SqlSession session = sqlSessionFactory.openSession();
List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getAllTeacher");
System.out.println(list);
}
查詢學(xué)生信息(多對一):
首先還是配置文件:
<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對應(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>
測試類:
@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)然如果不想配置這么麻煩的信息,可以直接寫一個關(guān)聯(lián)查詢的SQL語句,返回結(jié)果直接由Map接受即可。不過這樣就不太符合面向?qū)ο蟮睦砟盍恕?nbsp;
到此這篇關(guān)于Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解的文章就介紹到這了,更多相關(guān)Mybatis關(guān)聯(lián)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于QueryWrapper,實現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式
- Mybatis多表關(guān)聯(lián)查詢的實現(xiàn)(DEMO)
- Mybatis 一對多和多對一關(guān)聯(lián)查詢問題
- mybatis-plus多表關(guān)聯(lián)查詢功能的實現(xiàn)
- mybatis如何使用注解實現(xiàn)一對多關(guān)聯(lián)查詢
- MyBatis實踐之動態(tài)SQL及關(guān)聯(lián)查詢
- MyBatis 三表外關(guān)聯(lián)查詢的實現(xiàn)(用戶、角色、權(quán)限)
- Mybatis實現(xiàn)一對一、一對多關(guān)聯(lián)查詢的方法(示例詳解)
- Mybatis-Plus多表關(guān)聯(lián)查詢的使用案例解析
- MyBatis的關(guān)聯(lián)查詢實現(xiàn)(一對一、一對多、多對多)
相關(guān)文章
詳解rabbitmq創(chuàng)建queue時arguments參數(shù)注釋
這篇文章主要介紹了rabbitmq創(chuàng)建queue時arguments參數(shù)注釋,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
Java實現(xiàn)精準(zhǔn)Excel數(shù)據(jù)排序的方法詳解
在數(shù)據(jù)處理或者數(shù)據(jù)分析的場景中,需要對已有的數(shù)據(jù)進(jìn)行排序,在Excel中可以通過排序功能進(jìn)行整理數(shù)據(jù),而在Java中,則可以借助Excel表格插件對數(shù)據(jù)進(jìn)行批量排序,下面我們就來學(xué)習(xí)一下常見的數(shù)據(jù)排序方法吧2023-10-10
SpringBoot整合Mybatis-Plus實現(xiàn)關(guān)聯(lián)查詢
Mybatis-Plus(簡稱MP)是一個Mybatis的增強(qiáng)工具,只是在Mybatis的基礎(chǔ)上做了增強(qiáng)卻不做改變,MyBatis-Plus支持所有Mybatis原生的特性,本文給大家介紹了SpringBoot整合Mybatis-Plus實現(xiàn)關(guān)聯(lián)查詢,需要的朋友可以參考下2024-08-08
基于SpringBoot和Vue3的博客平臺文章詳情與評論功能實現(xiàn)
在前面的教程中,我們已經(jīng)實現(xiàn)了基于Spring Boot和Vue3的發(fā)布、編輯、刪除文章功能以及文章列表與分頁功能。本教程將引導(dǎo)您實現(xiàn)博客平臺的文章詳情與評論功能,需要的朋友可以參考一下2023-04-04
mybatis初始化SqlSessionFactory失敗的幾個原因分析
這篇文章主要介紹了mybatis初始化SqlSessionFactory失敗的幾個原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

