在學數據庫概論的時候會聽到這么幾個詞:數據庫的關系分為一對一、一對多、多對多。對於在學校里學的知識已經忘得差不多了,在這里簡單的提一下數據庫的關系。此篇是介紹MyBatis是如何實現數據庫中一對一關系的,我們就暫且先介紹一對一關系。所謂一對一關系其實在生活中很常見,比如一個學生有且只對應一個屬於他的學生證。下面就是我們的所假設的數據庫物理模型。

在這個數據庫模型中,學生證和學生表是1對1的關系。那么基於此,我們會在Java代碼的POJO包中就會有兩個POJO對象,Student和SelfCard 。那么在Student這個學生信息類中就不應僅僅包含3個字段,它應該關聯StudentCard。例如Student類:
1 public class Student { 2 private int id; 3 private String name; 4 private String sex; 5 private SelfCard selfCard; 6 //省略get/set方法 7 }
SelfCard類:
1 public class SelfCard { 2 private int id; 3 private int studentId; 4 private String note; 5 }
現在的需求是,根據id查詢出學生信息(包括學生證的信息),這個時候怎么辦呢?我現在仍然記得在學校的時候是怎么處理這種情況的,先根據id查詢出student表中的學生基本信息,再根據studentId在SelfCard學生證中的該學生信息,將查詢出來的學生證信息賦值給studentPOJO類。現在想想用這種辦法也是簡直了。我們大可不必用這種low的方式,這里的根據id查詢學生信息(包括學生證信息)其實就是一個數據庫的1對1級聯關系,我們可以用inner join的sql語句來查詢,當然我們也可以使用Mybatis為我們提供的association一對一級聯。
不可避免的我們始終會查詢根據studentId查詢該學生的學生證信息,所以我們還是會有SelfCardMapper.java和SelfCardMapper.xml。
1 package day_8_mybatis.mapper; 2 3 import day_8_mybatis.pojo.SelfCard; 4 5 /** 6 * @author turbo 7 * 8 * 2016年11月2日 9 */ 10 public interface SelfCardMapper { 11 SelfCard findSelfCardByStudentId(int studentId); 12 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="day_8_mybatis.mapper.SelfCardMapper"> 6 <resultMap type="day_8_mybatis.pojo.SelfCard" id="studentSelfCardMap"> 7 <id property="id" column="id"/> 8 <result property="studentId" column="student_id"/> 9 <result property="note" column="note"/> 10 </resultMap> 11 <select id="findSelfCardByStudentId" parameterType="int" resultMap="studentSelfCardMap"> 12 select id, student_id, note from t_student_selfcard where student_id = #{id} 13 </select> 14 </mapper>
當然我們對StudentMapper.java的DAO接口也很簡單,也很普通,這時還並無特別之處,按照正常的根據id查詢返回Student實例就可。
1 package day_8_mybatis.mapper; 2 3 import day_8_mybatis.pojo.Student; 4 5 /** 6 * @author turbo 7 * 8 * 2016年11月2日 9 */ 10 public interface StudentMapper { 11 Student getStudent(int id); 12 }
接下來的StudentMapper.xml就是關鍵了。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="day_8_mybatis.mapper.StudentMapper"> 6 <resultMap type="day_8_mybatis.pojo.Student" id="studentMap"> 7 <id property="id" column="id"/> 8 <result property="name" column="name"/> 9 <result property="sex" column="sex"/> 10 <association property="selfCard" column="id" select="day_8_mybatis.mapper.SelfCardMapper.findSelfCardByStudentId"/> 11 </resultMap> 12 <select id="getStudent" parameterType="int" resultMap="studentMap"> 13 select id, name, sex from t_student where id = #{id} 14 </select> 15 </mapper>
還記得Student類中有一個SelfCard類的引用吧,它們是一對一的級聯關系,在第10行代碼中我們使用MyBatis提供的assocation關鍵字來表示它們是一對一的關系。最后別忘了在配置文件中注冊mapper映射器。好了,到現在為止,我們就實現了數據庫中的一對一級聯關系。接下來就是數據庫中一對多級聯。
