SPL 说明文件
一、体系结构
首先我们来看看SPL的体系结构:
SPL是数据库和应用程序之间的持久化层,应用程序和SPL通过持久化(Persistent)对象联系在一起。SPL使用app.config或者web.config文件进行设置。Session (会话) 通过这个
代表应用程序和持久化层之间的一次对话的接口。
SessionImp(会话实例)
这个类实现了会话的具体实现。封装了一个ADO.NET连接,查询,编辑操作。
SessionFactory (会话工厂)
也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。并且通过绑定在实体类的自定义属性,反射出数据库表结构,以执行数据库操作。
二、示例代码
我们看看他们是如何协同工作的,请看下面的代码。
实体代码示例:
/// <summary>
/// 品牌
/// </summary>
[Serializable()]
[Class("Brand")]
public class Brand
{
private System.Guid _ID;
private string _Name;
/// <summary>
/// ID
/// </summary>
[Key(typeof(Guid))]
public System.Guid ID
{
get { return this._ID; }
set { this._ID = value; }
}
/// <summary>
/// 名称
/// </summary>
[Property()]
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
}
三、业务操作代码
/// <summary>
/// 获取品牌列表
/// </summary>
/// <returns>品牌</returns>
public ArrayList GetALL()
{
string sql="select [${0}$] from [Brand]";
sql=string.Format(sql,typeof(shop.Entity.Brand).AssemblyQualifiedName);
ArrayList list = Find(sql);
return list;
} /// <summary>
/// 查找品牌
/// </summary>
/// <param name="oql"> oql语句</param>
/// <returns>品牌</returns>
public ArrayList Find(string oql)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
return s.Find(oql);
}
finally
{
s.Close();
}
} /// <summary>
/// 添加品牌
/// </summary>
/// <param name="o">品牌</param>
public void Add(shop.Entity.Brand o)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
s.Insert(o);
}
finally
{
s.Close();
}
} /// <summary>
/// 删除品牌
/// </summary>
/// <param name="o">品牌</param>
public void Delete(shop.Entity.Brand o)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
s.BeginTransaction();
s.Delete(o);
s.CommitTransaction();
}
catch
{
s.RollBackTransaction();
throw;
}
finally
{
s.Close();
}
} /// <summary>
/// 更新品牌信息
/// </summary>
/// <param name="o">品牌</param>
public void Update(shop.Entity.Brand o)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
s.Update(o);
}
finally
{
s.Close();
}
}
一、体系结构
首先我们来看看SPL的体系结构:
SPL是数据库和应用程序之间的持久化层,应用程序和SPL通过持久化(Persistent)对象联系在一起。SPL使用app.config或者web.config文件进行设置。Session (会话) 通过这个
代表应用程序和持久化层之间的一次对话的接口。
SessionImp(会话实例)
这个类实现了会话的具体实现。封装了一个ADO.NET连接,查询,编辑操作。
SessionFactory (会话工厂)
也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。并且通过绑定在实体类的自定义属性,反射出数据库表结构,以执行数据库操作。
二、示例代码
我们看看他们是如何协同工作的,请看下面的代码。
实体代码示例:
/// <summary>
/// 品牌
/// </summary>
[Serializable()]
[Class("Brand")]
public class Brand
{
private System.Guid _ID;
private string _Name;
/// <summary>
/// ID
/// </summary>
[Key(typeof(Guid))]
public System.Guid ID
{
get { return this._ID; }
set { this._ID = value; }
}
/// <summary>
/// 名称
/// </summary>
[Property()]
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
}
三、业务操作代码
/// <summary>
/// 获取品牌列表
/// </summary>
/// <returns>品牌</returns>
public ArrayList GetALL()
{
string sql="select [${0}$] from [Brand]";
sql=string.Format(sql,typeof(shop.Entity.Brand).AssemblyQualifiedName);
ArrayList list = Find(sql);
return list;
} /// <summary>
/// 查找品牌
/// </summary>
/// <param name="oql"> oql语句</param>
/// <returns>品牌</returns>
public ArrayList Find(string oql)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
return s.Find(oql);
}
finally
{
s.Close();
}
} /// <summary>
/// 添加品牌
/// </summary>
/// <param name="o">品牌</param>
public void Add(shop.Entity.Brand o)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
s.Insert(o);
}
finally
{
s.Close();
}
} /// <summary>
/// 删除品牌
/// </summary>
/// <param name="o">品牌</param>
public void Delete(shop.Entity.Brand o)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
s.BeginTransaction();
s.Delete(o);
s.CommitTransaction();
}
catch
{
s.RollBackTransaction();
throw;
}
finally
{
s.Close();
}
} /// <summary>
/// 更新品牌信息
/// </summary>
/// <param name="o">品牌</param>
public void Update(shop.Entity.Brand o)
{
Session s = SessionFactory.Instance.OpenSession();
try
{
s.Update(o);
}
finally
{
s.Close();
}
}
解决方案 »
- 怎么点击TextBox时弹出日历,选择日期后日期输入到TextBox中?
- WinForm控件如何更改内部控件Top、Left的相对位置。
- Repeater分页(中间有分割线的问题)
- 电子邮件Base64无法解码的问题,大家帮帮忙
- 莫名其妙的错误(关于DataSet和DataGrid)?望高手指点!
- 初学dev的grid,请各位教我,属性太复杂了。
- 如何对两张照片合影
- panel嵌套窗体 Load事件时窗体内控件坐标和大小改变
- OracleDataReader.read()读不出东西来,小弟刚学习,请指教。。
- 关于控件的小问题
- 如何把pictureBox1显示的图片去掉?
- 孟子e章<img src="Chart.aspx" />语句中的src问题
[email protected]
[email protected]
[email protected]
使用spl kit(aps)可以快速生成一个项目(示例项目就是用spl kit生成的)
[email protected]
给我一份,谢谢了
[email protected]
谢谢
谢谢
学习
谢谢
回去学习!
[email protected]
谢谢!!
呵呵,谢谢
有兴趣的朋友可以到我的blog发表发表意见
http://blog.csdn.net/sukyboor/
Email:[email protected]
楼主这个框架应该不错
我能不能也来个
[email protected]
研究,谢谢
谢谢了。
楼主写的框架跟XPO是不是相似的?
[email protected]
麻烦楼主了
建议放个地址吧。
没有空间,呵呵
[email protected]
谢谢了。
楼主写的框架跟XPO是不是相似的?
基本类似
学习学习,谢谢啦!!!
spl包含Persister和aps(spl Persister kit)两部分内容。Persister为ORM提供对象持久、关系对象查询、简单事务处理、简单异常管理等功能。数据持久包括一些对象的Insert、Delete、Update、Find等功能,关系对象查询则提供一些基于对象的复杂关系查询。APs是基于vs.net 2003开发的外接程序,职责是帮助开发人员快速映射关系数据库中的业务模型到符合Persister要求的映射实体类, 理论上可以根据设置快速生成一个可以运行的web项目。在ORM实现的前期工作中,为了实现屏蔽各种数据库之间的操作差异,我们需要定义数据操作公有接口,封装基本的数据库Insert,Update,Delete,Query等操作。
public sealed class DbHelper{
int ExecNonQuery(string cmdText);
int ExecDataSet(string cmdText,DataSet entity);
object ExecScalar(string cmdText);
…
}
完成后,就是ORM主角——实体(Entity)的实现。ORM中实体的定义可以通过实体类自身包含数据模型元数据的方式实现,也可以通过定义XML的元描述实现。下面讲述了通过实体类自身映射的实现。
实体(Entity)是实际业务数据的载体,包含业务数据模型的元描述,可以直接由数据库中的某张表或视图生成,也可以根据需要手工创建。.NET中提供了System.Attribute,该类包含访问和测试自定义属性的简便方法。.NET Framework预定义了一些属性类型并使用它们控制运行时行为。我们可以通过继承System.Attribute基类自定义用于描述实体对象映射时所需要的数据模型元数据,包括表名,字段名,字段长度,字段类型等一些常用的数据。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class ClassAttribute: Attribute
AttributeUsage用来表示该自定义属性可以被绑定在什么样的对象上,这里表示应用在Class或者Struct之上。
定义一般字段所需要的自定义属性类。
[AttributeUsage(AttributeTargets.Property)]
public class PropertyAttribute: BaseFieldAttribute
定义关键字字段所需的自定义属性类。
[AttributeUsage(AttributeTargets.Property)]
public class KeyAttribute: BaseFieldAttribute
实体定义完成后,我们需要根据实体类中绑定的自定义属性构造出运行期需要的SQL语句,为了收集实体类定义中的数据结构描述,我们需要定义一个类来说明实体在运行期所引用到的所有关于数据持久的信息,包括关键字字段,一般字段等。
internal class EntityObjInfo
以上条件具备后,我们需要定义一个工厂类,负责转换数据的程序类型到数据库字段类型,并且构造出Insert,Update,Delete,Query等操作所需要的SQL语句。
internal class SessionFactory
会话接口
public abstract class Session
以及会话的实现
public class SessionImp
会话实现时会将数据实体信息缓存在hashtable中,
//取得实体类型反射信息
EntityObjInfo eoi = SessionFactory.GetEOI(theClass);
这样我们就可以通过实体信息构造出实体对象,并依据绑定的属性执行DbHelper中的操作。
DbHelper.ExecuteScalar(tx,CommandType.Text,sqls);
并将返回的数据保存在实体对象中
private object DataRowToEntityObject(DataRow row,Type theClass)
也给我发一个,谢谢
楼主谢了。
[email protected]
SWEIG0721!126.COM
************************************************************************************************************************************************************************************************************************************************************
不是听堂的那个spl吧,麻烦楼主发一份研究,谢了
[email protected]
好象是一个名字了,:)
听棠兄,对不住鸟
不过实现方式不太一样
谢谢
谢谢弱问一句:持久层框架是什么,有什么用?
谢谢,我正在研究,想看看
My Email: [email protected]
谢谢:)
[email protected]非常感谢~!
[email protected]
[email protected]
[email protected]
[email protected] 呵呵,搞开源吧,我参加
代码写太臭了,怕被砖头砸死