首先先來說明一下數據庫,數據庫有兩張表student表和teacher表:
student表如下:
teacher表如下:
兩張表的關系:多個學生關聯一位老師(多對一)
*其中tid是外鍵
需要sql語句的朋友可以在這里取:

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, `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'); SELECT * FROM student; SELECT * FROM teacher;
下面進入正題:
一、多對一
1.編寫pojo類
注意:在“多”這一邊添加一個“一”的對象作為屬性。例如:在student實體類中添加一個屬性 Teacher teacher;
@Data public class Student { private int id; private String name; //學生需要關聯一個老師 private Teacher teacher; }
@Data public class Teacher { private int id; private String name; }
注意:@Data是一個注解,使用這個注解可以自動幫我們引入get()、 set()、 toString()等方法。這個注解來自lombok,要使用這個注解首先要安裝lombok插件並導入相關jar包。
2.編寫接口類
public interface StudentMapper { public List<Student> getStudent(); }
3.編寫映射文件
這里有兩種方法,按照查詢嵌套處理和按照結果嵌套處理
方式一:按照查詢嵌套處理
思路:我們先查詢所有的學生,然后根據查詢出來的學生的tid再去查詢對應的老師的信息,代碼如下所示
<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.orggetStudent//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kuang.dao.StudentMapper"> <select id="getStudent" resultMap="StudentTeacher"> SELECT * FROM student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap>
<select id="getTeacher" resultType="Teacher">
SELECT * FROM teacher where id = #{tid} </select>
</mapper>
注意:
●用來指定實體類中屬性的類型。還不懂的話,那就再細說一點:由於上邊代碼<association >標簽中properties的值是teacher,實體類Student中teacher屬性的類型是Teacher,所以javaType="Teacher"
●在上邊代碼中<resultMap>標簽里簡單的屬性我們可以用<result>標簽去映射,但是復雜的屬性就用不了了,那怎么結局復雜屬性的映射怎么解決呢?有兩種情況:
①.復雜屬性是對象:用association
②.復雜屬性是集合,用collection
映射過程圖解:
方式二:按照結果嵌套處理
這種方法比較簡單,只要對比上一種方法你就能明白了,這里就不詳細贅述了。
映射文件代碼如下:
<!--方式二-->
<select id="getStudent2" resultMap="StudentTeacher2">
SELECT s.id AS sid,s.name AS sname,t.id AS tid,t.name AS tname
FROM student s,teacher t
WHERE s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
注意:
●select語句中給字段區別名那里不能省略,不然查詢結果會出錯。出錯的原因我現在不知道,有知道的朋友歡迎在下邊評論,不勝感謝!
二、一對多
1.編寫pojo類
*tip:在“一”這一邊添加一個“多”的對象的泛型集合作為屬性。例如:在Teacher 實體類中添加一個屬性 List<Student> students;
@Data public class Teacher { private int id; private String name; //一個老師擁有多個學生 private List<Student> students; }
@Data
public class Student {
private int id;
private String name;
private int tid;
}
注意:@Data是一個注解,使用這個注解可以自動幫我們引入get()、 set()、 toString()等方法。這個注解來自lombok,要使用這個注解首先要安裝lombok插件並導入相關jar包。
2.編寫接口類
public interface TeacherMapper {
//獲取指定老師下的所有學生及老師的信息
Teacher getTeacher(@Param("tid") int id);
}
3.編寫映射文件
這里有兩種方法,按照查詢嵌套處理和按照結果嵌套處理
方式一:按照查詢嵌套處理
思路:我們先根據id查詢所有的老師,然后根據查詢出來的老師的id再去查詢對應的學生的信息,代碼如下所示
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kuang.dao.TeacherMapper"> <select id="getTeacher" resultMap="TeacherStudent"> SELECT * FROM teacher WHERE id = #{tid} </select> <resultMap id="TeacherStudent" type="Teacher"> <result property="id" column="id"/> <result property="name" column="name"/> <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/> </resultMap> <select id="getStudentByTeacherId" resultType="Student"> SELECT * FROM student WHERE tid = #{tid} </select> </mapper>
注意:
●javaType:用來指定實體類中屬性的類型。還不懂的話,那就再細說一點:由於上邊代碼<collection >標簽中properties的值是students,實體類Teacher中students屬性的類型是一個泛型列表ArrayList,所以javaType="ArrayList"
●ofType:用來指定映射到集合中的pojo類型,泛型中的約束類型。
方式二:按照結果嵌套處理
<select id="getTeacher" resultMap="TeacherStudent"> SELECT s.id sid,s.name sname,t.name tname,t.id tid FROM student s,teacher t WHERE t.id = #{tid} AND s.tid = t.id </select> <resultMap id="TeacherStudent" type="Teacher"> <result column="tid" property="id"/> <result column="tname" property="name"/> <collection property="students" javaType="ArrayList" ofType="Student"> <result column="sid" property="id"/> <result column="sname" property="name"/> <result column="tid" property="tid"/> </collection> </resultMap>