一、Association概述
MyBatis鼓勵開發者採用關聯查詢(association)的方式來處理對象之間的關係,association是MyBatis中的一個重要特性。
使用association可以在一個查詢中,查詢兩個對象之間的關聯關係並將其映射成一個完整的對象。
具體來說,association可用於描述一對一或者多對一的關聯關係,其實現方式是在SQL語句中使用JOIN關鍵字將兩張關聯表聯合查詢,從而完成查詢結果與Java對象的關聯映射,最終得到一個完整的Java對象。
二、Association的使用方法
在MyBatis中,使用association實現一對一或多對一的對象關聯映射需要用到以下步驟:
1、在xml文件中定義resultMap,使用association將兩個表關聯起來:
<resultMap id="person" type="com.example.entity.Person"> <id property="id" column="person_id" /> <result property="name" column="person_name" /> <association property="passport" javaType="com.example.entity.Passport"> <id property="id" column="passport_id" /> <result property="placeOfIssue" column="place_of_issue" /> </association> </resultMap>
2、在映射文件中使用SELECT語句進行聯合查詢,通過column屬性將兩張關聯表的主鍵進行關聯:
<select id="findById" resultMap="person"> SELECT person.id as person_id,person.name as person_name,passport.id as passport_id,passport.place_of_issue as place_of_issue FROM person JOIN passport ON person.id=passport.person_id WHERE person.id=#{id} </select>
3、在相應的Java對象中定義關聯關係:
public class Person { private Long id; private String name; private Passport passport; //省略getter和setter方法 }
三、Association的高級應用
1、多級關聯映射
在MyBatis中,一個對象可能涉及到多個關聯映射,可以使用Nest Results來進行多級關聯映射。
<resultMap id="person" type="com.example.entity.Person"> <id property="id" column="person_id" /> <result property="name" column="person_name" /> <association property="passport" javaType="com.example.entity.Passport"> <id property="id" column="passport_id" /> <result property="placeOfIssue" column="place_of_issue" /> <association property="visa" javaType="com.example.entity.Visa"> <id property="id" column="visa_id" /> <result property="country" column="visa_country" /> </association> </association> </resultMap>
2、使用association實現懶載入
MyBatis支持使用association來實現懶載入,即只有在需要訪問關聯對象時才進行查詢。
懶載入的實現方式是在查詢關聯對象時,只查詢其主鍵信息,並在第一次訪問關聯對象時,再去查詢完整的關聯對象信息。
<resultMap id="person" type="com.example.entity.Person"> <id property="id" column="person_id" /> <result property="name" column="person_name" /> <association property="passport" javaType="com.example.entity.Passport" lazy="true"> <id property="id" column="passport_id" /> <result property="placeOfIssue" column="place_of_issue" /> </association> </resultMap>
3、使用Association實現級聯操作
MyBatis中,使用association可以很方便地實現級聯操作,即在向資料庫插入或更新數據時,同時插入或更新關聯對象。
在Java對象中定義關聯屬性時,需要添加cascade屬性指定級聯操作方式,如:cascade=”all”表示關聯對象的所有操作都會被級聯執行。
public class Person { private Long id; private String name; private Passport passport; //getters/setters省略 } public class Passport { private Long id; private String placeOfIssue; private Person person; //getters/setters省略 }
在xml文件中進行insert操作時,則需要在插入操作中使用關鍵字selectKey獲取主鍵信息。
<insert id="insertPerson" parameterType="com.example.entity.Person"> <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE"> SELECT person_seq.nextval FROM dual </selectKey> INSERT INTO person(id,name) VALUES(#{id},#{name}); <insert id="insertPassport" parameterType="com.example.entity.Passport"> <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE"> SELECT passport_seq.nextval FROM dual </selectKey> INSERT INTO passport(id,place_of_issue,person_id) VALUES(#{id},#{placeOfIssue},#{person.id}); </insert> </insert>
四、總結
MyBatis的association形成了一個優秀的對象映射模型,可以很好地進行關聯查詢。上述講解了association的基本使用、高級應用,還涉及到懶載入和級聯操作等內容。在實際應用中,我們也應該結合具體情況,靈活運用association,提高代碼的可讀性和維護性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/311437.html