Spring.net快速上手指南
首先简单介绍下几个术语:
1.O/R Mapping
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将。Net程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。
2.NHibernate
在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦和浪费时间的.NHibernate不仅仅管理.NET类到数据库表的映射(包括.NET 数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和ADO.NET处理数据的时间。
NHibernate的目标主要是用于与数据持久化相关的编程任务,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。
3.例子
现在我就用一个简单的例子来向大家说明,在vs2005下如何利用spring.net框架的IOC机制通过O/R mapping机制对数据库进行访问。
1. 建立一个c/s项目命名为Springs,并且引入相应的spring.net的命名空间(如图1)[在这里需要说明的我们用的是spring.net1..2的版本,nhibernate为1.2的版本]
2. 用sqlserver2000创建一个名为Test的数据库,并且在这个数据库中建立一个名字为myuser的数据表:
列名 |
类型 |
长度 |
|
userid(主键) |
Int |
4 |
|
username |
varchar |
20 |
|
userpassword |
varchar |
20 |
|
Useremail |
Varchar |
20 |
|
数据表建立好了以后,我们要做的就是在项目中为此表建立一个实体映射类
3. 建立一个实体映射类MyUser.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace Springs.model//从这我们可以知道类的命名空间,以后将不再重复
{
public class MyUser
{
private int userid;
public int Userid
{
get { return userid; }
set { userid = value; }
}
private String username;
public String Username
{
get { return username; }
set { username = value; }
}
private String userpassword;
public String Userpassword
{
get { return userpassword; }
set { userpassword = value; }
}
private String useremail;
public String Useremail
{
get { return useremail; }
set { useremail = value; }
}
}
}
4. 建立起表与实体类之间的关系MyUser.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Springs.model.MyUser,Springs" table="myuser" lazy="false">
<id name="Userid" column="userid" type="Int32">
<generator class="native" />
</id>
<property name="Username" column="username" type="String" length="20" />
<property name="Userpassword" column="userpassword" type="String" length="20" />
<property name="Useremail" column="useremail" type="String" length="20"></property>
</class>
</hibernate-mapping>
至此,我们已经完成了数据表和实体类之间的映射关系
5. 建立一个服务接口UserService.cs
using System;
using System.Collections.Generic;
using System.Text;
using Springs.model;
using System.Data;
namespace Springs.service
{
public interface UserService
{
void insert(MyUser user);
}
}
6. 实现UserService接口(UserServiceImp.cs)
using Spring.Data.NHibernate.Support;
using Springs.service;
using Springs.model;
using System.Configuration;
using Spring.Context;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using NHibernate;
namespace Springs.serviceimp
{
public class UserServiceImp:HibernateDaoSupport,UserService
{
public void insert(MyUser user)
{
this.HibernateTemplate.Save(user);
}
}
}
在这里我需要解释的是,对于HibernateDaoSupport这个类来说我们在前面的过程中并没有提到,这个类是Spring.net框架中实现好的类,我们只要实现它,并且在spring.net的xml文件中(稍候将会看到)进行相应的配置,就可以通过它来调用HibernateTemplate对数据库进行映射操作了。
7.编写一个可以利用UserService服务的类UserManager.cs
using System;
using System.Collections.Generic;
using System.Text;
using Springs.serviceimp;
using Springs.service;
using Springs.model;
namespace Springs.usermanager
{
public class UserManager
{
private UserService us;
public UserService Us
{
get { return us; }
set { us = value; }
}
public void insertUser()
{
MyUser user = new MyUser();
user.Username = "zhenxin";
user.Userpassword = "hahaha";
user.Useremail = "1s2k3y4@sina.com";
us.insert(user);
}
}
}
在这里我们利用属性形式(如果不明白什么是属性形式注入,请参看《业务规则层案例4.0.1》)将服务UserService注入在了UserManager中(稍候将看到spring.net的xml文件),在insertUser()方法中调用UserService的服务,直接对数据实体类MyUser进行操作。
为了我们可以很好的管理所有的服务,我们需要创建一个服务器容器ServiceContainer,在这里,我们可以随时调用我们需要的服务,创建这个类的好处是,可以对服务进行管理,方便于调用。
using System;
using System.Collections.Generic;
using System.Text;
using Spring.Context;
using System.Configuration;
using Spring.Context.Support;
using Springs.service;
namespace Springs.tools
{
public class ServiceContainer
{
private UserService userServices;
public static IApplicationContext context;
private static ServiceContainer serviceContainer = null;
private ServiceContainer()
{
}
public static ServiceContainer Servicecontainer
{
get
{
if (serviceContainer == null)
{
serviceContainer = new ServiceContainer();
context = ContextRegistry.GetContext();
}
return serviceContainer;
}
}
public UserService UserServices
{
get
{
userServices = context.GetObject("UserService") as UserService;
return userServices;
//通过IOC注入在这里得到UserService实例对象
}
}
}
}
此类为设计成单例的原因是,只允许一个ServiceContainer的产生,所有的服务都通过这一个ServiceContainer进行调用。
7. 配置app.config文件
为了将spring.net框架加入到我们的项目中我们需要在项目启动的时候就要对spring.net 进行加载,我们将spring.net框架的xml文件单独放在一个文件user_spring.xml中,在app.config中我们只要引用就可以了。
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="http://www.cnblogs.com/user_spring.xml"></resource>//引用文件
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net"/>
</spring>
<appSettings/>
<connectionStrings/>
</configuration>
8.配置user_spring.xml
这是我们的核心配置文件。
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd">
<object id="DbProvider" type="Spring.Data.Common.DbProviderFactoryObject,Spring.Data">
<property name="Provider" value="SqlServer-2.0"/>
<property name="ConnectionString" value="Data Source=.;Database=Test;User ID=sa;Password=;Trusted_Connection=False" />
</object>
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider" />
<property name="MappingAssemblies">
<list>
<value>Springs</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<entry key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<entry key="show_sql" value="true" />
</dictionary>
</property>
</object>
<object id="UserService" type="Springs.serviceimp.UserServiceImp">
<property name="SessionFactory" ref="SessionFactory" />
</object>
<object id="UserManager" type="Springs.usermanager.UserManager">
<property name="Us" ref="UserService" />
</object>
</objects>
在这个文件中有SessoionFactory和DbProvider这两个节点的配置应该多多注意下。同时还注入了UserService服务,还有UserManager这个将服务以属性方式注入到自身里的类。
9.测试
...未完,详见:http://www.cnblogs.com/i-miss-you/articles/1606976.htm