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 封装了 AdoTemplate。AdoDaoSupport 定义在命名空间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 的代码。

publicclass QueryForObjectDao : AdoDaoSupport
{
privatestring 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 的派生类。

<!-- 连接串定义 -->
<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]
publicvoid 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]
publicvoid QueryForObjectDaoTest()
{
QueryForObjectDao dao = ctx["queryForObjectDao"] as QueryForObjectDao;
Customer customer = dao.GetCustomer("Hanna Moos");
Assert.AreEqual(customer.ContactName, "Hanna Moos");
}

Spring.NET 中的 ADO.NET 数据访问的示例的更多相关文章
- Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅
在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...
- 使用Spring.net中对Ado.net的抽象封装来访问数据库
使用Spring.net中对Ado.net的抽象封装来访问数据库 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入 ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- ADO.NET数据访问技术
ADO.NET数据访问技术 就是将C#和MSSQLl连接起来的纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用.是所有数据访问技术的基础. A ...
- 在Spring Boot中加载初始化数据
文章目录 依赖条件 data.sql文件 schema.sql 文件 @sql注解 @SqlConfig 注解 在Spring Boot中加载初始化数据 在Spring Boot中,Spring Bo ...
- 在Spring中基于JDBC进行数据访问时如何控制超时
超时分类 超时根据作用域可做如下层级划分: Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout Tra ...
- ADO.net数据访问方法
ADO.NET是一组用于和数据源进行交互的面向对象的类库. 核心组件有两个: DataSet 是 ADO.NET 的非连接(断开)结构的核心组件.DataSet 的设计目的很明确:为了实现独立于任何数 ...
- ADO.NET 数据访问类查询、属性扩展
今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...
- Spring MVC中Controller如何将数据返回给页面
要实现Controller返回数据给页面,Spring MVC 提供了以下几种途径: ModelAndView:将视图和数据封装成ModelAndView对象,作为方法的返回值,数据最终会存到Http ...
随机推荐
- java 中文乱码
1.URL编码 String str = URLEncoder.encode("中文乱码","UTF-8");//编码 String newStr = URLD ...
- 3.linux常用软件的安装方法
linux 上的软件不像windows上直接运行安装那么容易,在linux上有很多不同的安装包,大概常见的就有deb.tar.gz.tar.bz(tar.bz2).rpm等类型文件 1.deb文件安装 ...
- JavaScript中prompt()函数的用法。
定义和用法 prompt()方法用于显示一个带有提示信息,并且用户可以输入的对话框. 语法 prompt(text,defaultText); 参数 描述 text 可选.要在对话框中显示的提示信息( ...
- js--事件对象的理解3
实例2: 跟随鼠标的DIV-- <script> document.onmousemove=function (ev) { var oEvent=ev||event; var oDiv=d ...
- boostrap插件
第一章:模态弹出框 一.导入JavaScript插件 Bootstrap的JavaScript插件可以单独导入到页面中,也可以一次性导入到页面中.因为在Bootstrap中的JavaScript插件都 ...
- 设置IIS下PHP环境的DOCUMENT_ROOT
这两天把一网站架到了IIS服务器上,却发现在读取 $_SERVER['DOCUMENT_ROOT'] 的时候是空值.翻阅了PHP的文档,发现对该变量的解释为:“当前运行脚本所在的文档根目录.在服务器配 ...
- [SQL基础教程]1-4 SQL 表的创建
[SQL基础教程]1-4 SQL 表的创建 创建数据库 语法 CREATE DATABASE <数据库名称> // example CREATE DATABASE shop; 创建表 语法 ...
- gdb常用调试命令
一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) ...
- FZU 1893 内存管理 模拟
比赛的时候队友要做这道题…… 他没做出来自己也被误导了…… 也算是个教训 自己还是要有自己的思路…… 又是模拟题…… 网上都是用vector做的 我最近才会stl 怎么会用那么高大上的的东西…… 强力 ...
- hdu 1407 测试你是否和LTC水平一样高
Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解. Inpu ...