光阴似箭,日月如梭,套用小学作文惯用的一句开场白来开始重新开始我的博客园生涯吧。

8年的风霜雪雨,不断的击打着我内心的哀伤,可我依旧坚挺的屹立在这里,是因为技术是我一直坚持的梦想。

追寻着先辈和高人的脚步,多希望能见见他们的模样,仰望着他们高高在上,心中不禁黯然神伤。

三十功名尘与土,八千里路云和月,或许正是这样。

一路荆棘密布,坎坷不堪,是进是退,此时的你究竟想闹哪样。

技术生涯是枯燥的、乏味的。

当别人搂着小三进入梦乡,而你还在冥思苦想。

远望着路边昏暗的灯光,倾听着青蛙与蛐蛐的鸣响。

你思索着,也许明天就会变得晴朗,蓝天白云,鸟语花香。

也许没有人懂得你的浪漫,你只会傻傻的说出一句程式搬的诗句,如果爱,所以爱。

如果她听懂了,那就好好珍惜吧。

不好意思,跑题了,最近思绪太多了,改天再为各位大侠写诗啊。

诗中提到,技术生涯是枯燥的、乏味的,一直以来,我都想让开发变得更加简单,让代码更加优雅。让你看到代码就像见到美女一样。

今天我提到的 Restful.Data ,是一个通用的数据持久层组件。

有的博友肯定会说干嘛老是重复造轮子呢,我想说,你的想法和当年米其林轮胎公司生产出全世界第一条全钢丝子午线轮胎时的想法一样。

对啊,我已经造出轮子了,你普利司通、韩泰、横滨、锦湖干嘛还造啊,都用我家生产的轮胎好了啊。

正是因为有了更多的企业重复制造的轮子,你才有了更多的选择,才让这个世界变得更加丰富多彩。

在.NET世界里,有很多持久层组件让我们选择:

  1. entity framework
  2. nherbinate
  3. ibatis.net
  4. castle
  5. ...

我无法评判它们孰胜孰劣,它们都是优秀的,这一点是值得肯定的。可是它们都不是我想要的。

有的过于复杂,有的过于庞大,有的需要大量的配置,有的让你难以轻松上手。

我希望我的工具就像一把尖刀,拿过来就能杀鬼子的,而它们至少还需要你在磨刀石上磨一下。

今天我所提到的 Restful.Data,也许就是你想要的。

首先,Restful.Data 对 ado.net 做了进一步的封装,提供了对数据库访问的基本操作:

#region ADO.NET 封装

        #region Transaction
/// <summary>
/// 开始一个事务
/// </summary>
/// <returns></returns>
DbTransaction BeginTransaction();
#endregion #region ExecuteScalar
/// <summary>
/// 执行 SQL 语句,返回一个单一对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <returns>单一对象</returns>
T ExecuteScalar<T>( string sql ); /// <summary>
/// 执行带参数的 SQL 语句,返回一个单一对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <param name="parameters">参数</param>
/// <returns>单一对象</returns>
T ExecuteScalar<T>( string sql, IDictionary<string,object> parameters );
#endregion #region ExecuteDataReader
/// <summary>
/// 执行 SQL 语句,返回一个 DataReader 对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <returns>DataReader 对象</returns>
DbDataReader ExecuteDataReader( string sql ); /// <summary>
/// 执行带参数 SQL 语句,返回一个 DataReader 对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <param name="parameters">参数</param>
/// <returns>DataReader 对象</returns>
DbDataReader ExecuteDataReader( string sql, IDictionary<string, object> parameters );
#endregion #region ExecuteDataTable
/// <summary>
/// 执行 SQL 语句,返回一个 DataTable 对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <returns>DataTable 对象</returns>
DataTable ExecuteDataTable( string sql ); /// <summary>
/// 执行带参数 SQL 语句,返回一个 DataTable 对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <param name="parameters">参数</param>
/// <returns>DataTable 对象</returns>
DataTable ExecuteDataTable( string sql, IDictionary<string,object> parameters );
#endregion #region ExecuteDataSet
/// <summary>
/// 执行 SQL 语句,返回一个 DataSet 对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <returns>DataSet 对象</returns>
DataSet ExecuteDataSet( string sql ); /// <summary>
/// 执行带参数 SQL 语句,返回一个 DataTable 对象
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <param name="parameters">参数值</param>
/// <returns>DataSet 对象</returns>
DataSet ExecuteDataSet( string sql, IDictionary<string, object> parameters );
#endregion #region ExecuteNonQuery
/// <summary>
/// 执行非查询 SQL 语句,返回受影响的行数
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <returns>受影响的行数</returns>
int ExecuteNonQuery( string sql ); /// <summary>
/// 执行带参数的非查询 SQL 语句,返回受影响的行数
/// </summary>
/// <param name="sql">SQL 语句</param>
/// <param name="values">参数值</param>
/// <returns>受影响的行数</returns>
int ExecuteNonQuery( string sql, IDictionary<string,object> parameters );
#endregion #endregion

  使用方法:

#region 使用Session
using( ISession session = SessionFactory.CreateDefaultSession() )
{
return session.ExecuteDataTable( "select * from T" );
}
#endregion #region 使用DbHelper
return DbHelper..ExecuteDataTable( "select * from T" );
#endregion

支持事务处理:

#region 事务处理
using( ISession session = SessionFactory.CreateDefaultSession() )
{
session.BeginTransaction(); session.ExecuteNonQuery( "insert into t value( '', '' )" );
session.ExecuteNonQuery( "update t set a = 1, b = 2 where c = 3" ); session.Commit();
}
#endregion

当执行过程中出现异常,事务自动回滚。  

在ORM方面,支持对单表的增删改查操作,对我来说这够用了。

先定义一个实体类:

#region 实体类
public class User : EntityObject<User>
{
/// <summary>
/// 构造方法
/// </summary>
public User()
: base()
{
} private long m_ID;
private string m_Account;
private string m_Password;
private bool m_IsActived; /// <summary>
///
/// </summary>
[Column( IsPrimaryKey = true, IsAutoIncrease = true )]
public long ID
{
get
{
return this.m_ID;
}
set
{
this.m_ID = value;
this.OnPropertyChanged( "ID", value );
}
} /// <summary>
///
/// </summary>
public string Account
{
get
{
return this.m_Account;
}
set
{
this.m_Account = value;
this.OnPropertyChanged( "Account", value );
}
} /// <summary>
///
/// </summary>
public string Password
{
get
{
return this.m_Password;
}
set
{
this.m_Password = value;
this.OnPropertyChanged( "Password", value );
}
} /// <summary>
///
/// </summary>
public bool IsActived
{
get
{
return this.m_IsActived;
}
set
{
this.m_IsActived = value;
this.OnPropertyChanged( "IsActived", value );
}
}
}
#endregion

实体类代码可通过工具自动生成,对于Column特性只需设置 IsPrimaryKey和IsAutoIncrease。

如何实现增删改:

#region 增删改
DbHelper.Insert<User>( user );
DbHelper.Update<User>( user ).Execute();
DbHelper.Update<User>( user ).Where( s => s.IsActive ).Execute();
DbHelper.Delete<User>( user ).Execute();
DbHelper.Delete<User>().Where( s => s.ID == 1 ).Execute();
#endregion

对于查询,集成了LINQ,但仅支持单表的查询:

#region 查询
var source = session.Find<User>()
.Where( s => !string.IsNullOrEmpty( s.Account ) )
.Where( s => s.Account.StartsWith( "xxx" ) )
.Where( s => s.IsActive )
.OrderBy( s => s.ID )
.Skip( 1 ).Take( 2 ); var target = source.ToList(); source = from s in session.Find<User>()
where s.Account.StartsWith( "xxx" )
orderby s.ID
select new { ID = s.ID, Account = s.Account }; target = source.ToList();
#endregion

使用前,你只需要简单的将Web.config或App.config中的connectionStrings节点中的providerName改成Restful.Data.MySql、Restful.Data.SQLServer、Restful.Data.Oracle等等,并在程序启动时调用

SessionProviderFactories.Register<T>()方法注册一下provider即可。

整个 Restful.Data 介绍完了,如果觉得不好请拍砖,并留下你宝贵的意见和建议,我将持续改进。

目前只实现了核心功能和MySql的provider,所以想找几个有为骚年一起完善,有兴趣者请加群 338570336

已是深夜,你是否已经酣然入睡,静静的等待那可恶的闹铃将你从春梦中吵醒,而我明天不用上班...

Restful.Data,现招募有为骚年,群号 338570336的更多相关文章

  1. Restful.Data 开源持久层组件项目最新进展和使用说明

    Restful.Data 经过 博客园 和 CSDN 的宣传,目前参与该项目的人数已达到 114 人(群号:338570336),虽大部分并不参与实际开发,但他们所提出的意见和建议以及在试用过程中发现 ...

  2. Restful.Data v1.0 - 轻量级数据持久层组件, 正式开源发布了

    经过几个星期的优化调整,今天 Restful.Data 正式开源发布. 源码地址:https://github.com/linli8/Restful 今天不写那么多废话了,还是重新介绍一下 Restf ...

  3. 使用Spring Data Redis操作Redis(集群版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  4. Restful.Data v2.0发布,谢谢你们的支持和鼓励

    v1.0发布后,承蒙各位博友们的热心关注,也给我不少意见和建议,在此我真诚的感谢 @冰麟轻武 等朋友,你们的支持和鼓励,是这个开源项目最大的推动力. v2.0在除了细枝末节外,在功能上主要做了一下更新 ...

  5. Automatically migrating data to new machines kafka集群扩充迁移topic

    The partition reassignment tool can be used to move some topics off of the current set of brokers to ...

  6. C#高级学习群欢迎你(群号 128874886)

    C#高级学习群,有着C# ,Asp.net ,Wpf等技术经验相当丰富的工程师,秉承着刘群主开源共享的精神,为新手和高手们提供了良好的学习交流平台,自创群以来,为群员解决了不少的技术难题,大大提高了学 ...

  7. IIS 无法安装URL重写模块的解决办法 UrlReWrite (.NET`SQL技术交流 群号206656202)

    下载和安装URL Rewrite IIS8默认是没有安装URL重写工具的,必须要自己下载安装. 如果IIS上默认有安装Web平台安装程序,我们可以使用平台自动安装URL Rewrite重写工具,打开I ...

  8. NetCore2.2使用Nlog自定义日志写入路径配置方式

    在一些特定场景的业务需求下,日志需要写入到不同的路径下提供日志分析.第一种:默认Nlog可以通过日志级别来区分路径,——优点是不需要额外配置,开箱即用——缺点是不够灵活,如果超过级别数量,则不满足需求 ...

  9. KingbaseES R6 集群修改data目录

    案例说明: 本案例是在部署完成KingbaseES R6集群后,由于业务的需求,集群需要修改data(数据存储)目录的测试.本案例分两种修改方式,第一种是离线修改data目录,即关闭整个集群后,修改数 ...

随机推荐

  1. curl详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...

  2. 實際案例: 已知要獲取臨時票証 (JsApi Ticket) 才能調用的接口

    需獲取票証才能調用的接口,簡單列示如下: 一.基礎類 1. wx.checkJsApi (當前客戶端是否支持指定JS) 二.分享類 1.wx.onMenuShareTimeline (分享到朋友圈)2 ...

  3. Futoshiki求解

    Futoshiki求解 Futoshiki是对于一个n的方阵,需要满足如下条件: ·每一行和每一列的元素都不能重复,即每一行和每一列1到n,n个数字都出现,且只出现一次. ·同一行或同一列中相邻两个元 ...

  4. Python list列表的排序

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建函数sort() 这个应该是我们使用最多的也是最简单的排序函 ...

  5. java-关于浏览器的判断

    一.判断是手机还是电脑浏览器 public final static String[] agent = { "Android", "iPhone", " ...

  6. css3之文本新属性

                                                     

  7. 面向对象程序设计 第二次作业<1>

    Github链接:https://github.com/zora02/object-oriented/tree/master/1001.A%2BB%20Format%20(20) 一.解题 题目 解题 ...

  8. Win10专业版激活永久可查激活信息

    Win10专业版激活永久步骤 ------在安装Win10专业版后,使用激活工具将系统激活到180天 这里附带在下屡试不爽的激活工具--百度云盘-- 链接:http://pan.baidu.com/s ...

  9. Coursera Robotics系列课心得

    Robotics Perception Professor Kostas and Jianbo Shi week 1: camera model 凸透镜成像原理:凸透镜焦点与焦距是固定的,这是物理性质 ...

  10. winfrom调用FastReport模板

    '存放模板的路径 If Dir(Application.StartupPath & "\ReportsFile\HB\01\IN.frx", FileAttribute.N ...