• 轻量级数据持久层Seaking.PL简介及建议征集


    引言

        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
            
            
    Private Member
            
            
    Initialize
            
            
    Properties
        }

    }

    由于实体类中包含与数据表的映射关系及其他属性,并对空值处理提供了支持,实体类略显肥大。
    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对象简介已经发布。

  • 相关阅读:
    学习Tomcat(三)
    TIME_WAIT 优化注意事项
    TIME_WAIT 优化
    TCP(一)
    TCP(二)
    TCP(三)
    5-14 练习题及答案
    5-14 进程池
    5-11 操作系统介绍
    5-8套接字socket
  • 原文地址:https://www.cnblogs.com/chinadhf/p/440679.html
Copyright © 2020-2023  润新知