MyBatis之級聯——一對一關系


在學數據庫概論的時候會聽到這么幾個詞:數據庫的關系分為一對一、一對多、多對多。對於在學校里學的知識已經忘得差不多了,在這里簡單的提一下數據庫的關系。此篇是介紹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映射器。好了,到現在為止,我們就實現了數據庫中的一對一級聯關系。接下來就是數據庫中一對多級聯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM