• Spring.NET 中的 ADO.NET 数据访问的示例


    Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中 \Spring.NET-1.3.1\Spring.NET\examples\Spring\Spring.DataQuickStart。Spring.NET 的下载地址:http://www.springframework.net/download.html。示例中的数据来源于微软的示例数据库 Northwind,这个数据库可以从微软的网站下载,下载地址:http://www.microsoft.com/downloads/en/details.aspx?FamilyId=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en

    Spring.NET 提供了两种风格的 ADO.NET 访问,第一种 template 风格,通过一个单例的 AdoTemplate 应用在所有的数据访问实现中,AdoTemplate 提供了通过一个方法调用来完成数据访问的机制,这个机制类似于微软的 DAAB。这个类位于命名空间 Spring.Data.Core,在程序集 Spring.Data 中。另外一种方式更加面向对象一些,比如通过 AdoQuery 来完成查询任务,而 AdoNonQuery 完成创建、更新、删除任务,存储过程则通过 StoredProcedure 来完成。这几个类都定义在命名空间 Spring.Data.Objects 中,位于程序集 Spring.Data

    在 Spring.NET 中,为了方便使用 AdoTemplate,使用 AdoDaoSupport 封装了 AdoTemplateAdoDaoSupport 定义在命名空间 Spring.Data.Core 下,具体的定义如下:

    public class AdoDaoSupport : DaoSupport
    {
        private AdoTemplate adoTemplate;
    
        public IDbProvider DbProvider
        {
            set
            {
                adoTemplate = CreateAdoTemplate(value);
            }
            get
            {
                if (adoTemplate != null)
                {
                    return adoTemplate.DbProvider;
                }
                else
                {
                    return null;
                }
            }
    
        }
    
        public AdoTemplate AdoTemplate 
        {
            set
            {
                adoTemplate = value;
            }
            get
            {
                return adoTemplate;
            }
    
        }
    
        protected override void CheckDaoConfig()
        {
            if (adoTemplate == null)
            {
                throw new ArgumentException("DbProvider or AdoTemplate is required");
            }
        }
    
        protected IDbConnection Connection
        {
            get
            {
                return ConnectionUtils.GetConnection(DbProvider);
            }
        }
    
        protected IAdoExceptionTranslator ExceptionTranslator
        {
            get
            {
                return null;  //Investigate AdoExceptionTranslator on AdoAccessor
            }
        }
    
        protected void DisposeConnection(IDbConnection conn, IDbProvider dbProvider)
        {
            ConnectionUtils.DisposeConnection(conn, dbProvider);
        }
            
           
        protected virtual AdoTemplate CreateAdoTemplate(IDbProvider dbProvider)
        {
            return new AdoTemplate(dbProvider);
        }
    
        protected virtual IDbParametersBuilder CreateDbParametersBuilder()
        {
            return new DbParametersBuilder(DbProvider);
        }
    
        protected virtual IDbParameters CreateDbParameters()
        {
            return AdoTemplate.CreateDbParameters();
        }
            
    }
    

    通常情况下,我们从 AdoDaoSupport 派生一个用于数据访问的类,这样就可以直接通过 AdoDaoSupport 来使用 AdoTemplate 了。例如,示例中的 QueryForObjectDao 的代码。

    View Code
    public class QueryForObjectDao : AdoDaoSupport
    {
    private string cmdText = @"select Address, City, CompanyName, ContactName, " +
    "ContactTitle, Country, Fax, CustomerID, Phone, PostalCode, " +
    "Region from Customers where ContactName = @ContactName";

    public Customer GetCustomer(string contactName)
    {
    return (Customer)AdoTemplate.QueryForObject(CommandType.Text, cmdText, new CustomerRowMapper(),
    "ContactName", DbType.String, 30, contactName);
    }
    }

    在配置文件中使用依赖注入分别定义 dbProvider, adoTemplate 和 AdoDaoSupport 的派生类。

    View Code
    <!-- 连接串定义 -->
    <db:provider id="dbProvider"
    provider
    ="System.Data.SqlClient"
    connectionString
    ="Data Source=.\SQL2005;Initial Catalog=Northwind;Persist Security Info=True;User ID=springqa;Password=springqa;Trusted_Connection=False"/>
    <!-- AdoTemplate 定义 -->
    <object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
    <!-- 注入连接 -->
    <property name="DbProvider" ref="dbProvider"/>
    <property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
    </object>

    <!-- 查询定义 -->
    <object id="queryForObjectDao" type="Spring.DataQuickStart.Dao.Template.QueryforObjectDao, Spring.DataQuickStart">
    <!-- 注入 AdoTemplate -->
    <property name="AdoTemplate" ref="adoTemplate"/>
    </object>

    测试程序中,首先初始化 Spring 容器。这里的配置文件是嵌入在程序集中的。

    [SetUp]
    public void InitContext()
    {
    // Configure Spring programmatically
    NamespaceParserRegistry.RegisterParser(typeof(DatabaseNamespaceParser));
    ctx
    = new XmlApplicationContext(
    "assembly://Spring.DataQuickStart.Tests/Spring.DataQuickStart.Template/ExampleTests.xml");
    adoTemplate
    = ctx["adoTemplate"] as AdoTemplate;
    }

    在代码中,就可以通过容器直接取得  QueryForObjectDao 对象使用了。

    [Test]
    public void QueryForObjectDaoTest()
    {
    QueryForObjectDao dao
    = ctx["queryForObjectDao"] as QueryForObjectDao;
    Customer customer
    = dao.GetCustomer("Hanna Moos");
    Assert.AreEqual(customer.ContactName,
    "Hanna Moos");
    }
  • 相关阅读:
    HDU 5583 Kingdom of Black and White 水题
    HDU 5578 Friendship of Frog 水题
    Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
    hdu 5594 ZYB's Prime 最大流
    hdu 5593 ZYB's Tree 树形dp
    hdu 5592 ZYB's Game 树状数组
    hdu 5591 ZYB's Game 博弈论
    HDU 5590 ZYB's Biology 水题
    cdoj 1256 昊昊爱运动 预处理/前缀和
    cdoj 1255 斓少摘苹果 贪心
  • 原文地址:https://www.cnblogs.com/haogj/p/2084065.html
Copyright © 2020-2023  润新知