经过几个星期的优化调整,今天 Restful.Data 正式开源发布。

源码地址:https://github.com/linli8/Restful

今天不写那么多废话了,还是重新介绍一下 Restful.Data 吧。


1、什么是Restful.Data?

Restful.Data是一套通用的轻量级数据持久层组件,除封装了ADO.NET基本的数据库操作以外,也提供了一些orm相关的API,用户可以方便的定义实体类,并使用这些API对数据进行增删改查等操作。

Restful.Data借鉴了业界如nhibernate、entity framework等知名的数据持久层组件,但从一开始设计的初衷就是为了让用户能快速的学习和使用,并写出更加简洁优雅的代码,所以摒弃了一些复杂的设计和功能,用户可以使用变通的方式或方法使用Restful.Data组件实现其目的。

Restful.Data充分考虑了实体框架的执行效率问题,进行了反复的推敲和论证,尽可能的采用高效的设计方案来提高性能。


2、谁需要Restful.Data?

敢于冒险、追求完美、勇于挑战并极具责任感的程序设计人员。


3、Restful.Data提供哪些功能?

基本的ADO.NET操作:BeginTransaction、ExecuteScalar、ExecuteDataReader、ExecuteDataTable、ExecuteDataSet、ExecutePageQuery、ExecuteStoredProcedure

ORM相关操作:Insert、Updete、Delete、Find


4、如何使用Restful.Data?

使用前请先下载Restful.dll、Restful.Data、Restful.Data.MySql、Remotion.Linq.dll、MySql.Data.dll,或者直接下载源代码进行编译并获取这5个dll,并在项目中引用这些dll。

点这里下载相关文件

在 Web.config 或 App.config 中配置连接字符串,如下:

<connectionStrings>
  <clear />
  <add name="MySql1" connectionString="server=192.168.1.101;database=Restful;user id=linli8;password=linli8" providerName="Restful.Data.MySql"/>
  <add name="MySql2" connectionString="server=192.168.1.102;database=Restful;user id=linli8;password=linli8" providerName="Restful.Data.MySql"/>
</connectionStrings>

注册提供程序工厂:

SessionFactories.Register<MySqlSessionFactory>();

提供程序工厂在一个Application中仅需注册一次。

如何进行基本的数据库操作:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
  string sql = "select * from Person";   DataTable dt = session.ExecuteDataTable( sql );
}

CreateDefaultSession默认情况下根据配置文件中连接字符串节点的第一项创建数据库连接,你可以调用CreateSession进行指定,或者你也可以使用 SessionFactory.Default = "MySql2"指定默认连接。

为防止 SQL 注入,你也使用带参数方法:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
string sql = "select * from Person where Id = @Id;"; IDictionary<string, object> parameters = new Dictionary<string, object>(); parameters.Add( "@Id", 5 ); DataTable dt = session.ExecuteDataTable( sql, parameters );
}

与此类似的还有ExecuteScalar、ExecuteDataReader、ExecuteDataTable、ExecuteDataSet等方法。

如何进行分页查询:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
string sql = "select * from User where CreateTime < @CreateTime"; IDictionary<string, object> parameters = new Dictionary<string, object>(); parameters.Add( "@CreateTime", DateTime.Now ); // 查询第2页,每页10条,并根据 CreateTime 字段降序排列
PageQueryResult result = session.ExecutePageQuery( sql01, 2, 10, "CreateTime DESC", parameters );
}

如何进行数据新增:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
var person = new Person(); // person.Id = 1; 若Id字段为自增类型,无需指定。
person.Name = "test01";
person.CreateTime = DateTime.Now;
person.IsActive = true; int i = session.Insert( person );
}

如何进行数据更新:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
var person = new Person(); person.Id = 1;
person.Name = "test01";
person.CreateTime = DateTime.Now;
person.IsActive = true; // 在调用此方法时,务必指定实例的主键值。
int i = session.Update( person );
}

或者你也可以批量更新:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
var person = new Person(); // person.Id = 1;
person.Name = "test01";
person.CreateTime = DateTime.Now;
person.IsActive = true; // 在调用此方法时,不需要指定主键值,且不会更新主键字段
session.Update<Person>().Set( person ).Where( s => s.IsActive == false ).Execute();
}

如何进行数据删除:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
var person = new Person() { Id = 1 }; // 在调用此方法时,需要指定主键值
session.Delete( person );
}

或者你也可以批量删除:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
// 在调用此方法时,不需要指定主键值
session.Delete<Person>().Where( s => s.IsActive == false ).Execute();
}

如何进行单表查询:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
var queryable = session.Find<Person>()
.Where( s => s.Name.Contains("a") )
.Where( s => s.CreateTime < DateTime.Now )
.OrderBy( s => s.CreateTime )
.Skip(5)
.Take(10); var list = queryable.ToList();
var count = queryable.Count();
var first = queryable.FirstOrDefault(); var queryable1 = from s in session.Find<Person>()
where s => s.Name.Contains("a")
orderby s.CreateTime descending
select new { Id = s.Id, Name = s.Name }; // ...
}

目前只支持对单表的LINQ查询,且为了降低复杂度,后期也不打算支持多表查询,对函数的支持也有限,仅支持string类型的StartsWith、EndsWith、Contains、Equals、IsNullOrEmpty等方法,对于其他方法后期将会继续完善。

如果你需要实现一个复杂的查询并将其转换成对象,你也可以这样:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
string sql = "..."; T @object = session.Find<T>( sql );
}

如何支持事务处理:

using( ISession session = SessionFactory.CreateDefaultSession() )
{
using( DbTransaction transaction = session.BeginTransaction() )
{
// ...
// ... transaction.Commit();
}
}

SessionHelper的使用:

SessionHelper对session对象的方法进行了静态封装,如果你只是需要执行单条语句,并马上关闭连接,你可以使用 SessionHelper 类中提供的一些辅助方法。

5、如何定义实体类

[Serializable]
public class Person : EntityObject // 需继承与 EntityObject 类
{
private int m_Id;
private string m_Name;
private int? m_Age;
private decimal? m_Money;
private DateTime m_CreateTime;
private bool m_IsActive; [PrimaryKey, AutoIncrease] // 如果是自增字段,标记为 AutoIncrease;如果是主键标记为 PrimaryKey
public int Id
{
get { return this.m_Id; }
set { this.m_Id = value; this.OnPropertyChanged( "Id", value ); }
} public string Name
{
get { return this.m_Name; }
set { this.m_Name = value; this.OnPropertyChanged( "Name", value ); }
} public int? Age
{
get { return this.m_Age; }
set { this.m_Age = value; this.OnPropertyChanged( "Age", value ); }
} public decimal? Money
{
get { return this.m_Money; }
set { this.m_Money = value; this.OnPropertyChanged( "Money", value ); }
} public DateTime CreateTime
{
get { return this.m_CreateTime; }
set { this.m_CreateTime = value; this.OnPropertyChanged( "CreateTime", value ); }
} public bool IsActive
{
get { return this.m_IsActive; }
set { this.m_IsActive = value; this.OnPropertyChanged( "IsActive", value ); }
}
}

6、总结

因作者时间关系,组件目前并非十分完善,测试工作也只简单的进行了一部分,但您可以完全放心的应用于商业项目中,如遇到问题,作者将尽可能的解决。后期还将持续优化,感兴趣且愿意参与开源项目的小伙伴们,请加QQ群:338570336。

另如使用中发现bug,真心希望能分享出来,我们一并修正并改进。

Restful.Data v1.0 - 轻量级数据持久层组件, 正式开源发布了的更多相关文章

  1. UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

    选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...

  2. .NET平台下,关于数据持久层框架

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

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

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

  4. c++ 数据持久层研究(一)

    C++ORM框架自动生成代码数据库  用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...

  5. [置顶] 数据持久层(DAO)常用功能–通用API的实现

    在Web开发中,一般都分3层. Controller/Action 控制层, Service/Business 服务层/业务逻辑层, Dao 数据访问层/数据持久层. 在学习和工作的实践过程中,我发现 ...

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

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

  7. Hibernate: 数据持久层框架

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

  8. 数据持久层(DAO)通用API的实现

    在Web开发中,一般都分3层.Controller/Action 控制层,Service/Business 服务层/业务逻辑层,Dao 数据访问层/数据持久层. 在学习和工作的实践过程中,我发现很多功 ...

  9. Java数据持久层

    一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...

随机推荐

  1. C# Acrobat打开pdf出错,提示Acrobat.AcroPDDocClass不能强制转换为Acrobat.CAcroPDDoc,使用com组件{9B4CD3E7-4981-101B-9CA8-9240CE2738AE},HRESULT: 0x80004002

    要批量将PDF文件内容按页转换为图片,在写的过程过程遇到两个问题. 一,下载的SDK中,提示要引用COM组件Acrobat,但在我的电脑上就是看不到,只能看到Adobe Acrobat 7.0 Bro ...

  2. shell 环境初始化顺序

    登陆shell 的执行顺序 /etc/profile /etc/profile.d/file /etc/bashrc .bashrc .bash_profile 非登录shell 的执行顺序, 例如: ...

  3. C++ STL 助记1:vector

    vector<, ); // Creates vector of 10 ints with value 100 vector<, "hello"); vector< ...

  4. 【windows 下安装 mysql-server 无法登录问题解决】

    ----------------------------- 无感的首行 ----------------------------- 新版 mysql-server 5.7 安装后发现无法使用 mysq ...

  5. jQuery简介

    jQuery简介 jQuery是继Prototype之后的又一个javascript库,它由John Resig创建于2006年1月. Javascript库作用比较: 1. Prototype(ht ...

  6. iOS开发时,在Xcode中添加多个Targets进行版本控制

    在iOS开发中,很可能有以下场景:需要开发多个版本,或因需区分收费版,免费版,或因为网络环境需要区分测试版,发布版,或因渠道不同需要区分企业版,AppStore版等等.解决办法无非就是CheckOut ...

  7. doT.js源码解读

    doT.js非常的简洁.全部代码也就200行不到.它的基本思路就是通过强大的正则表达式,把模块转变成可执行的函数,动态生成html字符串.核心new Function(c.varname, str); ...

  8. 121. Best Time to Buy and Sell Stock (一) leetcode解题笔记

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  9. RHEL7学习之ISCSI配置

    ISCSI服务器:192.168.10.10 ISCSI客户端:192.168.10.20 在ISCSI服务器添加两块硬盘:/dev/sdb /de/sdc 一,在服务端安装 [root@localh ...

  10. C、C++、Java、go的语法区别

    详细C++.Java比较:http://www.cnblogs.com/stephen-liu74/archive/2011/07/27/2118660.html 一.C.C++的区别 在很大程度上, ...