select属性select用于描述对象之间的关系,并自动地装入复杂类型(即用户定义的类型)属性的数据。属性select的值必须是另外一个mapped statement元素的名称。在同一个result元素中定义的数据库字段(column属性)以及property属性,将被传给相关的mapped statement作为参数。因此,字段的数据类型必须是SQL Map支持的简单数据类型。关于简单数据类型和复杂类型之间映射/关系的信息,参照后面章节更详细的讨论。
隐式的Result Map
假如您有简单的映射,不需要重用定义好的resultMap,有一个快速的方法,就是通过设定mapped statement的resultClass属性来隐式地指定result map。诀窍在于,保证返回的ResultSet的字段名称(或标签或别名)和Java Bean中可写入属性的名称匹配。例如,考虑以上的Product类,可以创建一个带有隐式result map的mapped statement如下:
<statement id=”getProduct”resultClass=”com.ibatis.example.Product">
select
PRD_ID as id,
PRD_DESCRIPTION as description
from PRODUCT
where PRD_ID = #value#
</statement>
上面的mapped statement定义了resultClass属性,并为每个字段指定了别名,用于匹配Product类的属性名称。这样就可以了,不需要result map。缺点在于,您无法指定字段的数据类型(通常不是NULLABLE字段不需要),或NULL替代值(或<result>别的属性)。另外还要记住,数据库很少是大小写敏感的,因此隐式result map对大小写也不敏感。假如您的Java Bean有两个属性,一个是firstName,另一个是firstname,数据库会把两者看作同一个属性,因而不能使用隐式的result map(这也可以看作是Java Bean设计的一个潜在问题)。此外,使用resultClass的自动映射也对性能有轻微的不利影响。因为读取ResultSetMetaData信息会使某些JDBC Driver变慢。
基本类型的Result(即String,Integer,Boolean)
除了支持符合Java Bean规范的Java类,Result Map还可以给基本类型包装类如String,Integer,Boolean等赋值。使用下面章节讨论的API(参见executeQueryForList()),Result Map还可以得到基本类型包装类的集合。基本类型可以象Java Bean一样映射,只是要记住一个限制,基本类型只能有一个属性,名字可以任意取(常用“value”或“val”)。例如,如果您要获得所有产品描述的一个列表而不是整个Product类,Result Map如下:
<resultMap id=”get-product-result” class=”java.lang.String”>
<result property=”value” column=”PRD_DESCRIPTION”/>
</resultMap>
更简单方法是,在mapped statement中使用resultClass属性(使用“as”关键字给字段取别名“value”):
<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(1) as value
from PRODUCT
</statement>
Map类型的Result
Result Map也可以方便为一个Map(如HashMap或TreeMap)对象赋值。使用下面讨论的API(参见executeQueryForList()),还可以得到Map对象的集合(即Map的List)。Map对象与Java Bean同样的方式映射,只是使用name属性值作为Map的键值,用它来索引相应的数据库字段值,而不是象Java Bean一样给属性赋值。例如,如果您要将Product对象的数据装入Map,可以这样做:
<resultMap id=”get-product-result” class=”java.util.HashMap”>
<result property=”id” column=”PRD_ID”/>
<result property=”code” column=”PRD_CODE”/>
<result property=”description” column=”PRD_DESCRIPTION”/>
<result property=”suggestedPrice” column=”PRD_SUGGESTED_PRICE”/>
</resultMap>
上面的例子会创建一个HashMap的实例并用Product的数据赋值。Property的name属性值(即“id”)作为HashMap的键值,而列值则作为HashMap中相应的值。
当然,可以把Map类型Result和隐式的Result Map一起使用。例如:
<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>
上面的例子中,结果集将以Map类型返回。
隐式的Result Map
假如您有简单的映射,不需要重用定义好的resultMap,有一个快速的方法,就是通过设定mapped statement的resultClass属性来隐式地指定result map。诀窍在于,保证返回的ResultSet的字段名称(或标签或别名)和Java Bean中可写入属性的名称匹配。例如,考虑以上的Product类,可以创建一个带有隐式result map的mapped statement如下:
<statement id=”getProduct”resultClass=”com.ibatis.example.Product">
select
PRD_ID as id,
PRD_DESCRIPTION as description
from PRODUCT
where PRD_ID = #value#
</statement>
上面的mapped statement定义了resultClass属性,并为每个字段指定了别名,用于匹配Product类的属性名称。这样就可以了,不需要result map。缺点在于,您无法指定字段的数据类型(通常不是NULLABLE字段不需要),或NULL替代值(或<result>别的属性)。另外还要记住,数据库很少是大小写敏感的,因此隐式result map对大小写也不敏感。假如您的Java Bean有两个属性,一个是firstName,另一个是firstname,数据库会把两者看作同一个属性,因而不能使用隐式的result map(这也可以看作是Java Bean设计的一个潜在问题)。此外,使用resultClass的自动映射也对性能有轻微的不利影响。因为读取ResultSetMetaData信息会使某些JDBC Driver变慢。
基本类型的Result(即String,Integer,Boolean)
除了支持符合Java Bean规范的Java类,Result Map还可以给基本类型包装类如String,Integer,Boolean等赋值。使用下面章节讨论的API(参见executeQueryForList()),Result Map还可以得到基本类型包装类的集合。基本类型可以象Java Bean一样映射,只是要记住一个限制,基本类型只能有一个属性,名字可以任意取(常用“value”或“val”)。例如,如果您要获得所有产品描述的一个列表而不是整个Product类,Result Map如下:
<resultMap id=”get-product-result” class=”java.lang.String”>
<result property=”value” column=”PRD_DESCRIPTION”/>
</resultMap>
更简单方法是,在mapped statement中使用resultClass属性(使用“as”关键字给字段取别名“value”):
<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(1) as value
from PRODUCT
</statement>
Map类型的Result
Result Map也可以方便为一个Map(如HashMap或TreeMap)对象赋值。使用下面讨论的API(参见executeQueryForList()),还可以得到Map对象的集合(即Map的List)。Map对象与Java Bean同样的方式映射,只是使用name属性值作为Map的键值,用它来索引相应的数据库字段值,而不是象Java Bean一样给属性赋值。例如,如果您要将Product对象的数据装入Map,可以这样做:
<resultMap id=”get-product-result” class=”java.util.HashMap”>
<result property=”id” column=”PRD_ID”/>
<result property=”code” column=”PRD_CODE”/>
<result property=”description” column=”PRD_DESCRIPTION”/>
<result property=”suggestedPrice” column=”PRD_SUGGESTED_PRICE”/>
</resultMap>
上面的例子会创建一个HashMap的实例并用Product的数据赋值。Property的name属性值(即“id”)作为HashMap的键值,而列值则作为HashMap中相应的值。
当然,可以把Map类型Result和隐式的Result Map一起使用。例如:
<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>
上面的例子中,结果集将以Map类型返回。