说来也怪,工作一直是.Net+Oracle这个平台,与sqlServer没有一点机缘。
多年以来,一直放弃使用Hibernate,不愿受制于Relation Table和Object严格的映射关系。为了方便,自己实现了一个简单的中间件,使用webservice作为数据服务,接收加密的sql或Sql集用于数据库操作。数据载体使用dataset,实现了更改DataSet后自动保存相关表的功能,避免基本功能手动写Insert,Update语句。也尝试过Remoting实现,觉得效率与WebService没有大的区别,后来升级到WCF彻底解决通信协议的问题。
数据服务提供了一个直接操纵数据库的工具,最大的优点是灵活,WinForm客户端不需要安装Oracle客户端。使用DataSet的结果是程序越来越脱离OO,得到了最大的灵活性的同时几乎丧失了所有设计契约。尤其对于程序维护,基本上是谁赶上谁维护,而且系统在使用过程中,最重要的是以最快速度解决问题,增加新的功能或业务变更。设计的约束越来越形同虚设。
可以说,Ibatis的工作方式是Domain(Entity)+Sql的完美结合。即没有丧失Sql的灵活,又能保证业务处理及前端是基于Domain对象进行处理。而对于每个Domain对象都有独特的Map描述,可以随时更改Map而不影响前端程序。如果说唯一的缺陷,就是Map配置的编写略显啰嗦,(灵活+啰嗦的矛盾体),而简单良好的Map格式和语法,虽然啰嗦但很简单,很容易自动生成。而我认为开发者对数据库表应该了然于心,这点对敏捷开发尤其重要。我从来不指望所谓的界面工程师只管界面之类的方法能够奏效,我经历的所有系统,开发的瓶颈都在业务组织和处理,相比之下,界面的工作可以说是微不足道,UI问题基本上都是Google能很快解决的。
Ibatis自带了10几种Provider,其中对Oracle的支持有9.2,10.1版本,还有一个使用微软OracleClient的Oracle驱动,是基于FrameWrok1.1的,很古老了。其实自己增加Oracle11g的Provider很简单,只要复制10.1的<provider />,修改name, description和assemblyName就可以。新增的Provider是下面的样子:
<provider
name="oracle11.1g"
description="Oracle, oracle provider V11.1g"
enabled="true"
assemblyName="Oracle.DataAccess, Version=2.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342"
connectionClass="Oracle.DataAccess.Client.OracleConnection"
commandClass="Oracle.DataAccess.Client.OracleCommand"
parameterClass="Oracle.DataAccess.Client.OracleParameter"
parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType"
parameterDbTypeProperty="OracleDbType"
dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter"
commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder"
usePositionalParameters="true"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix=":"
useDeriveParameters="false"
allowMARS="false" />
其中name,description都是可以自己随意写的,只要name不重就没问题。唯一注意的是assemblyName必须写全名称,即fullName。上面用的是ODP.net for oracle 11.2g。
如果不知道fullName怎么写,可以用System.Reflection.Assembly.LoadFile("Oracle.DataAccess.dll的位置").FullName获取,再拷贝粘贴。
总结一下配置Ibatis最精简的文件结构([]表示目录):
providers.config
SqlMap.config
[Domain]
[Domain]/DomainEntity1.cs
[Domain]/DomainEntity2.cs
[Domain]/......
[Maps]
[Maps]/Entity1.xml
[Maps]/Entity2.xml
[Maps]/......
另:win7+oracle11g,在Ibatis的配置过程,连接字符串上浪费了很多时间,现象是sqlplus正常登陆,程序却不能,监听和服务名都正确配置,却总是显示"无法解析服务名",最后写成(DataSource为空-本机) ConnectionString = "Data Source=;User Id=uid;Password=psd",就一切正常了。