iBatis.Net系列(五) ParameterMap

转载 2006年06月19日 11:16:00
      在用Ado.Net进行数据库访问操作中,最麻烦的就是准备DbCommand必须为它添加DbParameter,特别是当要传的参数特别多的情况下,数据访问层的很多代码都是花在这里。iBatisParameterMap配置就是针对这个问题所提出的一种解决方案,基于xml的配置,把字段名和对象的属性对应起来,通过运行时的一些工作,自动为DbCommand提供它所需的参数集合。从而避免了我们直接写很多重复代码。

Employees_ParameterMap.xml配置文件中:

<select id="Employees_SelectWithParameterClass" parameterClass="Employee" resultClass="Employee" listClass="ArrayList">

    SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = #EmployeeID# OR LastName = #LastName#

</select>

使用的是内联参数映射的方式,语句的在执行查询时只需为它提供Employee类型的对象,它就会自动去读自己需要的EmployeeIDLastName属性的值,返回查询结果。在执行时它所执行的语句如下:

[SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID =  @param0  OR LastName =  @param1]

所需的参数的提供方式如下:

[@param0=[EmployeeID,12], @param1=[LastName,8bbb7bfb-c]]

并且,在iBatis中还会指出各个参数的类型:

[@param0=[Int32, System.Int32], @param1=[String, System.String]]

对于下面这个配置:

<select id="Employees_SelectWithParameterMap1" parameterMap="Employee_SelectParameterMap" resultClass="Employee" listClass="ArrayList">

        SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = #EmployeeID# OR LastName = #LastName# OR Country = #Country#

    </select>

它所使用的ParameterMap配置如下:

    <parameterMap class="Employee" id="Employee_SelectParameterMap">

        <parameter column="EmployeeID" property="EmployeeID" dbType="int" type="int" direction="Input"/>

        <parameter column="LastName" property="LastName" dbType="nvarchar" type="string" direction="Input"/>

        <parameter column="Country" property="Country" dbType="nvarchar" type="string" direction="Input"/>

    </parameterMap>

在每一个Parameter映射元素可以指定每个属性对应的列,它的类型和对应的数据库的类型,还可以指定当它为空值时的默认值,具体可以参看官方文档。但是可以看到,我们期待它能和内联参数一样的使用方法,如上配置的那样。可是行不行呢?从程序的执行结果来看,是不可以的。由于之前在配置SQL语句的时候基本都是使用内联参数没有特别注意到这点。在使用Parameter Map的时候是不能用#property#的形式显示地指定要使用的属性参数,只能通过“?”,顺序替代每一个parameter元素,如下:

<select id="Employees_SelectWithParameterMap2" parameterMap="Employee_SelectParameterMap" resultClass="Employee" listClass="ArrayList">

            SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = ? OR LastName = ? OR Country = ?

    </select>

可以看到,由于没有明显地指出EmployeeID对应哪个属性,那如果把上面的parameter元素调换一下,那么EmployeeID所对应的参数值就发生变化了。同时,也是这个原因,通过这种方式的参数映射,就无法重复利用每个参数了。如果仔细观察会发现,既然都指定了column属性了,那它为什么不会自动去配置呢?其实在这边column属性是不起作用的,它只会作用在执行存储过程的时候。也就是说上面的Parameter元素中的column属性不是必须的。下面是一个存储过程的例子:

<procedure id="Employee_InsertWithProcedure" parameterMap="Employee_InsertParameterMap2" resultClass="int">

    InsertEmployee

</procedure>

    InsertEmployee接受两个参数@LastName@FirstName。我给它提供的映射参数如下:

<parameterMap class="Employee" id="Employee_InsertParameterMap2">          

    <parameter column="LastName" property="LastName" dbType="nvarchar" type="string" direction="Input"/>

    <parameter column="FirstName" property="FirstName" dbType="nvarchar" type="string" direction="Input"/>

</parameterMap>

    上面这样的配置的结果是(其中逗号后面的是值):

[@LastName=[LastName,9a8bc059-3], @FirstName=[FirstName,46887db0-2]]

但是当我把他们的位置调换了一下。它的结果如下:

[@LastName=[ FirstName,9a8bc059-3], @FirstName=[LastName,46887db0-2]]

也就是对储存过程也是一样的,参数映射关系仍然与parameter元素的顺序息息相关的。Column属性仍然没有显示出它的作用。所以使用ParameterMap还有是有一定的局限性的。但是对存储过程来说,就必须使用这样的方式,因为它只支持ParameterMap为它提供参数,而不支持内联参数。

最后总结列出几点ParameterMap需要特别注意的几个细节:

1.在配置ParameterMap的时候,如果传入的参数对像是元数据类型(int,string etc),那么在配置Parameter元素的时候,property的属性名使用value。通过这种情况主要使用在为存储指定参数的情况下。

2.如果ParameterMap中配置的parameter元素不包含在传入参数对象中(属性或IDictionary对象的一个key,value项),将会产生异常,而不管在statement中有没有用到。

3.在使用parameterMapextends属性时,它将会继承extends值对应的parameterMap配置,并且会继承它的所有的参数映射,并且顺序是从继承的那配置为基准开始计算。这个在需要用到extends属性的时候要特别注意。

4.在为存储过程传参过程要特别注意,参数映射与存储过程的参数之间的顺序对应要正确。而且必须为提供与存储过程足够的参数(parameter配置足够多),即使存储过程的部分参数已经有默认值了。否则将抛出System.ArgumentOutOfRangeException异常。

5.正常情况下,应该尽量使用内联参数。

源代码下载

ibatis 学习外篇之 resultMap parameterMap

ibatis结果映射是可以自动映射的,不过这样子的话,第一次的开销会比较大,而且也不利于早点发现代码bug。...

ibatis中参数传入是parameterMap需要注意的一个问题

今天遇到一个问题,弄了一会

IBatis.net+Autofac轻量级orm、ioc框架搭建系统

IBatis.net+Autofac轻量级orm、ioc框架搭建系统 进来公司需要接入一套用户权限系统(原先的后台登录系统,用户是在xml文件里面写死的,包括访问权限,用户名密码等)。由于时间有限,...

iBATIS.net获取运行时sql语句

【本文原创,第一次离首页如此之近。发在候选区攒攒rp,管理员看着不合适可以撤下。】   虽然只在iBatis的世界里小打小闹匆匆数月,却历经数次与领导和同事激辩,再通过不懈努力学习和开发积累,楼猪终...
  • jumtre
  • jumtre
  • 2015年04月20日 23:54
  • 1853

ibatis.net 配置常见的错误

ibatis.net 调试中的常见错误: 一、DaoManager的实例为空 对于第一次使用ibatis.net开发项目的人,遇到此问题是难以避免的。 ibatis.net的配置非常灵活,但也比...

ibatis.net xml配置sql使用一

一.   介绍    平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题。所以很多人会使用一些ORM框架来增强项目的可维护性、可扩展性。IBatis.Net就是一个比较易用...

ibatis.net的程序部署到windows server 2008出错

本人是使用ibatis.net进行项目的开发,所使用的ibatis.net的组件版本分别为:IBatisNet.DataMapper.dll(1.6.1.0)、IBatisNet.Common.dll...

IBatis.Net与IBatisNet中ExecuteQueryForMap和QueryForDictionary的用法

http://www.cnblogs.com/lexus/archive/2010/01/11/1643985.html#Toc238626780 iBatis.net源地址     http:/...

iBatis.Net+mysql访问存储过程的问题

准备选用iBatis.Net做博客的数据持久层,准备写几个demo测测。看它能和mysql数据库友好的玩耍不。 刚开始还挺好的,iBatis.Net能访问mysql数据库。但到了一个存储过程的de...

详细分享IBatis.net缓存的使用方法

本文和大家分享一下IBatis.net缓存的使用方法。 首先在sqlmap.config中启用缓存 然后新建一个xml:CacheAccount.xml 并在sqlmap.c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iBatis.Net系列(五) ParameterMap
举报原因:
原因补充:

(最多只允许输入30个字)