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 的代码。

Spring.NET 中的 ADO.NET 数据访问的示例 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 的派生类。

Spring.NET 中的 ADO.NET 数据访问的示例 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 " );
}

你可能感兴趣的:(spring)