先看个具体的例子:
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>