一对一
一个学生只属于一个班级。
MyBatis中使用association标签解决一对一关联查询,association标签可以使用的属性如下:
property:对象属性的名称
javaType:对象以昂属性的类型
column:数据库中字段的名称(也可能是起的别名)
最终返回的是一个学生的集合,但是Student里面是有一个banji对象,里面保存了这个学生对应的班级信息。
<mapper namespace="student">
<resultMap id="studentMap" type="Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<association property="aClass" javaType="Class">
<id property="id" column="classId"/>
<result property="name" column="className"/>
</association>
</resultMap>
<select id="selectStudentClassInfo" resultMap="studentMap">
SELECT s.id, s.`name`, s.gender, c.id, c.`name` AS className
FROM student AS s INNER JOIN class AS c
ON s.class_id = c.id
</select>
public void testStudentClassInfo(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
List<Student> list = sqlSession.selectList("student.selectStudentClassInfo");
for (Student student : list) {
System.out.println(student);
}
}
一对多
MyBatis中使用collection标签解决一对多关联查询,collection标签可以使用的属性如下:
property:对象属性的名称
javaType:对象以昂属性的类型
column:数据库中字段的名称(也可能是起的别名)
一个班级下有多个学生,返回的数据List< Class>里面还包含着List< Student>,所以要在班级Class类里定义List类型的Student属性,也需要一个配置文件ClassMapping.xml。
classMapping.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="aClass">
<resultMap id="classMap" type="Class">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list" ofType="Student">
<id column="studentId" property="id"/>
<result column="studentName" property="name"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
</collection>
</resultMap>
<select id="selectClassStudentInfo" resultMap="classMap">
SELECT c.id, c.name, s.id AS studentId, s.name AS studentName
FROM class AS c INNER JOIN student AS s
ON s.class_id = c.id;
</select>
</mapper>
Class.java
public class Class {
private Integer id;
private String name;
private List<Student> list;
。。。。。。
@Test
public void testClassStudentInfo(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
List<Class> list = sqlSession.selectList("aClass.selectClassStudentInfo");
for (Class aClass : list) {
System.out.println(aClass);
List<Student> list1 = aClass.getList();
for (Student student : list1) {
System.out.println(student);
}
}
}
多对多
多对多其实就是分解为两个一对多。