1. 程式人生 > >MyBatis之自定義對映規則(連線查詢,需要修改對應對映時使用)

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 = #{佔位符名}