iBATIS SQL Maps之Parameter Map。

parameterMap负责将Java Bean的属性映射成statement的参数。虽然parameterMap的外部形式很少使用,理解它如何工作对于理解inline parameter还是很有帮助。

<parameterMap id = "parameterMapName" [class = "com.domain.Product"] >

<parameter property = "propertyName" [jdbcType = "VARCHAR"] [javaType = "string"]  [nullValue = "NUMERIC"] [null = "-9999999"]/>

<parameter ... ... />

<parameter ... ... />

</parameterMap>

括号[]是可选的属性。parameterMap元素只要求属性id作为唯一标识。属性class是可选的但强烈推荐使用。和parameterClass类似,class属性可以框架检查输入参数的类型并优化性能。


<parameter>元素

一个parameterMap可包含任意多的parameter元素。以下讨论parameter的各个属性。

  • property
属性property是传给statement的参数对象的JavaBean属性名称。该名称根据需要,可以在statement中多次出现(即在SQL语句SET子句中被更新的属性,也可以作为条件出现在WHERE子句中)。

  • jdbcType
属性jdbcType用于显示的指定给本属性(property)赋值的数据库字段的数据类型。对于某些特定的操作,如果不指定字段的数据类型,某些JDBC Driver无法识别字段的数据类型。一个很好地例子是PreparedStatement.setNull(int parameterIndex, int sqlType)方法,要求指定数据类型。如果不指定数据类型,某些Driver可能指定为Types.Other或Types.Null。但是,不能保证所有的Driver都表现一致。对于这种情况,SQL Map API允许使用parameterMap子元素parameter的jdbcType属性指定数据类型。
正常情况下,只有当字段可以为NULL时才需要jdbcType属性。另一需要指定jdbcType属性的情况时字段类型为日期时间类型的情况。因为Java只有一个Date类型(java.util.Date),而大多数SQL数据库有多个——通常至少有3种。因此,需要指定字段类型是DATE还是DATETIME。
属性jdbcType可以是JDBC Types类中定义的任意参数的字符串值。虽然如此,还是有某些类型不支持(即BLOB)。
注意!大多数JDBC Driver只有在字段可以为NULL时需要指定jdbcType属性。因此,对于这些Driver,只是在字段可以为NULL时才需要指定type属性。
注意!当使用Oracle Driver时,如果没有给可以为NULL的字段指定jdbcType属性,当试图给这些字段赋值NULL时,会出现“Invalid column type”错误。

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

  • nullValue
属性nullValue的值可以是对于property类型来说任意的合法值,用于指定NULL的替换值。就是说,当JavaBean的属性值等于指定值时,相应的字段将赋值NULL。这个特性允许在应用中给不支持null的数据类型(即匹配-9999)时,NULL将代替null值写入数据库。

  • <parameterMap>的例子
以下是一个完整的例子。
<parameterMap id = "insert-product-param" class = "com.domain.Product">
<paramter property = "id" jdbcType = "NUMERIC" javaType = "int" nullValue = "-9999999"/>
<paramter property = "description " jdbcType = "VARCHAR " nullValue = "NO_ENTRY "/>
</parameterMap>
<statement id = "insertProduct" parameterMap = "insert-product-param">
insert into PRODUCT(PRD_ID, PRD_DESCRIPTION) values(?,?);
</statement>
上面的例子中,JavaBean的属性“id”和“description”将按顺序地替换Mapped Statement “insertProduct” 的值符号(?)。因此,“id”赋值给第一个参数而“description”赋值给第二个参数。如果将顺序倒过来,XML配置将变成:
<parameterMap id = "insert-product-param" class = "com.domain.Product">
<parameter property = "description" />
<parameter property = "id" />
</parameterMap>
<statement id = "insertProduct" parameterMap = "insert-product-param">
insert into PRODUCT(PRD_DESCRIPTION, PRD_ID) values(?, ?);
</statement>
注意!parameterMap并不自动地绑定到特定的Java类。因此在上面的例子中,任何拥有“id”和“description”属性的JavaBean对象,都可以作为parameterMap的输入。如果需要将输入绑定到特定的Java类,可以使用mapped-statement的resultClass属性。
注意!Parameter Map的名称(name)局部的,只在定义它的SQL Map XML文件中有效。不过,加上SQL Map的名称(即在<sqlMap根元素中的名称>)作为前缀,您可以在另一个SQL Map XML文件中引用它。例如,要在另一个文件中引用以上的parameterMap,可以使用名称“Product.insert-product-param”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值