引言

Seaking.PL(以下简称PL)是我刚刚完成的一个轻量级数据持久层,在众多的数据持久层产品中,PL或许显得有些稚嫩,甚至有点难登大雅之堂,但是我相信,至于对于一部分应用,PL可能会是一个简易而实用的选择。
    以下是PL的简介及使用说明,希望大家多多指点并提出建议,与大家共享一个迅速成长并不断完善的PL,也是我写此文的目的所在。

一、概述
PL除具有一般数据持久层的共性外,还具有以下特点:
1. 无须配置文件及其他设置,最简单化的应用。
2. 自动生成实体类。利用随同PL一起发布的代码模板可以自动生成实体类。
3. 多数据源支持。目前可支持SqlServer、OleDb、Odbc、Oracle数据源。
4. 支持空值(与DBNull.Value对应)处理。
5. 支持事务处理。
6. 同时支持面向对象的实体类及ADO.NET数据集的操作。
7. 完全参数化的SQL生成。
8. 相对强大的数据查询功能。
    PL需待完善的功能:关系映射。

二、组成
1. 主要对象
从客户程序的角度看,PL主要由DataProvider(数据提供者)、Session(会话)、Query(查询)三个对象组成。
DataProvider是PL的基础,同时也是Session和Query的工厂。
Session是客户程序与数据源的一次会话,会话过程中可以对多个实体(Entity)或数据集进行查询、添加、修改、删除等操作,会话过程对事务提供了完善的支持。
Query是一个查询对象,不具备Session的操作功能,但数据查询功能比Session更加强大,包括对View(视图)的查询及对Join(关联)、Condition(条件)、Order(排序)、Alias(别名)等的支持。
2. 其他对象
其他对象包括Entity(实体)、Property(属性)、Condition(条件)和ConditionColection(条件集合)、Log(日志)等,并使用了微软的DAAB数据访问组件3.0。
Entity与数据表(DataTable)相对应,是最常用的对象,其本身并不是PL的一部分,但必须继承PL.IEntity接口。Entity可以利用随同PL一起发布的代码模板自动生成。
Property与数据列(DataColumn)相对应,用来定义Entity的属性,同数据表应该具有主键字段一样,每个Entity应该有一个主键属性,用来对Entity进行唯一标识。PL共提供了24个Property类,分别与DbType枚举的24个成员相对应。
Condition和ConditionColection为数据查询提供了条件的定义,由Session和Query共用。
Log为PL提供了日志功能,主要用来记录PL使用过程中出现的异常信息或警告信息。
三、使用
1. 引用
在项目中添加对PL的引用。
2. 生成实体类
根据PL提供的代码模板自动生成与数据表相对应的实体类。
实体类示例代码如下:

using System;
using PL;
using PL.Property;

namespace myPL
{
    public class Employee : IEntity
    {
        public Employee()
        {
            Initialize();
        }
        
        TableName , FieldName#region TableName , FieldName
        public const string tableName="employee";
        public const string fieldName_Id = "Id";
        public const string fieldName_Name = "name";
        public const string fieldName_Age = "age";
        #endregion
        
        Private Member#region Private Member
        private Int32Property id;
        private StringProperty name;
        private Int32Property age;
        #endregion
        
        Initialize#region Initialize
        private void Initialize()
        {
            //Member Id
            id = new Int32Property() ;
            id.IsPrimaryKey = true; 
            id.AutoIncremint = true; 
            id.AllowNull = false;
            id.Unique = true;
            id.FieldName = fieldName_Id;
                        
            //Member Name
            name = new StringProperty() ;
            name.AllowNull = false;
            name.MaxLength=50;
            name.FieldName = fieldName_Name;
                        
            //Member Age
            age = new Int32Property() ;
            age.FieldName = fieldName_Age;
                        
        }
        #endregion
        
        Properties#region Properties
        /**////<summary>
        ///数据表名称。
        ///</summary>
        public string TableName
        {
            get{return tableName;}
        }
        
        /**////<summary>
        ///ID
        ///</summary>
        public Int32Property Id
        {
            get{return id;}
        }
        
        /**////<summary>
        ///姓名
        ///</summary>
        public StringProperty Name
        {
            get{return name;}
        }
        
        /**////<summary>
        ///年龄
        ///</summary>
        public Int32Property Age
        {
            get{return age;}
        }
        
        #endregion
    }
}

由于实体类中包含与数据表的映射关系及其他属性,并对空值处理提供了支持,实体类略显肥大。
3. 初始化DataProvider
在使用PL前,必须对DataProvider进行初始化处理,即指定数据源类型及连接字符串,代码大致如下:

PL.DataProvider dp=new DataProvider(DataProviderKind.SqlServer,"Server=
(local);Database=MyTemp;Integrated Security=True;");

PL.DataProvider dp=new DataProvider();
dp.DataProviderKind=DataProviderKind.SqlServer;
dp.ConnectionString="Server=(local);Database=MyTemp;Integrated security=True;";

考虑到一个程序中可能会访问不同的数据源或多个数据库,DataProvider提供的是非静态成员,需对DataProvider进行实例化后使用。同时强烈建议将DataProvider实例化为整个程序都可以访问的静态成员,这样使整个程序中只实例化一个DataProvider对象即可(当然如果需要访问多数据源/库,就需要对应的实例化多个DataProvider)。
4. 使用
A. Session
Session是所有实体或数据集的操作类,是PL中最主要的对象。
Session不能用new进行实例化,而必须由DataProvider生成。

Session se=dp.NewSession();

a. 实体的获取

Employee em =(Employee)se.LoadEntity(typeof(Employee),10); //根据类型获取

Employee em=new Employee();//实例化“空”的实体
se.LoadEntity(em,10);

说明:代码中的10为Employee的主键属性的值,object类型,以下代码中可能会多次出现这种格式,将不再说明。
b. 实体的更新

em.Name.Value="Mike";
se.Update(em);

c. 实体的删除

se.Delete(em);

se.Delete(typeof(Employee),10);

d. 实体的增加

Employee em=new Employee();
em.Name.Value="Mike";
em.Age.Value=25;
se.Insert(em);

实体的更新和增加还可以统一写成:

se.Save(em);

如果em在数据源中不存在,将执行Insert操作,否则执行Update操作。
e. 获取实体集合

ArrayList emList=se.LoadEntityList(typeof(Employee));

如果需要,可以在获取实体集合时指定条件。
f. 获取实体主键属性值的集合

ArrayList pkList=se.LoadPkValueList(typeof(Employee));

当数据量较大或每个实体的属性较多时,一次性获取所有实体的集合或许不是最好的选择,主键属性值集合为客户程序采用“大颗粒”模式提供了必要的支持。
g. 实体存在性检测

bool isExist=se.IsExist(em);

bool isExist=se.IsExist(typeof(Employee),10);

h. 获取或填充数据集

DataSet ds=se.LoadDataSet(typeof(Employee));

DataSet ds=new DataSet();
se.FillDataSet(typeof(Employee), ds);

如果需要,可以在获取或填充数据集时指定条件。
i. 根据数据集更新数据源

se.Update(typeof(Employee),ds);

j. 使用事务
在会话过程中,可以非常方便的使用事务。
开始事务:

se.BeginTransaction();

提交事务:

se.TransactionCommit();

回滚事务:

se.TransactionRollback();

虽然事务只能存在于一次会话中,但不难看出,客户程序可以非常方便的实现多个会话(可能会访问不同的数据源/库)的事务处理。
B. Query
将在近期的续篇中对PL中的另一个主要对象Query及辅助对象Condition、ConditionColection的使用进行说明。

结束
1. 建议征集
由于本人对数据持久层缺乏深入的理解,PL可能存在许多不合理或待完善之处,真诚希望大家能够多多指点,提出建议,让PL不断成长和完善。
2. 关于软件发布
由于PL刚刚完成,可能尚有许多不完善之处,也不可避免的可能存在一些Bug,所以未敢贸然将PL发布出来。我会在听取大家的建议并将PL基本完善后,近期在我的Blog上提供PL的下载并陆续发布PL的文档及Demo,敬请感兴趣的朋友留意。
3. 关于开源
如果大家对PL感兴趣并有意为PL的成长和完善提供指导和帮助,我会考虑在适当的时候逐步对PL开源。
4. 致谢
非常感谢大家阅读此文及对PL的关注,同时希望通过大家的指点及帮助,将一个更加完善的PL与大家共享。

2006.7.7 补充:Seaking.PL--Query对象简介已经发布。

转载于:https://www.cnblogs.com/chinadhf/archive/2006/07/02/440679.html

轻量级数据持久层Seaking.PL简介及建议征集相关推荐

  1. MyBatis 一个数据持久层(ORM)框架

    MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. MyBatis框架 [1] iBATIS一词来源于"internet"和"abatis&qu ...

  2. MyBatis 数据持久层

    引用:http://baike.baidu.com/view/4372646.htm MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. MyBatis框架 [1] iBAT ...

  3. MiniDao (轻量级JAVA持久层,Hibernate完美助手)

    MiniDao (轻量级JAVA持久层,Hibernate完美助手) 当前最新版本: 1.6.4 (发布日期:20180604) MiniDao产生的初衷? 采用Hibernate的J2EE项目都有一 ...

  4. Web开发的那点事--数据持久层常用功能

    CSDN博客不再经常更新,更多优质文章请来 粉丝联盟网 FansUnion.cn! (FansUnion) 数据持久层--4类功能 1.增加  增加一条记录-实体(有关联,没有关联)   2.修改   ...

  5. 持久层是什么意思_软件项目实训及课程设计指导—如何在数据持久层中应用DAO模式...

    软件项目实训及课程设计指导--如何在J2EE应用系统数据持久层中应用DAO模式 1.为什么要在软件应用系统中提供数据持久层 软件应用系统中的数据持久层主要为整个软件应用系统提供数据访问功能服务,从而可 ...

  6. Java数据持久层框架 MyBatis之背景知识一

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  7. 数据持久层框架 Hibernate

    Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...

  8. 轻量级J2EE持久层解决方案,MiniDao-PE版 1.5.4【版本发布】

    MiniDao-PE精简版(轻量级持久层) MiniDao-PE是一种轻量级J2EE持久层解决方案,类似mybatis持久层的SQL方式,可以轻松集成Hibernate项目,事务统一管理,解决了Hib ...

  9. .NET开源项目介绍及资源推荐:数据持久层

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

最新文章

  1. 2009江民中国大陆地区计算机网络安全报告
  2. SpringMVC启动后自动执行
  3. PHP实现四种基本排序算法
  4. 【收藏】Harbor私有仓库中如何彻底删除镜像释放存储空间:vmware/registry:2.6.2-photon进行垃圾回收
  5. linux make教程,Linux下makefile的一个简单框架
  6. PyOpenGL之3D界面详解(二)
  7. 小觅双目相机如何使用_MYNT EYE S小觅双目摄像头标准(彩色)版结构光双目深度惯导相机3D...
  8. maven00----maven学习说明
  9. javascript之字符串常用方法学习 charAt concat indexOf substring substr toUpperCase
  10. qoq是什么意思的缩写_买鞋多年分不清PE、SE、TD什么意思?建议收藏,这些缩写一定要知道...
  11. 深入理解JVM(6)——JVM性能调优实战
  12. 2019互联网公司端午礼盒大PK!
  13. 第52届世界标准日,细数我国密码标准化工作成果
  14. Storm数据流分组与数据保障机制
  15. ZYNQMP_XAZU3EG_LINUX 默认启动项修改
  16. 苹果wifi网速慢怎么办_家里网速慢如何解决 提高WiFi网速方法【详解】
  17. android7.0模拟器pc版,安卓9.0模拟器电脑版
  18. 如何组织一场安全、可靠、高效的网络实战攻防演习?
  19. C语言中,#include的用法:#include 和 #include区别
  20. ios 渐变透明背景_在PS中用橡皮擦工具擦除背景并合成背景

热门文章

  1. java读取字符串,生成txt文件
  2. php根据修改时间删除指定目录下文件
  3. IIS利用X-Forwarded-For获得来访者的真实IP
  4. MySQL学习(四)查询
  5. JavaWeb_响应和请求数据包
  6. 一天一种设计模式(一)------观察者模式
  7. robot framework 使用三:他们主动浏览器的兼容性
  8. 数据仓库与数据挖掘的一些基本概念
  9. Seafile 1.4 发布,文件同步和协作平台
  10. flash与字符串:数组转换为字符串