Mybatis系列--12-一对多详解
Mybatis系列--12-一对多详解
概述
本文主要讲解一对多情况在Mybatis中的实现
还是举班主任和学生的例子,一个班主任管理多个学生,所以班主任和学生的关系为多对一,也叫集合关系
学生和老师的关系即为多对一,也叫关联关系
实践
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Mybatis-Study</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Mybatis-Study06-yiduiduo</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Mybatis-Study</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Mybatis-Study06-yiduiduo</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
db.properties
driver=com.mysql.jdbc.Driver
url=xxx
username=root
password=xxx
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.dao.TeacherMapper">
<select id="getTeacher" resultMap="TeacherStudent">
select *
from teacher
where id = #{tid}
</select>
<resultMap id="TeacherStudent" type="com.kuang.pojo.Teacher">
<!--id和name不写也可以的-->
<result property="id" column="id"></result>
<result property="name" column="name"></result>
<collection property="students" javaType="ArrayList" ofType="com.kuang.pojo.Student" select="getTeacherStudent"
column="id"></collection>
</resultMap>
<select id="getTeacherStudent" resultType="com.kuang.pojo.Student">
select *
from student
where tid = #{tid}
</select>
<select id="getTeacher2" resultMap="TeacherStudent2">
select s.id sid, s.name sname, s.tid stid, t.id tid, t.name tname
from teacher t,
student s
where t.id = s.tid
and t.id = #{id}
</select>
<resultMap id="TeacherStudent2" type="com.kuang.pojo.Teacher">
<result property="id" column="tid"></result>
<result property="name" column="tname"></result>
<collection property="students" javaType="ArrayList" ofType="com.kuang.pojo.Student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
<result property="tid" column="stid"></result>
</collection>
</resultMap>
</mapper>
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.dao.StudentMapper">
</mapper>
MyBatisUtil.java
package com.kuang.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 功能描述
*
* @since 2022-07-13
*/
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlsession() {
return sqlSessionFactory.openSession(true);
}
}
Teacher.java
package com.kuang.pojo;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 功能描述
*
* @since 2022-07-20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
Student.java
package com.kuang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 功能描述
*
* @since 2022-07-20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}
TeacherMapper.java
package com.kuang.dao;
import java.util.List;
import com.kuang.pojo.Teacher;
/**
* 功能描述
*
* @since 2022-07-20
*/
public interface TeacherMapper {
List<Teacher> getTeacher(int tid);
List<Teacher> getTeacher2(int tid);
}
StudentMapper.java
package com.kuang.dao;
/**
* 功能描述
*
* @since 2022-07-20
*/
public interface StudentMapper {
}
测试代码MyTest.java
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.kuang.dao.TeacherMapper;
import com.kuang.pojo.Teacher;
import com.kuang.util.MyBatisUtil;
/**
* 功能描述
*
* @since 2022-07-21
*/
public class MyTest {
@Test
public void test01() {
SqlSession sqlsession = MyBatisUtil.getSqlsession();
TeacherMapper mapper = sqlsession.getMapper(TeacherMapper.class);
List<Teacher> list = mapper.getTeacher(1);
for (Teacher teacher : list) {
System.out.println(teacher);
}
sqlsession.close();
}
@Test
public void test02() {
SqlSession sqlsession = MyBatisUtil.getSqlsession();
TeacherMapper mapper = sqlsession.getMapper(TeacherMapper.class);
List<Teacher> list = mapper.getTeacher2(1);
for (Teacher teacher : list) {
System.out.println(teacher);
}
sqlsession.close();
}
}
分析
方式一:按照查询嵌套处理
getTeacher
方法是这个方式的实现,可以看到mapper.xml文件中包含两个select语句,第一个是从teacher中查询,第二个是从student中查询
将两个查询语句嵌套起来
方式二:按照结果嵌套处理
getTeacher2
方法是这个方式的实现,可以看到resultMap中将students这个属性进行了嵌套表示,将从数据库中查出来的所有信息嵌套到resultMap中,其实就是做了一个sql结果集的映射
分类:
Mybatis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!