MyBatis之自定義對映規則(連線查詢,需要修改對應對映時使用)
自定義對映規則:即自己定義資料庫與Bean物件的對映規則,不再使用預設Bean物件與記錄同名規則,即每個資料庫
的屬性都可以決定它對映到哪個類的哪個屬性, 所以操作標籤(如<select>)的resultType屬性不再使
用,改用resultMap屬性,二者不能同時使用。
一、改變Bean物件屬性名與資料庫屬性名不一致需要改變對映規則
<resultMap>:在<mapper>標籤下的自定義對映規則 type:指定要修改的對映Bean物件 id : 對映規則的別名 <id>:指定主鍵的對映規則 column:被修改的列名(資料庫的列名) property:修改後的列名(Bean物件的列名) <result>: 指定普通列的對映規則,也可以對映主鍵。 column:被修改的列名(資料庫的列名) property:修改後的列名(Bean物件的列名) 注意:未指定的列自動根據Bean物件對映規則進行對映
模板:
<mapper namespace="介面全類名"> <!--對映規則的制訂--> <resultMap type="Bean物件全類名" id="規則名"> <id column="資料庫下的主鍵名" property="Bean物件的屬性名"/> <result column="資料庫下的列名" property="Bean物件的屬性名"/> </resultMap> <select id="介面方法" resultMap="規則名"> ..... </select> </mapper>
二、連線查詢經常使用到的情況:在資料庫中我們使用主鍵,外來鍵參照約束來關聯幾張表。(即使用在B表中新增一個aid屬性來
關聯A表),可在Bean物件中常常是一個B物件包含了一個A物件,這時候我們使用連線查詢返回的的對映屬性明顯就不只有aid
屬性,還有aname等等,可我們B物件中只包含了一個A屬性類,這時候我們就要修改返回屬性的對映規則,將其對映至B包含的
A物件中。
1、當Bean物件包含了另一個Bean物件時, 可以使用在類屬性名.屬性名來指定對映的屬性,如:Employee表有一個dept屬性類
dept.id來指定資料庫對映到dept的id屬性。例:
<resultMap type="mybatis.bean.Employee" id="myEmp"> <!-Employee表中現有一個類屬性dept-> <result column="d_id" property="dept.id"/> <result column="dept_name" property="dept.dname"/> </resultMap>
2、我們還可以使用<association>標籤
property:指定要對映類屬性名
javaType:指定全類名
<resultMap type="mybatis.bean.Employee" id="myemp">
<association property="dept" javaType="mybatis.bean.Department">
<result column="id" property="id"/>
<result column="dept_name" property="dname"/>
</association>
</resultMap>
3、分步查詢:先執行sql配置檔案的一句sql語句,再執行另一sql配置檔案的sql語句,類似sql裡的巢狀查詢。
可以達到節省資源的效果,在需要其屬性時再進行查詢,所以多使用分步查詢。
property:指定要對映類屬性名
select:介面全類名.方法名,要呼叫哪個sql配置檔案中的sql語句
column:要傳入返回的哪一列值傳給呼叫sql語句作引數
<resultMap type="mybatis.bean.Employee" id="ruleOne">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<association property="類屬性名" select="介面全類名.方法名(即其它sql配置檔案的語句)"
column="列名(即傳入查到的哪一列作為其它sql語句需要傳入的引數值)">
</association>
</resultMap>
還需要在全域性配置檔案中<configuration>下新增如下配置實現延遲載入:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
三、在查詢物件時候包含了一個List列表
使用<collection>標籤
property:指定要對映List屬性名
ofType :指定List裡的類的全類名
<resultMap type="Bean物件全類名" id="規則名">
<result column="id" property="id"/>
<result column="dept_name" property="dname"/>
<collection property="List屬性名" ofType="List裡的類的全類名">
<id column="資料庫主鍵名" property="List裡的類的屬性名"/>
<result column="資料庫列名" property="List裡的類的屬性名"/>
</collection>
</resultMap>
使用分步查詢:
<resultMap type="Bean物件全類名" id="規則名">
<result column="id" property="id"/>
<result column="dept_name" property="dname"/>
<!-- List部分分步查詢對映 -->
<collection property="List屬性名"
select="介面方法名" column="要傳入下個查詢語句的列名">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
</collection>
</resultMap>
當傳入的引數值有多個時,column應使用如下格式:
column="{佔位符名=列名,佔位符名=列名,....}"
sql對映檔案的佔位符名應與column的佔位符名一致:
select * from tb1_employee where d_id = #{佔位符名}