iBATIS SQL Maps之Result Map属性。

来源:互联网 发布:恋夜秀场源码 编辑:程序博客网 时间:2024/04/28 17:11

在SQL Map框架中,Result Map是极其重要的组件。在执行查询Mapped Statement时,resultMap负责将结果集的列值映射成JavaBean的属性值。resultMap的结构如下:

<resultMap id = "resultMapName" class = "some.domain.Class" [extengds = "parent-resultMap"]>

<result property = "propertyName" column = "COLUMN_NAME" [columnIndex = "1"] [javaType = "int"] [jdbcType = "NUMERIC"] [nullValue = "-999999"] [select = "someOtherStatement"]/>

<result ...... />

<result ...... />

<result ...... />

</resultMap>

括号[]中是可选的属性。resultMap的id属性是statement的唯一标识。ResultMap的class属性用于指定Java类的全限定名(即包括包的名称)。该Java类初始化并根据定义填充数据。extends是可选的属性,可设定成另外一个resultMap的名字,并以它为基础。和在Java中继承一个类相似,父resultMap的属性将作为子resultMap的一部分。父resultMap的属性总是加到子resultMap属性的前面,并且父resultMap必须要在子resultMap之前定义。父resultMap和子resultMap的class属性不一定要一致。他们可以没有任何关系。

resultMap可以包括任意多的属性映射,将查询结果集的列值映射成JavaBean的属性。属性的映射按它们在resultMap中定义的顺序进行。相关的JavaBean类必须符合JavaBean规范,每一属性都必须拥有get/set方法。

注意!ResultSet的列值按它们在resultMap中定义的顺序读取(这特性会在某些实现得不是很好地JDBC Driver中派上用场)。

下面几个小节讨论resultMap的result元素各个属性:

  • property
属性property的值是mapped statement返回结果对象的JavaBean属性的名称(get方法)。

  • column
属性column的值是ResultSet中字段的名称,该字段赋值给names属性指定的JavaBean属性。同一个字段可以多次使用。注意,可能某些JDBC Driver(例如,JDBC/ODBC桥)不允许多次读取同一字段。

  • columnIndex
属性columnIndex是可选的,用于改善性能。属性columnIndex的值是ResultSet中用于赋值JavaBean属性的字段次序号。在99%的应用中,不太可能需要牺牲可读性来换取性能。使用columnIndex,某些JDBC Driver可以大幅提高性能,某些则没有效果。

  • jdbcType
属性type用于指定ResultSet中用于赋值JavaBean属性的类型。正常情况下,这可以通过反射从JavaBean的属性获得,但对于某些映射(例如Map和XML document),框架不能通过这种方法来获知。如果没有设置JavaType,同时框架也不能获知类型信息,类型将被假定为Object。

  • nullValue
属性nullValue指定数据库中NULL的替代值。因此,如果从ResultSet中读出NULL值,JavaBean属性将被赋值属性null指定的替代值。属性null的值可以指定人一直,但必须对于JavaBean属性的类型是合法的。
如果数据库中存在NULLABE属性的字段,但您需要指定的常量代替NULL,您可以这样设置resultMap:
<resultMap id = "get-product-result" class = "com.ibatis.example.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。这让您在Java类中用基本类型的属性映射数据库中的NULLABE字段。记住,如果您要在查询和更新中同样适用这个功能,必须同时在parameterMap中指定nullValue属性。

  • select
属性select用于描述对象之间的关系,并自动的装入复杂类型(即用户定义的类型)属性的数据。属性select的值必须是另外一个Mapped Statement元素的名称。在同一个result元素中定义的数据库字段(column属性)以及property属性,将被传给相关的mapped statement作为参数。因此,字段的数据类型必须是SQL Map支持的简单数据类型。

原创粉丝点击