数据库访问层设计与实现(2)

原创 2006年05月28日 21:55:00

2 约定

1)本文中谈及的数据库仅限于关系数据库。数据库类型指不同的关系数据库系统,如OracleSQL ServerSybase等等。

2数据库对象ADO.NET中访问数据库的对象:Connection对象,Command对象,Adapter对象、Parameter对象。

3 应用程序的一般结构

通常,数据库相关的应用程序应该具有图1所示的结构。至于为什么,就不用多说了。从图中可以看到数据库访问层所处的位置,及其应该具有的功能。

图1 应用程序一般结构

1 应用程序一般结构

4 适应不同类型的数据库

如第1节所述,在ADO.NET中,使用不同类型的数据库,主要就是这些数据库对象的变化:ConnectionCommandAdapterParameter。在程序中我们需要根据不同的数据库创建合适的对象。

通常的简单做法是使用条件判断,是何种类型的数据库,创建相应的数据库对象,代码如下:

[示例代码1] 简单,但缺乏弹性和复用性的方法

    /// <summary>

    /// 数据库类型。

    /// </summary>

    public enum DbType

    {

        SqlServer,

        Oracle,

        OleDb,

    }

 

    class DbObjectFactory

    {

        /// <summary>

        /// Connection 对象的创建。

        /// </summary>

        /// <param name="dbType">数据库类型。</param>

        /// <returns>Connection 对象。</returns>

        public static IDbConnection CreateConnection(DbType dbType)

        {

            switch(dbType)

            {

                case DbType.SqlServer:

                    return new SqlConnection();

                case DbType.Oracle:

                    return new OracleConnection();

                case DbType.OleDb:

                    return new OleDbConnection();

            }

            throw new Exception("不支持的数据库类型。");

        }

 

        /// <summary>

        /// Parameter 对象的创建。

        /// </summary>

        /// <param name="dbType">数据库类型。</param>

        /// <returns>Parameter 对象。</returns>

        public static IDataParameter CreateParameter(DbType dbType)

        {

            switch(dbType)

            {

                case DbType.SqlServer:

                    return new SqlParameter();

                case DbType.Oracle:

                    return new OracleParameter();

                case DbType.OleDb:

                    return new OleDbParameter();

            }

            throw new Exception("不支持的数据库类型。");

        }

    }

上面的代码中都是条件判断,而且CreateConnection函数和CreateParameter函数代码几乎一样,DataAdapterCommand的创建也是如此。这样的做法缺点主要有两点:

1)代码重复,可维护性差;

2)新增加一种数据库类型时,需要修改现有的代码。

其实我们仔细分析以下数据库类型和对象之间的关系,可以发现图2所示的规律:

图2 不同数据库和对象的关系

2 不同数据库和对象的关系

很明显,采用抽象工厂模式可以很好的处理不同数据库和不同数据库对象之间的组和系列的关系。如图3

图3 数据库对象工厂设计

3 数据库对象工厂设计

根据上面的类图,生成C#代码如下:

[示例代码2: DbObjectFactory.cs] (有删节)

    /// <summary>

    /// 数据库对象工厂的虚基类。

    /// </summary>

    public abstract class DbObjectFactory

    {

        /// <summary>

        /// 创建数据库连接对象,并打开连接。

        /// </summary>

        /// <returns> 数据库连接。返回null 表示连接失败。</returns>

        public abstract IDbConnection CreateConnection();

 

        /// <summary>

        /// 创建Command 对象。

        /// </summary>

        /// <returns> 执行SQL Command 对象。</returns>

        public abstract IDbCommand CreateCommand();

 

        /// <summary>

        /// 创建DbDataAdapter 对象。

        /// </summary>

        /// <returns>DbDataAdapter 对象。</returns>

        public abstract IDbDataAdapter CreateDataAdapter();

 

        /// <summary>

        /// 创建Parameter 对象。

        /// </summary>

        /// <returns>Parameter 对象。</returns>

        public abstract IDataParameter CreateParameter();

    }

[示例代码3: OleDbObjectFactory.cs] (有删节)

    /// <summary>

    ///  OleDb 数据库对象工厂。

    /// </summary>

    public class OleDbObjectFactory : DbObjectFactory

    {

        /// <summary>

        /// 创建数据库连接对象,并打开连接。

        /// </summary>

        /// <returns> 数据库连接。返回null 表示连接失败。</returns>

        public override IDbConnection CreateConnection()

        {

            return new OleDbConnection();

        }

 

        /// <summary>

        /// 创建Command 对象。

        /// </summary>

        /// <returns> 执行SQL Command 对象。</returns>

        public override IDbCommand CreateCommand()

        {

            return new OleDbCommand();

        }

 

        /// <summary>

        /// 创建DbDataAdapter 对象。

        /// </summary>

        /// <returns>DbDataAdapter 对象。</returns>

        public override IDbDataAdapter CreateDataAdapter()

        {

            return new OleDbDataAdapter();

        }

 

        /// <summary>

        /// 创建Parameter 对象。

        /// </summary>

        /// <returns>Parameter 对象。</returns>

        public override IDataParameter CreateParameter()

        {

            return new OleDbParameter();

        }

    }

[示例代码4: OleDbObjectFactory.cs] (有删节)

    /// <summary>

    /// Sql Server 数据库对象工厂。

    /// </summary>

    public class SqlObjectFactory : DbObjectFactory

    {

        /// <summary>

        /// 创建数据库连接对象,并打开连接。

        /// </summary>

        /// <returns> 数据库连接。返回null 表示连接失败。</returns>

        public override IDbConnection CreateConnection()

        {

            return new SqlConnection();

        }

 

        /// <summary>

        /// 创建Command 对象。

        /// </summary>

        /// <returns> 执行SQL Command 对象。</returns>

        public override IDbCommand CreateCommand()

        {

            return new SqlCommand();

        }

 

        /// <summary>

        /// 创建DbDataAdapter 对象。

        /// </summary>

        /// <returns>DbDataAdapter 对象。</returns>

        public override IDbDataAdapter CreateDataAdapter()

        {

            return new SqlDataAdapter();

        }

 

        /// <summary>

        /// 创建Parameter 对象。

        /// </summary>

        /// <returns>Parameter 对象。</returns>

        public override IDataParameter CreateParameter()

        {

            return new SqlParameter();

        }

    }

使用时,根据应用环境的数据库类型,创建相应的具体工厂对象即可。这样就避免了使用生硬的条件判断了。新增加一种类型的数据库时,只要添加一个类,从DbObjectFactory继承即可,而现有的代码不需要做任何的修改。

 

数据访问层的设计和实现(分布式系统七)

(1)如何对外提供数据访问层的功能 数据访问层就是方便应用进行数据读写访问的抽象层,在该层上解决各个应用通用的访问数据库的问题。 上图显示了三种方式,第一种是为用户提供专有API,不过不推...
  • u011393781
  • u011393781
  • 2016年10月08日 17:41
  • 1484

数据访问层的设计(一)——功能与接口定义

数据访问层的设计我研究了很长时间,关于接口的定义,好几次都推翻重来。 园子看到过很多easyui+MVC+EF的文章,在早期,我的设计也类似。 但是后来为了增强它,想加点功能通用的功能进去,就耗费...
  • dyllove98
  • dyllove98
  • 2013年07月19日 19:19
  • 7942

数据访问层MyBatis解析

一、背景         最近在研究Java的框架,刚刚接触到java对于数据访问层封装的框架之一,MyBatis,不得不说使用起来很是方便,跟写sql语句的感觉一样一样的;顺便读了少部分官方文档,...
  • u012704843
  • u012704843
  • 2017年04月06日 17:46
  • 864

数据库访问抽象层系列-1(介绍数据库编程接口及数据库访问抽象层概念)

摘要 本人最近完成了一个封装数据库访问抽象层的项目。我们开发的数据库访问抽象层作为分布式集群基础平台的一个组件。可以支持不同数据库编程接口(OCI、mysql、ODBC、pgsql)等。本系列博...
  • bobkentblog
  • bobkentblog
  • 2015年04月15日 10:37
  • 2292

.net中的数据访问层的封装

当年.net项目中自己封装的数据访问层,个人感觉使用非常方便
  • kevin_xf
  • kevin_xf
  • 2016年12月05日 15:53
  • 764

三层架构:表示层——业务逻辑层——数据访问层

三层架构:表示层——业务逻辑层——数据访问层 1.什么是三层架构     所谓的三层开发就是将系统的整个业务应用划分为表示层——业务逻辑层——数据访问层,这样有利于系统的开发、维护、部...
  • Sayesan
  • Sayesan
  • 2015年08月12日 13:35
  • 9370

三层架构:表示层-业务逻辑层-数据访问层

三层架构和MVC是两个东西。 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页面(类)对应MVC中的Co...
  • m0_37033566
  • m0_37033566
  • 2016年12月21日 16:50
  • 9872

App架构设计经验谈:数据层的设计

一个App,从根本上来说,就是对数据的处理,包括数据从哪里来、数据如何组织、数据怎么展示,从职责上划分就是:数据管理、数据加工、数据展示。相对应的也就有了三层架构:数据层、业务层、展示层。本文就先讲讲...
  • lz0426001
  • lz0426001
  • 2016年02月23日 10:51
  • 1142

框架学习(1)——service层,dao层和service实现类进行数据库操作

浅谈对java框架设计中service层、dao层和service实现类作用的理解以及好处
  • qq_34825926
  • qq_34825926
  • 2017年04月05日 20:48
  • 856

分布式数据访问层(DAL)

概述分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy、Memcached、集群等技术优点而构建的一个架构系统。主要目的是为了解...
  • xcbeyond
  • xcbeyond
  • 2017年02月11日 00:46
  • 1344
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库访问层设计与实现(2)
举报原因:
原因补充:

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