文章目录
1. 多对一
多个学生都关联同一个老师,以多个学生为中心
1.1 在MySQL中创建student表、teacher表
CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');
CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,`student``student``user``teacher`
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
1.2 编写实体类
Teacher类:
package com.zz.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
Student类:
package com.zz.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//学生关联老师
private Teacher teacher;
}
1.3 编写接口
TeacherMapper 接口为空:
package com.zz.mapper;
public interface TeacherMapper {
}
StudentMapper 接口:
有得到student列表的方法
package com.zz.mapper;
import com.zz.pojo.Student;
import java.util.List;
public interface StudentMapper {
//获取所有学生及学生对应老师的信息
List<Student> getStudents();
}
1.4 编写接口对应的配置文件
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.zz.mapper.TeacherMapper">
</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.zz.mapper.StudentMapper">
<!--获取所有学生及学生对应老师的信息:
1. 获取所有学生的信息
2. 获取所有学生的tid,然后再去老师表中查询这个id所对应的老师
-->
<resultMap id="StudentTeacher" type="Student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<!--数据库中的tid是一个字段,而teacher是一个对象,所以不能使用result标签
这是多对一的情况,采用association标签(关联) student表关联teacher表,
且这个teacher对象是Teacher类型
-->
<association property="teacher" javaType="Teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
<select id="getStudents" resultMap="StudentTeacher">
select s.id sid,s.name sname,t.name tname,t.id tid
From student s,teacher t
WHERE s.tid=t.id
</select>
</mapper>
1.5 确定两个xml文件都绑定到了mybatis-config.xml的核心配置文件中
采用扫描包的方法来绑定,就不用一个个分别绑定
<mappers>
<!--通过扫描包来绑定-->
<package name="com.zz.mapper"/>
</mappers>
1.6 编写测试类
因为是多对一,采用学生绑定老师,所以编写学生对应的测试类
编写StudentMapperTest测试类
package com.zz.mapper;
import com.zz.pojo.Student;
import com.zz.utils.MyBatisUtils;
import org.junit.Test;
import java.util.List;
public class StudentMapperTest {
@Test
public void testGetStudents(){
StudentMapper mapper = MyBatisUtils.getSession().getMapper(StudentMapper.class);
List<Student> students = mapper.getStudents();
for (Student student : students) {
System.out.println(student);
}
}
}
运行结果:
2. 一对多
通过老师获取学生,以老师为中心
步骤与上相同,在此只写与上面不同之处
(1)编写实体类
package com.zz.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
//老师对应多个学生 (包含:集合)
private List<Student> students;
}
package com.zz.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int tid;
}
(2)编写接口
package com.zz.mapper;
import com.zz.pojo.Teacher;
public interface TeacherMapper {
//获取这个老师下的所有学生
public Teacher getTeacher(int id);
}
(3)编写接口的配置文件
<?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.zz.mapper.TeacherMapper">
<resultMap id="TeacherStudent" type="Teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
<!--如果是集合(包含关系)-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<!--学生的tid就是老师的id-->
<result property="tid" column="tid"/>
</collection>
</resultMap>
<!--Teacher里有个list集合,所以不能使用resultType,采用resultMap-->
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
From student s,teacher t
WHERE s.tid=t.id and t.id=#{id}
</select>
</mapper>
(4)编写测试类
package com.zz.mapper;
import com.zz.pojo.Teacher;
import com.zz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class TeacherMapperTest {
@Test
public void testGetTeacher(){
SqlSession session = MyBatisUtils.getSession();
TeacherMapper mapper = session.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher);
}
}
运行结果:
总结:
- 关联 - association 【多对一】
- 集合 - collection 【一对多】
- javaType & ofType
javaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的 pojo类型,泛型中的约束类型!