MyBatis很好的简化了关于Dao层的开发,本文将讲述MyBatis中如何对数据库表之间一对多和多对一关系的开发
首先建立一个简单的对应数据库表结构
teacher表中字段
student表中字段
一对多
一对多是我们经常会遇见的情况,在SQL语句中我们常用子查询的方式来解决!
例如:现在我要 查询所有的学生信息,以及对应老师的信息
SELECT s.id,s.name,t.name FROM student s,teacher t WHERE s.tid = t.id;
查询结果为:
在MyBatis我们如何进行编写
package com.qyh.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
package com.qyh.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//学生要关联一个老师
private Teacher teacher;
}
因为我们需要的学生关联老师所以在学生的实体类中添加一个老师类的属性。
接下来编写Mapper以及对应的xml,在xml中我们用两种方式来进行解决
第一种利用子查询来编写
我们先查询所有学生,再根据所查询出的学生tid来查询老师
第二种利用结果嵌套来编写
我们对子查询的查询结果进行嵌套映射,让结果映射到Student中Teacher属性对应的属性字段
package com.qyh.dao;
import com.qyh.pojo.Student;
import java.util.List;
public interface StudentMapper {
//查询所有的学生信息,以及对应老师的信息
public List<Student> getStudent();
public List<Student> getStudent2();
}
<?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.qyh.dao.StudentMapper">
<!-- 方法二
按照结果嵌套处理
-->
<resultMap id="StudentTeacher2" type="Student">
<!--数据的字段取了别名 所以为sid-->
<result column="sid" property="id"/>
<result column="sname" property="name"/>
<association property="teacher" javaType="Teacher">
<result column="tname" property="name"/>
</association>
</resultMap>
<select id="getStudent2" resultMap="StudentTeacher2">
SELECT s.id sid,s.name sname,t.name tname
FROM student s,teacher t
WHERE s.tid = t.id;
</select>
<!--=========================================================-->
<!-- 方法一
思路:
1.查询所有的学生
2.根据查询出来的学生的tid,寻找相应的老师! 子查询
-->
<resultMap id="StudentTeacher" type="Student">
<id column="id" property="id"/>
<id column="name" property="name"/>
<!--复杂的属性需要单独处理 对象:association 集合:collection
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{id}
</select>
</mapper>
在进行复杂查询的时候,当我们一个类里边的属性是一个实体类而不是简单的普通数据,我们需要对该数据进行分析,在ResultMap当中有两个对复杂属性的处理 如果该属性是一个对象我们使用:association 如果该属性是一个集合我们使用:collection
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
property="":该属性在实体类中的名称 column="":对应数据库字段的名称 javaType="":在java中的类型 select="":所要进行的查询
结果:
第一种:
第二种:
这里我们会发现一个奇怪的现象 在第一种方法下,查询出来的teacher的id=1,而第二种teacher的id=0,我也没弄清楚这个情况的原因,希望各位大佬知道的可以在下边留言。我暂且觉得在一对多的情况下我更喜欢采用第二种方式