# Result Map以及属性
# Result Map
在命名SQL框架中,Result Map是极其重要的组件。在执行查询Mapped Statement时,resultMap负责将结果集的列值映射成对象的属性值。resultMap的结构如下:
<resultMap id="resultMapName" class="commonj.sdo.DataObject" >
<result property="propertyName" column="COLUMN_NAME" [columnIndex="1"]
[javaType="int"] [jdbcType="NUMERIC"] [nullValue="-999999"] />
<result .../>
<result .../>
</resultMap>
括号[]中是可选的属性。resultMap的id属性是唯一标识。ResultMap的class属性用于指定DataObject的类型名称(包括URI)。resultMap可以包括任意数量的属性映射,将查询结果集的列值映射成DataObject的属性。属性的映射按它们在resultMap中定义的顺序进行。
# Result Map的属性
# property
属性property的值是Mapped Statement返回结果对象的属性的名称。
# column
属性column的值是ResultSet中字段的名称,该字段赋值给names属性指定的Java Bean属性。同一字段可以多次使用。
注意:可能某些JDBC Driver(例如:JDBC/ODBC桥)不允许多次读取同一字段。
# columnIndex
属性columnIndex是可选的,用于改善性能。属性columnIndex的值是ResultSet中用于赋值DataObject属性的字段次序号。在99%的应用中,不太可能需要牺牲可读性来换取性能。
# jdbcType
属性jdbcType用于指定ResultSet中用于赋值DataObject属性的字段的数据库数据类型。虽然resultMap没有NULL值的问题,指定jdbcType属性对于映射某些类型(例如Date属性)还是有用的。因为Java只有一个Date类型,而SQL数据库可能有几个(通常至少有3个),为保证Date(和其他)类型能正确的赋值,某些情况下指定type还是有必要的。同样地,String类型的赋值可能来自VARCHAR、CHAR和CLOB,因此同样也有必要指定jdbcType属性。
# javaType
属性javaType用于显式地指定被赋值的DataObject属性的类型。如果没有提供类型将被假定为Object。
# nullValue
属性nullValue指定数据库中NULL的替代值。因此,如果从ResultSet中读出NULL值,DataObject属性将被赋值属性null指定为替代值。属性null的值可以指定任意值,但必须对于DataObject属性的类型是合法的。如果数据库中存在NULLABE属性的字段,但用户需要用指定的常量代替NULL,可以这样设置resultMap:
<resultMap id="get-product-result" class="com.eos.Product">
<result property="id" column="PRD_ID"/>
<result property="description" column="PRD_DESCRIPTION"/>
<result property="subCode" column="PRD_SUB_CODE" nullValue="-999"/>
</resultMap>
上面的例子中,如果PRD_SUB_CODE的值是NULL,subCode属性将被赋值-999。这可以让用户在DataObject中用基本类型的属性映射数据库中的NULLABLE字段。
如果用户要在查询和更新中同样使用这个功能,必须同时在parameterMap中指定nullValue属性。