.NET 企业库 知识分享--知识产生力量,成功源于分享!
RSS

导航







专业.NET技术社区

专业.NET技术社区


快速搜索

高级搜索 »

注意:此页面是Spring.NET框架 1.1 参考文档的一部分。


编辑

15.1. 简介

在数据访问方面,Spring.NET大量使用了接口。这些接口封装了必要的数据存取操作,与业务领域相关的对象不需要再引用专门的持久化API。在分层的系统架构中,一般用服务层响应特定的业务对象请求,并且用实现了这些接口的对象处理所有与持久化有关的行为。这些对象通常叫做数据访问对象(DAO),系统结构中相应的层次一般称为数据访问层(DAL)。

在应用程序中使用DAO,能够提供跨持久化技术的灵活性及测试的便利性。DAO可以使测试变得相当简单,因为在NUnit中很容易创建数据访问接口的模拟实现类,因此可以在没有数据库的环境下测试数据访问层的功能。对于测试来说,这是很有利的,因为依赖数据库的测试环境一般很难搭建起来,并且,如果需要测试异常行为,使用真实的数据库环境也不切实际。

Spring.NET数据访问对象的设计目的是用统一的方式简化各种数据访问技术(如ADO.NET和NHibernate)的应用。为此, Spring.NET提供了两组核心功能。其一是与具体数据库无关的通用异常类;其二,通过数据访问对象的基类,提升了ADO.NET操作的抽象层次。通过这些功能,可以很轻松的在各种持久化技术之间切换,且编码时无需关心与具体技术有关的异常处理。

顶部

编辑

15.2. 统一的异常体系

ADO.NET本身没有为不同的数据库定义统一的数据库异常,在.NET 1.1中,FCL甚至没有为ADO.NET定义公共的异常基类。所以,我们必须针对不同的数据库来处理具体的数据库异常,如 System.Data.SqlClient.SqlException和 System.Data.OracleClient.OracleException等。.NET 2.0在这方面作了改进,为数据库异常加入了一个公共基类:System.Data.Common.DbException,但这个类却并不是很灵活,因为用于标识错误信息的错误代码还是与不同数据库相关的。对于同一种错误,比如数据完整性冲突和SQL语法错误,不同数据库返回的错误码也不相同。

为帮助开发人员编写灵活且更具可读性的异常处理代码,Spring.NET将ADO.NET中与不同技术相关的异常“翻译”成了一系列自定义的异常类,它们的基类为Spring.Dao.DataAccessException。这些异常在内部包装了原始的ADO.NET异常,所以不必担心会有信息丢失的情况。

除了ADO.NET,Spring.NET也对NHibernate的异常做了包装。开发人员可以在应用程序的各个层次处理大部分不可恢复的持久化异常,而不需要使用样板式的catch/throw语句或异常声明。上面讲过,(与不同数据库方言相关的)ADO.NET异常被翻译成了 Spring.NET的异常,所以可以用统一的编程模式来执行ADO.NET的常用操作。对于其它基于模板的ORM框架,Spring.NET的处理方式也是一样的。

Spring.NET使用的数据访问异常如下图所示:
数据访问异常

数据访问异常

(注意,这仅是Spring.NET数据访问异常的一部分)。

异常翻译的基础是Spring.Data.Support.IAdoExceptionTranslator接口:

public interface IAdoExceptionTranslator
{
    DataAccessException Translate( string task, string sql, Exception exception );
}

其中Translate方法的参数分别为:task,为当前尝试执行的任务的描述信息;sql,为引起异常的SQL语句;exception,由 ADO.NET抛出的“原始”异常。task和SQL参数的目的是当异常发生时为开发人员提供一个可读性高的、清晰的错误描述信息。

该接口的默认实现是ErrorCodeExceptionTranslator类,该类使用了一个特殊的配置文件sql-error- codes.xml,其中精确的定义了各种错误代码与Spring.NET数据访问异常之间的对应关系。在用Spring.NET创建数据访问层时,可以直接使用该类翻译异常。如果在数据访问对象中使用Spring.NET的AdoTemplate类,那么抛出的异常就会被自动转换。还有一种用法介于这两者之间:使用ADO.NET2.0的原生API和Spring.NET的声明式事务处理,并在自己的异常处理层使用 IAdoExceptionTranslator接口。

下面列出一些比较常见的异常,其它异常请参考API文档.

表15.1. 常见的数据访问异常
异常描述
BadSqlGrammarException当指定的SQL语句无效时抛出
DataIntegrityViolationException在插入或修改数据时,若有完整性冲突,则抛出此异常。例如,插入一个重复的主键。
PermissionDeniedDataAccessException当底层资源拒绝访问某个元素时,例如某些数据库表,抛出此异常。
DataAccessResourceFailureException当对底层资源的访问完全失败时抛出,比如无法连接到数据库。

顶部

编辑

15.3. 抽象的数据访问对象基类

为用统一的方式简化各种数据库技术(如ADO.NET、NHibernate和iBatis.NET等)的应用,Spring.NET定义了一系列抽象的DAO类,开发人员可以扩展这些类。通过这些抽象类的方法,我们可以获取诸如数据源以及与各种数据库技术相关的所有信息。

数据访问对象基类:
  • AdoDaoSupport:ADO.NET数据访问对象的基类。子类可以和DbProvider及AdoTemplate类协作来完成数据操作。请参考下一章的相关内容。详细信息请参见API文档。
  • HibernateDaoSupport: NHibernate数据访问对象的基类。子类可以和ISessionFactory及HibernateTemplate类协作来完成数据操作。也可以直接通过HibernateTemplate创建数据访问对象,并重用HibernateTemplate的设置,比如SessionFactory、 flush模式,异常翻译器等。 与NHibernate相关的类库需要从Spring.NET网站上单独下载。

顶部

.NET 藏经阁 | | 版权所有 ©2008 entlib.net.cn