ibatis实战之内联参数映射
----------
前面我们讨论了如何使用最简单形式的内联参数映射,来告诉ibatis我们想要在运行时代入到查询中的属性的名称。除了使用这种最简单的形式,也可以在内联参数映射中提供一些外部参数映射所允许的特性,例如:jdbcType(数据库类型)以及nullValue(参数的空值占位符),只要用冒号将参数名、数据库类型和空值占位符分隔开即可。当你的数据库中包含允许为空的列时,数据库类型通常是必需设置。这是因为JDBCAPI使用以下这个方法来把空值发送到数据库:
public void setNull(int parameterIndex,int sqlType);
如果你没有明确告诉ibatis究竟使用何种数据库类型,那么ibatis将默认地使用java.sql.Types.OTHER作为第二个参数,但一些数据库驱动程序是不允许这么做的(例如oracle驱动程序目前就不允许),此时 就会产生错误。
提示:当你使用内联参数映射却没有设置nullValue时,如果程序报错,并且在错误日志中出现了不在预期的数字1111时,那么很有可能问题就是你的驱动程序不喜欢没有显式类型的空值。OTHER这个整型值就是1111。
要在内联参数中把数据库类型告诉ibatis,你可以把java.sql.Types常量类中代表某个数据库类型的常量的名字添加到属性名称后面,并且用冒号将它们分隔开。下面这个示例就是一个使用内联参数方式指定数据库类型的已映射语句:
<select id="getOrderShippedAfter" resultClass="java.util.HashMap"> select * from order where shipDate > #value:DATE# </select>
关于空值占位符的语法是否正确,如下例,待确认:
<select id="getOrderShippedAfter" resultClass="java.util.HashMap">
select * from order where shipDate > #value:DATE:1234#
</select>
说明:请牢记我们使用的是XML。在之前给出的示例中,如果想要创建名为getOrderShippedBefore的语句并且设置查询条件shipDate < #value:DATE#,我们就必须使用<(而不是<),因为xml中,小于号表示你要开始一个新的元素。也可以使用CDATA,但是同时使用动态SQL和CDATA时要特别小心,因为CDATA中的动态SQL标签将不会被解析。通常,在xml中也可以直接使用>,但是为了安全起见最好使用>来代替。
在ibatis的当前版本中,还可以使用name=value语法来设定参数映射。例如,以下示例和前一个示例是等价的:
<select id="getOrderShippedAfter" resultClass="hashmap"> select * from order where shipDate > #value,jdbcType=DATE# </select>
空值占位符的语法,待确认,如下:
<select id="getOrderShippedAfter" resultClass="hashmap"> select * from order where shipDate > #value,jdbcType=DATE,nullValue=1234# </select>