0
点赞
收藏
分享

微信扫一扫

mybatis关联映射(多表查询1对多、多对1)

醉倾城1 2022-12-31 阅读 38

 

准备测试数据

班级表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (
`c_id` int(11) NOT NULL AUTO_INCREMENT,
`c_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES ('1', 'java');
INSERT INTO `classes` VALUES ('2', 'python');

  

学生表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
`s_id` int(11) NOT NULL AUTO_INCREMENT,
`s_name` varchar(255) DEFAULT NULL,
`s_age` int(11) DEFAULT NULL,
`class_id` int(11) DEFAULT NULL,
PRIMARY KEY (`s_id`),
KEY `fk_class_id` (`class_id`),
CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `classes` (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES ('1', 'jack', '18', '1');
INSERT INTO `students` VALUES ('2', 'tom', '19', '2');
INSERT INTO `students` VALUES ('3', 'laowang', '20', '1');
INSERT INTO `students` VALUES ('4', 'liming', '19', '2');
INSERT INTO `students` VALUES ('5', 'lucy', '19', '1');

 

模型

mybatis关联映射(多表查询1对多、多对1)_System

 

示例

配置及测试一对多:根据班级查学生

班级实体类:加学生集合属性,private List<Students> students

package com.qzcsbj.bean;


import java.util.List;

public class Classes {

private long cId;
private String cName;
// 学生集合
private List<Students> students;

public long getCId() {
return cId;
}

public void setCId(long cId) {
this.cId = cId;
}

public String getCName() {
return cName;
}

public void setCName(String cName) {
this.cName = cName;
}

public List<Students> getStudents() {
return students;
}

public void setStudents(List<Students> students) {
this.students = students;
}

@Override
public String toString() {
return "Classes{" +
"cId=" + cId +
", cName='" + cName + '\'' +
'}';
}
}

 

学生实体类

package com.qzcsbj.bean;


public class Students {

private long sId;
private String sName;
private long sAge;
private long classId;


public long getSId() {
return sId;
}

public void setSId(long sId) {
this.sId = sId;
}


public String getSName() {
return sName;
}

public void setSName(String sName) {
this.sName = sName;
}


public long getSAge() {
return sAge;
}

public void setSAge(long sAge) {
this.sAge = sAge;
}


public long getClassId() {
return classId;
}

public void setClassId(long classId) {
this.classId = classId;
}

@Override
public String toString() {
return "Students{" +
"sId=" + sId +
", sName='" + sName + '\'' +
", sAge=" + sAge +
", classId=" + classId +
'}';
}
}

  

mapper接口

package com.qzcsbj.mapper;

import com.qzcsbj.bean.Classes;

import java.util.List;

/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
public interface ClassesMapper {
// 1对n:根据班级id查询班级信息,包含班级下的学生信息
public Classes getClassesById(int cId);
}

  

映射文件:ClassesMapper.xml

<!--班级下有学生集合-->
<resultMap id="classesMap2" type="Classes">
<id column="c_id" property="cId"/>
<result column="c_name" property="cName"/>
<!--集合-->
<collection property="students" ofType="Students">
<id column="s_id" property="sId"/>
<result column="s_name" property="sName"/>
<result column="s_age" property="sAge"/>
<result column="class_id" property="classId"/>
</collection>
</resultMap>

<!--根据班级id查询班级信息,包含班级下的学生信息-->
<select id="getClassesById" resultMap="classesMap2">
select * from classes c join students s on c.c_id = s.class_id
where c.c_id=#{cId}
</select>

  

测试类

@Test
public void testGetClassesById(){
Classes c = classesMapper.getClassesById(1);
System.out.println("班级信息:" + c);
System.out.println("班级下的学生信息:");
List<Students> students = c.getStudents();
for (Students student : students) {
System.out.println(student);
}
}

  

结果

mybatis关联映射(多表查询1对多、多对1)_System_02

 

 

配置及测试多对一:根据学生查班级

学生实体类:加班级对象属性,private Classes classes;

package com.qzcsbj.bean;


public class Students {

private long sId;
private String sName;
private long sAge;
private long classId;
private Classes classes;


public long getSId() {
return sId;
}

public void setSId(long sId) {
this.sId = sId;
}


public String getSName() {
return sName;
}

public void setSName(String sName) {
this.sName = sName;
}


public long getSAge() {
return sAge;
}

public void setSAge(long sAge) {
this.sAge = sAge;
}


public long getClassId() {
return classId;
}

public void setClassId(long classId) {
this.classId = classId;
}

public Classes getClasses() {
return classes;
}

public void setClasses(Classes classes) {
this.classes = classes;
}

@Override
public String toString() {
return "Students{" +
"sId=" + sId +
", sName='" + sName + '\'' +
", sAge=" + sAge +
", classId=" + classId +
'}';
}
}

  

班级实体类

package com.qzcsbj.bean;


import java.util.List;

public class Classes {

private long cId;
private String cName;
private List<Students> students;

public long getCId() {
return cId;
}

public void setCId(long cId) {
this.cId = cId;
}

public String getCName() {
return cName;
}

public void setCName(String cName) {
this.cName = cName;
}

public List<Students> getStudents() {
return students;
}

public void setStudents(List<Students> students) {
this.students = students;
}

@Override
public String toString() {
return "Classes{" +
"cId=" + cId +
", cName='" + cName + '\'' +
'}';
}
}

 

mapper接口

package com.qzcsbj.mapper;

import com.qzcsbj.bean.Students;

/**
* @公众号 : 全栈测试笔记
* @博客 : www.cnblogs.com/uncleyong
* @微信 : ren168632201
* @描述 : <>
*/
public interface StudentsMapper {
// 根据学生id查学生信息,包含该学生的班级信息
public Students getStudentsById(int sId);
}

  

映射文件:StudentsMapper.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.qzcsbj.mapper.StudentsMapper">

<select id="getStudentsById" resultMap="StudentMap">
select * from students s join classes c on c.c_id=s.class_id
where s.s_id=#{sId}
</select>

<resultMap id="StudentMap" type="Students">
<id column="s_id" property="sId"/>
<result column="s_name" property="sName"/>
<result column="s_age" property="sAge"/>
<result column="class_id" property="classId"/>
<!--一个用association-->
<association property="classes" javaType="Classes">
<id column="c_id" property="cId"/>
<result column="c_name" property="cName"/>
</association>
</resultMap>
</mapper>

  

测试类

@Test
public void testGetStudentsById(){
Students stu = studentsMapper.getStudentsById(1);
System.out.println("学生的信息是:" + stu);
Classes c = stu.getClasses();
System.out.println("该学生的班级信息是:" + c);
}

  

结果

mybatis关联映射(多表查询1对多、多对1)_System_03

 

​​【bak】​​

 


 

__EOF__


本文作者:​​持之以恒(韧)​​​




举报

相关推荐

Mybatis多对一关联查询

0 条评论