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,那也不会影响其它地方。

0
0
(请您对文章做出评价)
« 上一篇:Stella 知识库--保护你的web程序
» 下一篇:[.net][开源]Stella Forum v 2.0 / v1.1 / v0.2(Astrophel)
posted @ 2005-05-24 17:11 Notus|南色的风 阅读(1758) 评论(13)  编辑 收藏 所属分类: Stella Forum知识库

  回复  引用  查看    
#1楼2005-05-24 18:05 | 听棠.NET      
嘿嘿,我的SPL能得到你这样的肯定,非常高兴啊。
其实我看了你的文章也还是没看懂源码,哈哈。
不过,我觉得你能在这么短时间内,运用SPL完成论坛开发,非常惊呀!
我SPL3.1是在2005-4-11才发布的啊。

  回复  引用  查看    
#2楼2005-05-24 19:24 | QuitGame      
这个跟 NHibernate有什么区别吗?

呵呵

  回复  引用  查看    
#3楼[楼主]2005-05-24 19:54 | Notus@下雨吧~~      
据说这个比NHibernate使用起来更加的简单,而且功能上很强,对一些小型的应用完全可以应付了。
正像听棠大哥说的,我也只是看了一下他blog上提供的资料,就可以快速的进行开发了,虽然我这个论坛的功能还不是很强,但我觉得很能说明问题了

还有一点,这个是国人开发的

其它的,哦,如果听棠大哥看到这个,希望可以过来回答一下


  回复  引用  查看    
#4楼2005-05-24 21:41 | 听棠.NET      
@QuitGame:
 其实从思想理论上SPL没有NH那么强,NH比SPL的强点是:开源、支持Relation、有较强的查询模式HQL
 SPL的强点是:简单易用、文档很全、同时支持多异构数据库、TOP功能、多帐套功能、异构数据库事务处理、异构数据库并发控制、内存镜像缓存等。具体的还是看我的SPL专栏吧:http://www.cnblogs.com/tintown/category/12787.html
 看你写了NH的代码生成器,真希望你能支持SPL,也能帮我完善SPL的代码生成器,跟NH一样的简单。

  回复  引用  查看    
#5楼2005-05-24 22:26 | jlzhou      
又有人捧臭脚啦,哈哈!支持一下喽......
  回复  引用  查看    
#6楼2005-05-25 12:18 | 游荡的灵魂      
使用o/r在性能上应该有损失吧!
  回复  引用  查看    
#7楼[楼主]2005-05-26 21:09 | Notus@下雨吧~~      
是的,是有一些损失,但是带来的开发效率的提高也是显而易见的,取舍就要看具体情况了
  回复  引用    
#8楼2005-05-27 09:40 | Richard[未注册用户]
但是o/r好像都没看到有支持视图、存储过程和函数的~~~
  回复  引用  查看    
#9楼[楼主]2005-05-27 09:47 | Notus@下雨吧~~      
视图和函数不清楚,spl可以直接使用存储过程的,看我的sf2中的代码
/// <summary>
/// 返回板块的帖子
/// </summary>
/// <param name="themeId">板块编号</param>
/// <param name="pageSize">每页大小</param>
/// <param name="pageNumber">页索引</param>
/// <returns></returns>
public Stella2.Model.Topics GetTopics(int themeId,int pageSize,int pageNumber)
{
//***********使用存储过程完成*************

//设定参数
IDataParameter parm1=Query.GetParameter("stella2");
parm1.ParameterName="@themeId";
parm1.Value=themeId;
IDataParameter parm2=Query.GetParameter("stella2");
parm2.ParameterName="@pageSize";
parm2.Value=pageSize;
IDataParameter parm3=Query.GetParameter("stella2");
parm3.ParameterName="@pageNumber";
parm3.Value=pageNumber;
IDataParameter[] parms=new IDataParameter[]{parm1,parm2,parm3};
//执行,返回一个数据表
DataTable dt=Query.RunProcedure("SelectTopics",parms,"stella2");
//保存到Topics
Stella2.Model.Topics ts=new Stella2.Model.Topics();
foreach(DataRow dr in dt.Rows)
{
Stella2.Model.Topic t=new Stella2.Model.Topic();
t.Id=(int)dr[TopicEntity.__ID];
t.DateAdded=(System.DateTime)dr[TopicEntity.__DATEADDED];
t.DateLastReply=(System.DateTime)dr[TopicEntity.__DATELASTREPLY];
t.ReplySum=(int)dr[TopicEntity.__REPLYSUM];
t.Smile=(string)dr[TopicEntity.__SMILE];
t.ThemeId=(int)dr[TopicEntity.__THEMEID];
t.Title=(string)dr[TopicEntity.__TITLE];
t.UserNameAdded=(string)dr[TopicEntity.__USERNAMEADDED];
t.UserNameLastReply=(string)dr[TopicEntity.__USERNAMELASTREPLY];
t.ViewSum=(int)dr[TopicEntity.__VIEWSUM];
t.Up=(int)dr[TopicEntity.__UP];

ts.addTopic(t);
}

ThemeEntity te=new ThemeEntity();
te.Id=themeId;
te.Retrieve();
ts.MainTheme.TopicSum=te.TopicSum;

return ts;

}

因为我坚持使用自己的Model类,所以才这样的,如果直接返回datatable就少很多代码了

  回复  引用  查看    
#10楼2006-02-22 16:38 | zkxp      
-_-!觉得使用SPL 2层开发就够了。挺好。

使用SPL写出来的代码看上去倒挺雅观的。

  回复  引用  查看    
#11楼[楼主]2006-02-27 11:36 | Notus@红色      
呵呵,这个东西就是用起来方便,但是总是不敢把它真的紧密结合到系统中
  回复  引用    
#12楼2006-02-28 10:20 | astonisth[未注册用户]
开源代码gorve也能达到如此效果,用起来也很方面.
  回复  引用    
#13楼2006-02-28 10:24 | astonisth[未注册用户]
想知道你有没参考过DNN的设计模式.我正想学下.