属性parameterMap的值等于一个预先定义的元素的名称。parameterMap属性很少使用,更多的是使用的parameterClass
但是使用parameterMap可以提高数据库的访问效率,具体使用如下:
Xml代码
<parameterMap class="com.fenxiao.domain.CooperationDo" id="insertCooperationDoByMap " >
<parameter property="id"/>
<parameter property="supplierId"/>
<parameter property="supplierName"/>
<parameter property="distributorId"/>
<parameter property="distributorName"/>
<parameter property="status"/>
<parameter property="checkTime" />
<parameter property="applyTime" />
</parameterMap>
<!-- 使用了map -->
<insert id="Cooperation.insertCooperationByMap" parameterMap="insertCooperationDoByMap ">
insert into cooperation values(?,?,?,?,?,?,?,?);
<selectKey resultClass="java.lang.Integer" keyProperty="id">
select max(id) from cooperation
</selectKey>
</insert>
domain层
public class CooperationDo {
private int id ;
private int supplierId ;
private String supplierName ;
private int distributorId ;
private String distributorName ;
private byte status ;
private Date checkTime ;
private Date applyTime ;
...........getter setter方法
}
DAO类:
public int insertByMap(CooperationDo cooperationDo);
DAO实现类
public int insertByMap(CooperationDo cooperationDo) {
return (Integer)getSqlMapClientTemplate().insert("Cooperation.insertCooperationByMap", cooperationDo);
}
测试类:
@Test
public void insertByMap(){
CooperationDo cooperationDo = new CooperationDo();
cooperationDo.setDistributorId(4);
cooperationDo.setDistributorName("aaa4");
cooperationDo.setSupplierName("bbb4");
cooperationDo.setSupplierId(44);
cooperationDo.setStatus((byte)1);
cooperationDo.setApplyTime(new Date());
cooperationDo.setCheckTime(new Date());
int i = cooperationDao.insertByMap(cooperationDo);
System.out.println(i);
}
现在来具体分析下:
具体的parameterMap:
Xml代码
<parameterMap id=”parameterMapName” [class=”com.domain.Product”]>
<parameter property =”propertyName”
[jdbcType=”VARCHAR”]
[javaType=”string”]
[nullValue=”NUMERIC”]
[null=”-9999999”]
/>
<parameter…… />
<parameter …… />
</parameterMap>
Class属性是可选的,Class属性必须是JavaBean或Map实列,Class属性虽是可选的,但推荐大家指定,
Class属性可以用来验证传入的参数的合法性及优化查询
元素:
1.property
属性property是传给statement的参数对象的Java Bean属性名称。该名称根据需要,可以在statement中多次出现(即在SQL语句SET子句中被更新的属性,也可以作为条件出现在WHERE子句中)。
2.jdbcType
属性jdbcType用于显式地指定给本属性(property)赋值的数据库字段的数据类型。
注意! 大多数JDBC Driver只有在字段可以为NULL时需要指定jdbcType属性。因此,对于这些Driver,只是在字段可以为NULL时才需要指定type属性。
注意! 当使用Oracle Driver时,如果没有给可以为NULL的字段指定jdbcType属性,当试图给这些字段赋值NULL时,会出现“Invalid column type”错误。
3.javaType
属性javaType用于显式地指定被赋值参数Java属性的类名。
4.nullValue (要特别关注)
属性nullValue的值可以是对于property类型来说任意的合法值,用于指定NULL的替换值。就是说,当Java Bean的属性值等于指定值时,相应的字段将赋值NULL。这个特性允许在应用中给不支持null的数据类型(即int,double,float等)赋值null。当这些数据类型的属性值匹配null值(即匹配-9999)时,NULL将代替null值写入数据库。
元素
最后总结列出几点ParameterMap需要特别注意的几个细节:
1.在配置ParameterMap的时候,如果传入的参数对像是元数据类型(int,string etc),那么在配置Parameter元素的时候,property的属性名使用value。通过这种情况主要使用在为存储指定参数的情况下。
2.如果ParameterMap中配置的parameter元素不包含在传入参数对象中(属性或IDictionary对象的一个key,value项),将会产生异常,而不管在statement中有没有用到。
3.在使用parameterMap的extends属性时,它将会继承extends值对应的parameterMap配置,并且会继承它的所有的参数映射,并且顺序是从继承的那配置为基准开始计算。这个在需要用到extends属性的时候要特别注意。
4.在为存储过程传参过程要特别注意,参数映射与存储过程的参数之间的顺序对应要正确。而且必须为提供与存储过程足够的参数(parameter配置足够多),即使存储过程的部分参数已经有默认值了。否则将抛出System.ArgumentOutOfRangeExcept
ion异常。
5.正常情况下,应该尽量使用内联参数。
但是使用parameterMap可以提高数据库的访问效率,具体使用如下:
Xml代码
domain层
public class CooperationDo {
DAO类:
DAO实现类
public int insertByMap(CooperationDo cooperationDo) {
测试类:
@Test
现在来具体分析下:
Xml代码
Class属性是可选的,Class属性必须是JavaBean或Map实列,Class属性虽是可选的,但推荐大家指定,
Class属性可以用来验证传入的参数的合法性及优化查询
元素:
1.property
2.jdbcType
3.javaType
4.nullValue (要特别关注)
元素
最后总结列出几点ParameterMap需要特别注意的几个细节:
1.在配置ParameterMap的时候,如果传入的参数对像是元数据类型(int,string etc),那么在配置Parameter元素的时候,property的属性名使用value。通过这种情况主要使用在为存储指定参数的情况下。
2.如果ParameterMap中配置的parameter元素不包含在传入参数对象中(属性或IDictionary对象的一个key,value项),将会产生异常,而不管在statement中有没有用到。
3.在使用parameterMap的extends属性时,它将会继承extends值对应的parameterMap配置,并且会继承它的所有的参数映射,并且顺序是从继承的那配置为基准开始计算。这个在需要用到extends属性的时候要特别注意。
4.在为存储过程传参过程要特别注意,参数映射与存储过程的参数之间的顺序对应要正确。而且必须为提供与存储过程足够的参数(parameter配置足够多),即使存储过程的部分参数已经有默认值了。否则将抛出System.ArgumentOutOfRangeExcept
5.正常情况下,应该尽量使用内联参数。