先看個具體的例子:
1 <resultMap id=”get-product-result” class=”com.ibatis.example.Product”> 2 <result property=”id” column=”PRD_ID”/> 3 <result property=”description” column=”PRD_DESCRIPTION”/> 4 </resultMap> 5 <statement id=”getProduct” resultMap=”get-product-result”> 6 select * from PRODUCT 7 </statement>
注意resultMap支持“select *”,並不要求定義ResultSet所有返回字段的映射。
在SQL Map框架中,Result Map是極其重要的組件。在執行查詢Mapped Statement時,resultMap負責將結果集的列值映射成Java Bean的屬性值。resultMap的結構如下:
1 <resultMap id=”resultMapName” class=”some.domain.Class” [extends=”parent-resultMap”]> 2 <result property=”propertyName” column=”COLUMN_NAME” 3 [columnIndex=”1”] 4 [javaType=”int”] 5 [jdbcType=”NUMERIC”] 6 [nullValue=”-999999”] 7 [select=”someOtherStatement”] 8 /> 9 <result ……/> 10 <result ……/> 11 <result ……/> 12 </resultMap>
1.extends 是可選的屬性,可設定成另外一個resultMap的名字,並以它為基礎。和在Java中繼承一個類相似,父resultMap的屬性將作為子 resutlMap的一部分。父resultMap的屬性總是加到子resultMap屬性的前面,並且父resultMap必須要在子 resultMap之前定義。父resultMap和子resultMap的class屬性不一定要一致,它們可以沒有任何關系。
注意!ResultSet的列值按它們在resultMap中定義的順序讀取 (這特性會在某些實現得不是很好的JDBC Driver中派上用場)。
2.屬性columnIndex 的值是ResultSet中用於賦值Java Bean屬性的字段次序號,
提供了我們將數據集的第幾個下標字段映射到指定的數據對象屬性的方案
3.屬性nullValue 指定數據庫中NULL的替代值。因此,如果從ResultSet中讀出NULL值,Java Bean屬性將被賦值屬性null指定的替代值。屬性null的值可以指定任意值,但必須對於Java Bean屬性的類型是合法的。
4.屬性select 用於描述對象之間的關系,並自動地裝入復雜類型(即用戶定義的類型)屬性的數據。屬性select的值必須是另外一個mapped statement元素的名稱。
先說一下它的屬性值必須是一個返回數據集合的查詢語句的id,能配置這個屬性的數據類屬性可以是一個基元類型,復合類型,也可以是一個包括多條數據的集合類型,這些類型都行,沒有問題的。它的一處重要的存在意義就在於描述不同表之間的關系問題,通過本次的查詢,你想不通過join的手段從另一個表查詢相關字段的時候,你就可以使用select屬性。
1 <resultMap id="DemoResultMap" class="Hashtable"> 2 <result property="id" column="id"/> 3 <result property="Children" column="id" 4 select="SELECT_Children"/> 5 </resultMap> 6 7 <statements> 8 <select id="SELECT_Children" resultClass="ChildrenObject"> 9 SELECT * FROM Children WHERE ParentID = #id# 10 </select> 11 </statements>
