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

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. 第五回. $e$ 的引入

    假如你有 $1$ 块钱, 存银行, 利率为 $100\%$, 那么一年后本息和为$$1+1=2.$$ 如果你换种存法, 存半年, 把本息和取出来, 再存半年, 那么一年后本息和为$$\left(1+\ ...

  2. keepalived高可用

    keepalived介绍 Keepalived是一个基于vrrp协议的高可用方案,vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务. 1. vrrp协议 VRRP是一种容错协议,它通过把几 ...

  3. 证书过期-->app审核提示90034证书错误

    1.证书过期问题,去钥匙串中删除过期证书,然后新下载一个证书,重新添加,注:一定要把所有过期证书全部删除,如果不显示则点击钥匙串-->显示过期证书 然后下载新证书:https://develop ...

  4. tomcat使用线程池配置高并发连接

    1:配置executor属性打开/conf/server.xml文件,在Connector之前配置一个线程池:[html] view plain copy<Executor name=" ...

  5. jQuery常用的插件及功能汇总-持续

    1.图片轮播 jquery.soChange.js 2.滚动展示 MSClass.js 3.md5加密 md5.js 4.cookie操作 cookie.js 5.

  6. Numpy 学习之路(1)——数组的创建

    数组是Numpy操作的主要对象,也是python数据分析的主要对象,本系列文章是本人在学习Numpy中的笔记. 文章中以下都基于以下方式的numpy导入: import numpy as np fro ...

  7. C#结构

    namespace STRUCT_TEST{ class Program { struct A { public int X;//不能直接对其进行赋值 public int Y; public sta ...

  8. 确定比赛名次---HDU1285(拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意: 给你每场比赛的成绩,让你根据成绩把排名弄出来 分析: 本来我是用普通方法写的,然后就一直wa, ...

  9. Win7 64位 VS2013环境编译Lua5.3.1

    主要参考这篇文章,原文有几个错误顺便改正了. 在Windows下使用Visual Studio编译Lua5.3 写本文时Lua官方网站放出的新版本为5.3.1,然后我不知道为啥,神奇的国内不能访问Lu ...

  10. MATLAB 画出三个通信小区cell边界示意图

    d=1000; %两个小区中心间距离的一半 rcell=2*d/sqrt(3); %小区半径 ncell=3; %小区个数 cellposition=zeros(ncell,2); %初始化小区中心位 ...