天天看点

Stella 知识库--SPL的使用

-- 系列文章与Stella Forum v2.0搭配使用效果更好 --

(刚才有人告诉我,我写了那么多的笔记,还是看不懂系统到底是怎么回事,真晕……)

今天我们来看最后一部分,SPLDAL和SPLEntity,这个是sf2所使用的数据操作层,负责和sql server 2000交互。

本文的目的是为了让大家对SPL有一个大概的了解,在我看来,SPL最大的好处就是使用方便,而且不用写存储过程了,以前一个小系统就写几十个存储过程的事情不再发生了。

SPL的全称是 SmartPersistenceLayer,是基于o/r mapping 技术的数据操作组件,这个是我在博客园挖到的宝,嘿嘿,下面来看一片断,先有个感性认识

public void RemoveTopic(int id)

{

TopicEntity te=new TopicEntity();

te.Id=id;

te.Delete();

}

上面代码的操作结果是从数据库中删除一个主题,相当于下面的操作

string connstr=;

conn=new sqlconnection;

sql="delete from topic where id="+id;

cmd=new sqlcommand;

cmd.executenonquery;

而如果我们使用存储过程,那上面的代码还要增加,并且还涉及到存储过程的创建

对比一下,使用SPL是否很简单呢?

哈,是否很神奇呢,其实我的第一感觉也是很神奇。

o/r mapping 即数据库/实体映射技术,这个我也不是很明白,照我的理解,就是一个数据库表对应一个实体类,然后我们操作实体类,对应的数据库里的表也会变化。像上面的 例子TopicEntity就是我们的实体类,操作他,就在数据库中删除一个记录了。

上面我说的明白了吗?接着往下分析。

数据库和实体类是怎么相互影响的呢?当然是由一个中间体负责联系啦,在这里这个中间体就是XML配置文件。在XML配置文件里做好配置,然后放到web目录下,就可以啦。

配置文件分两种,一种指定和数据库的联系,看这个

<?xml version="1.0" encoding="utf-8"?><map>

<database name="stella2" type="MsSqlServer">

<parameter name="Provider" value="SQLOLEDB.1" />

<parameter name="Password" value="123" />

<parameter name="Initial Catalog" value="stella2" />

<parameter name="User ID" value="sa" />

<parameter name="Data Source" value="(local)" />

<classMapFile path="ClassMap.xml" />

</database></map>

第二种里是详细的数据库表/实体类映射信息,就是上面classMapFile节指定的那个文件。

下面是一个映射的例子

<class name="MemberEntity" table="Member" database="stella2">

<attribute name="Id" column="Id" type="Integer" increment="true" key="primary" />

<attribute name="Name" column="Name" type="String" />

<attribute name="Pwd" column="Pwd" type="Binary" />

<attribute name="Email" column="Email" type="String" />

</class>

而实体类都放在SPLEntity中,下面是上面XML配置关联的实体类。

[Serializable()]

public class MemberEntity : EntityObject

{

/// <summary>Id</summary>

public const string __ID = "Id";

/// <summary>Name</summary>

public const string __NAME = "Name";

/// <summary>Pwd</summary>

public const string __PWD = "Pwd";

/// <summary>Email</summary>

public const string __EMAIL = "Email";

private int m_Id;

private string m_Name;

private System.Byte[] m_Pwd;

private string m_Email;

/// <summary>构造函数</summary>

public MemberEntity()

{

}

/// <summary>属性Id </summary>

public int Id

{

get{return this.m_Id;}

set{this.m_Id = value;}

}

/// <summary>属性Name </summary>

public string Name

{

get{return this.m_Name;}

set{this.m_Name = value;}

}

/// <summary>属性Pwd </summary>

public System.Byte[] Pwd

{

get{return this.m_Pwd;}

set{this.m_Pwd = value;}

}

/// <summary>属性Email </summary>

public string Email

{

get{return this.m_Email;}

set{this.m_Email = value;}

}

}

通过这样做,就可以很神奇的把数据库表和实体类关联起来。

把配置文件放到目录下就可以开始工作吗?很不幸,像我上篇文章说的.net 还没有那么智能,因此我们需要手动指定,用下面的语句在Global中设置

string DatabaseXml=this.m_ApplicationPath + "Config/DatabaseMap.xml";

Setting.Instance().DatabaseMapFile=Server.MapPath(DatabaseXml);

其实想想,好像所有需要XML配置的东西都需要在Global中预先配置,比如sf2使用的log4net,还有.net提供的自定义配置节。

工作到此就算完成了,接下来你可以完全放弃讨厌的存储过程,享受数据操作的乐趣了。

关于SPL的更详细的信息,可以看这里

http://www.cnblogs.com/tintown/category/12787.html

sf2 中对SPL的使用就是把这个作为一个数据操作层,所以SPLDAL和SPLEntity是一起的,而且SPLEntity只给SPLDAL使用,因为我们 有自己的代表业务需求的实体类Model。如果以后要使用SQLServer Data Provider,那也不会影响其它地方。