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

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. linux driver编译环境搭建和命令

    首先将ubuntu14.04的内核升级到内核3.18.12. 其次,Ubuntu14.04上驱动编译命令 $ sudo make -C ~/linux-3.18.12/ M=`pwd` modules ...

  2. $anchorScroll和$cache

    1.$achorScroll服务---用于描点跳转 $scope.change = function(id){ $location.hash(id); $anchorScroll(); }; 只要给l ...

  3. AngularJs自定义指令详解(10) - 执行次序

    代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...

  4. [15]APUE:pipe / FIFO

    管道 pipe 一.概述 管道(pipe / FIFO)是一种文件,属于 pipefs 文件系统类型,可以使用 read.write.close 等系统调用进行操作 其本质是内核维护了一块缓冲区与管道 ...

  5. OpenVPN 通过服务器上网

    在Windows环境中架设OpenVPN服务相对比较简单,网上这方面的教程也比较丰富,照葫芦画瓢即可.但是大部分教程都只讲了如何将client与Server通过VPN管道连接起来,使client可以正 ...

  6. Maven + Eclipse + Tomcat - 开启项目调试之旅(转)

    本文的读者需要拥有一些Maven基础知识和实践,如果没有,请直接绕过或者先看一些关于Maven教程,比如Juven翻译的<Maven权威指南>,google一下便知. 开门见山,首先抛出一 ...

  7. 大前端学习笔记整理【五】rem与px换算的计算方式

    前言 这段时间的小项目中算是真正意义上使用了rem来进行移动端的页面布局,项目结束了我反思了一下之前的对于rem的使用...原来我以前对rem用法完全是在搞笑啊!!结合这次这个小项目,我觉得我也有必要 ...

  8. 和以往印象不同的Java

    Java编程概述 一个Java源文件至多有一个public类,但是可以有很多class的定义 public static void main (String args[]) public 代表公共的, ...

  9. 闲来无事——第一弹 Java基础 基本数据类型

    一个优秀的Java类一定要去优质的名称,类的命名主要有字母和数字,并且必须以字母开头:虽然说没有明确规定类名首字母要大写,但是实际上如果出现首字母小写的类名,那就呵呵了,坐等挨骂吧!类名首字母大写是业 ...

  10. poj3728

    [描述] 有 N 城 市在一个国家,有一个且只有一个简单的路径每一对城市之间. 一个商人选择了一些路径和想赚尽可能多的钱在每个路径. 当他沿着一条路径,可以选择一个城市购买一些商品和出售他们在一个城市 ...