MyBatis-一对多关联表查询 -06

一、一对多的映射关系

添加学生表,一个班级对应多个学生,根据班级id查询对应班级的学生和老师

学生表

USE mybatis;
CREATE TABLE student(
	s_id INT PRIMARY KEY AUTO_INCREMENT, 
	s_name VARCHAR(20), 
	class_id INT
);
INSERT INTO student(s_name, class_id) VALUES('xs_A', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_C', 1);
INSERT INTO student(s_name, class_id) VALUES('xs_D', 2);
INSERT INTO student(s_name, class_id) VALUES('xs_E', 2);
INSERT INTO student(s_name, class_id) VALUES('xs_F', 2);

学生实体类


package com.weixuan.mybatis.bean;

public class Student {

	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Student(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Student() {
		super();
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}

}



二、两种方式查询

<?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.weixuan.mybatis.bean.one2one2">

	<!-- 方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集 SELECT * FROM class c, teacher t,student 
		s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1 -->
	<select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
		select *
		from class c, teacher t,student s where c.teacher_id=t.t_id and
		c.C_id=s.class_id and c.c_id=#{id}
	</select>

	<resultMap type="Classes" id="ClassResultMap3">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />

		<association property="teacher" column="teacher_id" javaType="Teacher">
			<id property="id" column="t_id" />
			<result property="name" column="t_name" />
		</association>

		<!-- ofType指定students集合中的对象类型 -->
		<collection property="students" ofType="Student">
			<id property="id" column="s_id" />
			<result property="name" column="s_name" />
		</collection>
	</resultMap>

	<!-- 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型 SELECT * FROM class WHERE c_id=1; 
		SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值 SELECT * FROM 
		student WHERE class_id=1 //1是第一个查询得到的c_id字段的值 -->
	<select id="getClass4" parameterType="int" resultMap="ClassResultMap4">
		select * from class where c_id=#{id}
	</select>
	
	<resultMap type="Classes" id="ClassResultMap4">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		
		<association property="teacher" column="teacher_id"
			javaType="Teacher" select="getTeacher2">
		</association>
		
		<collection property="students" ofType="Student" column="c_id"
			select="getStudent">
		</collection>
	</resultMap>

	<select id="getTeacher2" parameterType="int" resultType="Teacher">
		SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
	</select>

	<select id="getStudent" parameterType="int" resultType="Student">
		SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
	</select>

</mapper>

package com.weixuan.testcrud3;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import com.weixuan.mybatis.bean.Classes;
import com.weixuan.utils.MyBatisUtils;

public class Test2 {

	SqlSessionFactory sqlsessionfactory = MyBatisUtils.getFactory();
	
	SqlSession sqlsession = sqlsessionfactory.openSession(true);
	
	@Test
	public void test() {
		
		String sql = "com.weixuan.mybatis.bean.one2one2.getClass3";
	
		Classes classes = sqlsession.selectOne(sql, 2);
		
		System.out.println(classes);
		
		sqlsession.close();
		
	}
	
	@Test
	public void test1() {
		
		String sql = "com.weixuan.mybatis.bean.one2one2.getClass4";
	
		Classes classes = sqlsession.selectOne(sql, 2);
		
		System.out.println(classes);
		
		sqlsession.close();
		
	}
}



MyBatis-Plus是一款MyBatis的增强工具,它提供了很多实用的功能,比如一对多查询。在MyBatis-Plus中,一对多查询可以通过使用@TableName注解和@TableField注解来实现。 假设我们有两张,一张是学生,另一张是课程,一个学生可以选多门课程,那么我们就可以用一对多查询查询某个学生选的所有课程。 首先,在学生中定义一个属性List<Course> courses,并使用@TableField注解将该属性与课程的外键联起来: ``` public class Student { @TableId private Long id; private String name; @TableField(exist = false) private List<Course> courses; } ``` 然后,在课程中定义一个属性Long studentId,并使用@TableField注解将该属性与学生的主键联起来: ``` public class Course { @TableId private Long id; private String name; @TableField("student_id") private Long studentId; } ``` 最后,我们使用MyBatis-Plus提供的wrapper类进行查询: ``` QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", studentId); List<Student> students = studentMapper.selectList(queryWrapper); for (Student student : students) { QueryWrapper<Course> courseQueryWrapper = new QueryWrapper<>(); courseQueryWrapper.eq("student_id", student.getId()); List<Course> courses = courseMapper.selectList(courseQueryWrapper); student.setCourses(courses); } ``` 以上就是MyBatis-Plus实现一对多查询的方法。如果您还有其他问题或需要进一步的帮助,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值