# Inline Parameter Map
# 概述
parameterMap的语法虽然简单,但很繁琐。还有一种更受欢迎更灵活的方法,可以大大简化定义和减少代码量。这种方法把属性名称嵌在Mapped Statement的定义中(即直接写在SQL语句中)。缺省情况下,任何没有指定parameterMap的Mapped Statement都会被解析成inline parameter(内嵌参数)。
# 场景示例
<statement id="insertProduct" parameterClass="commonj.sdo.DataObject">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#);
</statement>
这样就会从传入的DataObject查找属性名为id和description的2个属性值,赋值到相应的数据库字段。 在内嵌参数中指定数据类型可以用下面的语法:
<statement id="insertProduct" parameterClass="commonj.sdo.DataObject">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC#, #description:VARCHAR#);
</statement>
如果有null值处理,可以参考下面的语句:
<insert id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#)
</insert>
说明:
Inline Parameter Map有2种语法,一种是简单的以":"分割,这种语法只包括3种格式:
#propertyName# #propertyName:jdbcType# #propertyName:jdbcType:nullValue#
第2种语法是以","分割,语法如下:#propertyName,javaType=?,jdbcType=?,mode=?,nullValue=?#。
# 注意
上面的例子中,所有的参数都用##包起来,这样生成的是PreparedStatement;还可以使用$$把参数包起来,这样生成的是Statement,即在执行sql时会先把参数放入到sql中,这在like或in条件时会有用。例如:
<select id="selectProduct" parameterClass="commonj.sdo.DataObject">
select * from PRODUCT where PRD_DESCRIPTION like '%$description$%'
</select>
<select id="selectProduct" parameterClass="commonj.sdo.DataObject">
select * from PRODUCT where PRD_ID in ($prdIdList$)
</select>