Restful.Data v1.0 - 轻量级数据持久层组件, 正式开源发布了
经过几个星期的优化调整,今天 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 - 轻量级数据持久层组件, 正式开源发布了的更多相关文章
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- .NET平台下,关于数据持久层框架
在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...
- .NET开源项目介绍及资源推荐:数据持久层
在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...
- c++ 数据持久层研究(一)
C++ORM框架自动生成代码数据库 用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...
- [置顶] 数据持久层(DAO)常用功能–通用API的实现
在Web开发中,一般都分3层. Controller/Action 控制层, Service/Business 服务层/业务逻辑层, Dao 数据访问层/数据持久层. 在学习和工作的实践过程中,我发现 ...
- Java数据持久层框架 MyBatis之背景知识一
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- Hibernate: 数据持久层框架
Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...
- 数据持久层(DAO)通用API的实现
在Web开发中,一般都分3层.Controller/Action 控制层,Service/Business 服务层/业务逻辑层,Dao 数据访问层/数据持久层. 在学习和工作的实践过程中,我发现很多功 ...
- Java数据持久层
一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...
随机推荐
- WNDR3700V4 安装SVN Server
下文所用路由器型号为:WNDR3700V4 参考链接:http://dd-wrt.ca/phpBB2/viewtopic.php?t=86912&highlight=optware http: ...
- My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
是这样,我在我的android项目中想实现zxing也就是二维码的一些功能,但是需要的一个源码工程是androidstudio工程,想把这个工程转成eclipse工程并导成jar包在我的项目中使用. ...
- My安卓知识3--多个activity之前共享数据的方法
在网上搜这个问题的时候看到了有一篇文章说有五种方法: 1.基于消息的通信机制 Intent ---boudle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStrea ...
- 学习总结relative和absolute
之前对于absolute和relative不了解,现在整理 先设置relative再设置absolute 因为父不设置relative 那么子会向上寻找祖先元素,看是否设置relative.如果有则相 ...
- 强大的Spring缓存技术(中)
好,到目前为止,我们的 spring cache 缓存程序已经运行成功了,但是还不完美,因为还缺少一个重要的缓存管理逻辑:清空缓存. 当账号数据发生变更,那么必须要清空某个缓存,另外还需要定期的清空所 ...
- Iscroll解析
做了一些移动端的产品,发现一些滚动效果很多会使用 iscroll 作为底层库(如阿里小蜜).iscroll 的文档已经好久没更新了,而且比较简单,经常需要直接读源码.这里写一篇总结,作为对 iscro ...
- Google Earth API 替换方案
众所周知,GE API将会在15年12月25日结束服务,对于众多采用该API的软件,需要一些替换方案. 例如google map或者cesiumjs http://cesiumjs.org/ 或者尝试 ...
- JSP日期时间转C#
DateTime.ParseExact("Wed Aug 03 16:46:24 CST 2016", "ddd MMM dd HH:mm:ss CST yyyy&quo ...
- android6.0锁屏界面接收新通知处理流程
灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进入NotificationManagerService处理. ...
- Oracle统计函数之Lead
一,Lead 语法及例子 Lead函数是十分的好用的一个函数.它的语法如下图: 简单地说,lead是个奇特函数,在允许不使用自连接的情况下,一次返回多行. 参数说明: value_expr 值表达式, ...