转自 http://www.cnblogs.com/anderslly/archive/2007/11/05/executingnonquerystatement01.html

 

语句类型

特性

子元素

用途

详细内容参考

<insert>

id parameterClass parameterMap

所有动态元素<selectKey> <generate>

插入数据

5.2节;
第8章

<update>

id
parameterClass parameterMap extends

所有动态元素

更新数据

5.3节;
第8章

<delete>

id
parameterClass parameterMap extends

所有动态元素

删除数据

5.3节;
第8章

<procedure>

id 
parameterMap resultClass resultMap cacheModel

所有动态元素

执行存储过程

5.5节;
第8章

<statement>

id parameterClass resultClass listClass parameterMap resultMap cacheModel

所有动态元素

可以包含任意类型的语句,几乎无所不能

6.3.1节;
第8章

内联参数

<insert id="insertWithInlineInfo">
    insert into account (
    accountId,
    username, password,
    memberSince,
    firstName, lastName,
    address1, address2,
    city, state, postalCode,
    country, version) 
    values (
    #accountId:NUMBER#,
    #username:VARCHAR#, #password:VARCHAR#,
    #memberSince:TIMESTAMP#,
    #firstName:VARCHAR#, #lastName:VARCHAR#,
    #address1:VARCHAR#, #address2:VARCHAR#,
    #city:VARCHAR#, #state:VARCHAR#, #postalCode:VARCHAR#,
    #country:VARCHAR#, #version:NUMBER#
    )
</insert>

这种方式确实有效,但是一旦程序中包含了<insert><update>语句的多个版本,代码就变得冗长而且难以维护。如果不幸发生了这种情况,那么外部参数就可以帮我们简化SQL Map文件的维护工作了。

外部参数

外部参数不仅可以提供内联参数的功能,还能改善性能并在加载时提供更多的校验(这意味着运行时的更少错误)。

这里时一个使用外部参数的<insert>语句示例,其代码在功能上与上个例子一样。

<parameterMap id="fullParameterMapExample" class="Account">
    <parameter property="accountId" dbType="NUMBER" />
    <parameter property="username" dbType="VARCHAR" />
    <parameter property="password" dbType="VARCHAR" />
    <parameter property="memberSince" dbType="TIMESTAMP" />
    <parameter property="firstName" dbType="VARCHAR" />
    <parameter property="lastName" dbType="VARCHAR" />
    <parameter property="address1" dbType="VARCHAR" />
    <parameter property="address2" dbType="VARCHAR" />
    <parameter property="city" dbType="VARCHAR" />
    <parameter property="state" dbType="VARCHAR" />
    <parameter property="postalCode" dbType="VARCHAR" />
    <parameter property="country" dbType="VARCHAR" />
    <parameter property="version" dbType="NUMBER" />
</parameterMap>
        
<insert id="insertWithExternalInfo"
parameterMap="fullParameterMapExample">
    insert into account (
    accountId,
    username, password,
    memberSince
    firstName, lastName,
    address1, address2,
    city, state, postalCode,
    country, version) 
    values (?,?,?,?,?,?,?,?,?,?,?,?,?)
</insert>

 

参数映射(Parameter Map)定义了一个参数的有序列表,它与查询语句的占位符相匹配。注意,参数对象的属性定义可以按任意顺序,参数映射会确保每个值得以正确地传入。

使用外部参数映射时,我们可以指定多达10个的特性。如果没有完全指定,iBATIS会藉由反射来确定出一些合理的默认值,这个过程会花费一定的时间,也有可能不够准确。表4.4列出了适用于映射参数的特性,并对其做了简要的介绍。

映射参数的特性(attribute)

特性

描述

property

表示参数对应的对象的属性名称。如果输入参数对象为IDictionary,则property是相应key的名称。同一property值可以出现多次,这取决于它在语句中出现的次数。

column

用于定义存储过程的参数名称。

direction

可用于指定存储过程参数的方向。其值可以是Input,Output或InputOutput。

dbType

用于显式地指定参数对应的列类型。对于某些操作,一些ADO.NET provider不能判断列的类型,此时dbType必须指定。

此特性仅在列为nullable时是必需的。此外,在显式指定日期类型时也需要此特性。尽管.NET仅有一种日期值类型(System.DateTime),大多数数据库却不止一个。通常情况下,数据库至少有三种不同的日期类型(Date,DateTime,TimeStamp)。为使映射过程能够正确,我们可能需要指定列的dbType。

type

用于指定前面的property的CLR类型。在向存储过程传入InputOput和Output类型的参数时,该特性很有用。

正常情况下,property的类型可通过反射获得,但对于IDictionary类型的参数就无能为力了,此时类型被假定为Object。

nullValue

nullValue可以设置为任何的有效值(这取决于property的类型)。

注意:对于值类型(int,double,datetime等)的属性,它们是不能为null的,那如何向数据库中插入null值呢?可以采用nullValue,比如对于Age列(int类型),我们可以指定nullValue为0,这意味着如果该属性未设置(C#中,int属性的默认值为0),那么会向数据库插入NULL。在.NET2.0中也可以使用nullable类型,此时更为方便。请参考我的小文

size

设置列的最大尺寸。

precision

设置数字值的精度。

scale

设置小数的位数。

typeHandler

用于自定义类型处理器(Custom Type Handler)。

 

 

posted on 2012-06-05 14:43  饭菜糖衣  阅读(332)  评论(0编辑  收藏  举报