iBatis 之 SQL Map XML映射文件

parameterClass
parameterClass属性的值是Java类的全限定名(即包括类的包名)。parameterClass属性是可选的,但强烈建议使用。它的目的是限制输入参数的类型为指定的Java类,并优化框架的性能。如果您使用parameterMap,则没有必要使用parameterClass属性。例如,如果要只允许Java类“examples.domain.Product”作为输入参数,可以这样作:


<statement id="statementName"  parameterClass="examples.domain.Product">

insert into PRODUCT values (#id#,#description#, #price#)

</statement>

重要提示:虽然2.0向后兼容,但强烈建议使用parameterClass(除非没必要)。通过提供parameterClass,您可以获得更好的性能,因为如果框架事先知道这个类,就可以优化自身的性能。
如果不指定parameterClass参数,任何带有合适属性(get/set方法)的Java Bean都可以作为输入参数。

parameterMap
属性parameterMap的值等于一个预先定义的<parameterMap>元素的名称。parameterMap属性很少使用,更多的是使用上面的parameterClass和inline parameter(接下来会讨论)。
注意!动态mapped statement只支持inline parameter,不支持parameter map。
parameterMap的基本思想是定义一系列有次序的参数系列,用于匹配JDBC PreparedStatement的值符号。例如:


<parameterMap id="insert-product-param" class="com.domain.Product">
     <parameter property="id"/>
     <parameter property="description"/>
</parameterMap>

<statement id="insertProduct" parameterMap="insert-product-param">
      insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
</statement>

上面的例子中,parameter map的两个参数按次序匹配SQL语句中的值符号(?)。因此,第一个“?”号将被“id”属性的值替换,而第二个“?”号将被“description”属性的值替换。Parameter Map及其选项将在以后详细讨论。


resultClass


resultClass属性的值是Java类的全限定名(即包括类的包名)。resultClass属性可以让您指定一个Java类,根据ResultSetMetaData将其自动映射到JDBC的ResultSet。只要是Java Bean的属性名称和ResultSet的列名匹配,属性自动赋值给列值。这使得查询mapped statement变得很短。例如:

<statement id="getPerson" parameterClass=”int” resultClass="examples.domain.Person">
      SELECT PER_ID as id,
             PER_FIRST_NAME as firstName,
             PER_LAST_NAME as lastName,
             PER_BIRTH_DATE as birthDate,
             PER_WEIGHT_KG as weightInKilograms,
             PER_HEIGHT_M as heightInMeters
     FROM PERSON
     WHERE PER_ID = #value#
</statement>


在上面的例子中,Person类拥有属性包括id,firstName,lastName,birthDate,weightInKilograms和heightInMeters。每一个属性对应SQL查询语句一个列的别名(使用“as”关键字-标准的SQL语法)。一般情况下,列名和属性名称不匹配,就需要使用“as”关键字。当执行mapped statement时,Person类将被初始化,从结果集中得到的列值将根据属性名和列名映射成Person对象的属性值。
正如以前所说,使用resultClass的自动映射存在一些限制,无法指定输出字段的数据类型(如果需要的话),无法自动装入相关的数据(复杂属性),并且因为需要ResultSetMetaData的信息,会对性能有轻微的不利影响。但使用resultMap,这些限制都可以很容易解决。



resultMap

resultMap是最常用和最重要的属性。ResultMap属性的值等于预先定义的resultMap元素的name属性值(参照下面的例子)。使用resultMap可以控制数据如何从结果集中取出,以及哪一个属性匹配哪一个字段。不象使用resultClass的自动映射方法,resultMap属性可以允许指定字段的数据类型,NULL的替代值复杂类型映射(包括其他Java Bean,集合类型和基本类型包装类)。


关于resultMap的详细讨论放在以后的章节,这里只给出一个相关statement的resultMap的例子。
<resultMap id="get-product-result" class="com.ibatis.example.Product">
       <result property="id" column="PRD_ID"/>
       <result property="description" column="PRD_DESCRIPTION"/>
</resultMap>
<statement id="getProduct"  resultMap="get-product-result">
        select * from PRODUCT
</statement>


上面的例子中,通过resultMap的定义,查询语句得到的ResultSet被映射成Product对象。resultMap定义的“id”属性值将赋予“PRO_ID”字段值,而“description”属性值将赋予“PRD_DESCRIPTION”字段值。注意resultMap支持“select *”,并不要求定义ResultSet所有返回字段的映射。


自动生成的主键
很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。

它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:

<!—Oracle SEQUENCE Example -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
</selectKey>
insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)
values (#id#,#description#)
</insert>

<!— Microsoft SQL Server IDENTITY Column Example -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>


基本类型输入参数

假如没必要写一个Java Bean作为参数,可以直接使用基本类型的包装类(即String,Integer,Date等)作为参数。例如:


<statement id=”insertProduct” parameter=”java.lang.Integer”>
select * from PRODUCT where PRD_ID = #value#
</statement>

假设PRD_ID的数据类型是NUMERIC,要调用上面的mapped statement,可以传入一个java.lang.Integer对象作为参数。Integer对象的值将代替#value#参数。当使用基本类型包装类代替Java Bean时,切记要使用#value#作为参数。Result Map(参见以下章节)也支持使用基本类型作为结果参数。
为了使定义更简洁,基本类型可以使用别名。例如,可以用“int”来代替“java.lang.Integer”。


Map类型输入参数
假如没必要写一个Java Bean作为参数,而要传入的参数又不只一个时,可以使用Map类(如HashMap,TreeMap等)作为参数对象。例如:


<statement id=”insertProduct” parameterClass=”java.util.Map”>
select * from PRODUCT
where PRD_CAT_ID = #catId#
and PRD_CODE = #code#
</statement>

可以注意到mapped statement的形式完全没有区别!上面的例子中,如果把Map对象作为输入参数去调用mapped statement,Map对象必须包含键值“catId”和“code”。键值引用的对象必须是合适的类型,以上面的例子来说,必须是Integer和String。Result Map(参见以下章节)也支持使用Map类型作为结果参数。要获得更多信息,请参见“Result Map”和“使用SQL Map API编程”部分。
Map类型也可以使用别名。例如,可以用“map”来代替“java.util.Map”。这些别名参见下面的“支持Parameter Map和Result Map的数据类型”表格。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值