Mybatis 多对一查询的实现方法
架构

这里从学生的角度来说就是多对一的场景
那么在Java中是怎么样的呢?
环境搭建
数据库
CREATE TABLE `student`( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(20) DEFAULT NULL )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO student VALUES (1,"李老师"); CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(20) DEFAULT NULL , `tid` INT(4) NOT NULL, KEY `fk_tid` (`tid`), CONSTRAINT fk_tid FOREIGN KEY(`tid`) REFERENCES `teacher`(`id`) INSERT INTO student VALUES (1,"小红",1), (2,"小绿",1), (3,"小灯",1), (4,"小勿",1), (5,"小闯",1);

实体类
Student
package pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private Teacher teacher;//这里因为我们有一个对应的关系,学生要对应到一个老师,所以要使用Teacher类型
}Teacher
package pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}接口
(因为这里是多对一,所以我就没有用到TeacherMapper)
StudentMapper
package dao;
import pojo.Student;
import java.util.List;
public interface StudentMapper {
List<Student> getStudents();
List<Student> getStudents2();
}TeacherMapper
package dao;
public interface TeacherMapper {
}
Mapper配置文件
TeacherMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.TeacherMapper">
</mapper>
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentMapper">
<!-- 第二种 -->
<select id="getStudents2" resultMap="StudentTeacher2">
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="StudentTeacher2" type="Student" >
<result column="sid" property="id" />
<result column="sname" property="name" />
<association property="teacher" javaType="Teacher">
<result property="id" column="tid" />
<result property="name" column="tname" />
</association>
</resultMap>
<!-- 第一种 -->
<select id="getStudents" resultMap="StudentTeacher">
select * from student;
</select>
<resultMap id="StudentTeacher" type="Student" >
<result column="id" property="id" />
<result column="name" property="name" />
<association property="teacher" column="tid" javaType="Teacher" select="getTeachers" />
</resultMap>
<select id="getTeachers" resultType="Teacher">
select * from teacher where id=#{id};
</select>
</mapper>
这里说明一下
- association 是相对于对象的
- collection是相对于集合的
然后这里有两种方法,我们一种一种看
子查询方法
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentMapper">
<!-- 第一种 -->
<select id="getStudents" resultMap="StudentTeacher">
select * from student;
</select>
<resultMap id="StudentTeacher" type="Student" >
<result column="id" property="id" />
<result column="name" property="name" />
<association property="teacher" column="tid" javaType="Teacher" select="getTeachers" />
</resultMap>
<select id="getTeachers" resultType="Teacher">
select * from teacher where id=#{id};
</mapper>也就是这种方法,它其实是相当于我们Sql里面的子查询,也就是一层查询里面嵌套一层查询
按结果集查询
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentMapper">
<!-- 第二种 -->
<select id="getStudents2" resultMap="StudentTeacher2">
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="StudentTeacher2" type="Student" >
<result column="sid" property="id" />
<result column="sname" property="name" />
<association property="teacher" javaType="Teacher">
<result property="id" column="tid" />
<result property="name" column="tname" />
</association>
</resultMap>
</mapper>
这种方法就是我们一次性把结果查询出来然后对结果集做一下处理
这里特别说明一下column这个属性,这个可不是数据库中你需要的字段名,而是你查询出来的那张表的字段名,这里起了别名之后就不再是原来teacher数据库表中的字段名了
到此这篇关于Mybatis 多对一查询的文章就介绍到这了,更多相关Mybatis 多对一查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot 使用 logback、logstash、ELK 记录日志文件的方法
这篇文章主要介绍了Spring Boot 使用 logback、logstash、ELK 记录日志文件的思路详解,文中给大家提到了logback 取代 log4j的理由,需要的朋友可以参考下2017-12-12
一文教会Java新手使用Spring MVC中的查询字符串和查询参数
在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,这篇文章主要给大家介绍了关于通过一文教会Java新手使用Spring MVC中的查询字符串和查询参数的相关资料,需要的朋友可以参考下2024-01-01
Spring AI Alibaba接入大模型时的依赖问题小结
文章介绍了如何在pom.xml文件中配置SpringAI Alibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓库镜像设置为阿里云以提高下载速度,具体配置方法跟随小编一起学习下吧2025-02-02
SpringBoot中@Autowired注入service时出现循环依赖问题的解决方法
在Spring Boot开发过程中,@Autowired注入Service时出现循环依赖是一个常见问题,循环依赖指的是两个或多个Bean相互依赖,形成闭环,导致Spring容器无法正常初始化这些Bean,这里提供几种解决Spring Boot中@Autowired注入Service时循环依赖问题的方法2024-02-02
Spring Framework远程代码执行漏洞分析(最新漏洞)
Spring Framework 是一个开源应用框架,旨在降低应用程序开发的复杂度,它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架,对Spring远程代码执行漏洞相关知识感兴趣的朋友一起看看吧2022-04-04


最新评论