Restful.Data,现招募有为骚年,群号 338570336
光阴似箭,日月如梭,套用小学作文惯用的一句开场白来开始重新开始我的博客园生涯吧。
8年的风霜雪雨,不断的击打着我内心的哀伤,可我依旧坚挺的屹立在这里,是因为技术是我一直坚持的梦想。
追寻着先辈和高人的脚步,多希望能见见他们的模样,仰望着他们高高在上,心中不禁黯然神伤。
三十功名尘与土,八千里路云和月,或许正是这样。
一路荆棘密布,坎坷不堪,是进是退,此时的你究竟想闹哪样。
技术生涯是枯燥的、乏味的。
当别人搂着小三进入梦乡,而你还在冥思苦想。
远望着路边昏暗的灯光,倾听着青蛙与蛐蛐的鸣响。
你思索着,也许明天就会变得晴朗,蓝天白云,鸟语花香。
也许没有人懂得你的浪漫,你只会傻傻的说出一句程式搬的诗句,如果爱,所以爱。
如果她听懂了,那就好好珍惜吧。
不好意思,跑题了,最近思绪太多了,改天再为各位大侠写诗啊。
诗中提到,技术生涯是枯燥的、乏味的,一直以来,我都想让开发变得更加简单,让代码更加优雅。让你看到代码就像见到美女一样。
今天我提到的 Restful.Data ,是一个通用的数据持久层组件。
有的博友肯定会说干嘛老是重复造轮子呢,我想说,你的想法和当年米其林轮胎公司生产出全世界第一条全钢丝子午线轮胎时的想法一样。
对啊,我已经造出轮子了,你普利司通、韩泰、横滨、锦湖干嘛还造啊,都用我家生产的轮胎好了啊。
正是因为有了更多的企业重复制造的轮子,你才有了更多的选择,才让这个世界变得更加丰富多彩。
在.NET世界里,有很多持久层组件让我们选择:
- entity framework
- nherbinate
- ibatis.net
- castle
- ...
我无法评判它们孰胜孰劣,它们都是优秀的,这一点是值得肯定的。可是它们都不是我想要的。
有的过于复杂,有的过于庞大,有的需要大量的配置,有的让你难以轻松上手。
我希望我的工具就像一把尖刀,拿过来就能杀鬼子的,而它们至少还需要你在磨刀石上磨一下。
今天我所提到的 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的更多相关文章
- Restful.Data 开源持久层组件项目最新进展和使用说明
Restful.Data 经过 博客园 和 CSDN 的宣传,目前参与该项目的人数已达到 114 人(群号:338570336),虽大部分并不参与实际开发,但他们所提出的意见和建议以及在试用过程中发现 ...
- Restful.Data v1.0 - 轻量级数据持久层组件, 正式开源发布了
经过几个星期的优化调整,今天 Restful.Data 正式开源发布. 源码地址:https://github.com/linli8/Restful 今天不写那么多废话了,还是重新介绍一下 Restf ...
- 使用Spring Data Redis操作Redis(集群版)
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...
- Restful.Data v2.0发布,谢谢你们的支持和鼓励
v1.0发布后,承蒙各位博友们的热心关注,也给我不少意见和建议,在此我真诚的感谢 @冰麟轻武 等朋友,你们的支持和鼓励,是这个开源项目最大的推动力. v2.0在除了细枝末节外,在功能上主要做了一下更新 ...
- 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 ...
- C#高级学习群欢迎你(群号 128874886)
C#高级学习群,有着C# ,Asp.net ,Wpf等技术经验相当丰富的工程师,秉承着刘群主开源共享的精神,为新手和高手们提供了良好的学习交流平台,自创群以来,为群员解决了不少的技术难题,大大提高了学 ...
- IIS 无法安装URL重写模块的解决办法 UrlReWrite (.NET`SQL技术交流 群号206656202)
下载和安装URL Rewrite IIS8默认是没有安装URL重写工具的,必须要自己下载安装. 如果IIS上默认有安装Web平台安装程序,我们可以使用平台自动安装URL Rewrite重写工具,打开I ...
- NetCore2.2使用Nlog自定义日志写入路径配置方式
在一些特定场景的业务需求下,日志需要写入到不同的路径下提供日志分析.第一种:默认Nlog可以通过日志级别来区分路径,——优点是不需要额外配置,开箱即用——缺点是不够灵活,如果超过级别数量,则不满足需求 ...
- KingbaseES R6 集群修改data目录
案例说明: 本案例是在部署完成KingbaseES R6集群后,由于业务的需求,集群需要修改data(数据存储)目录的测试.本案例分两种修改方式,第一种是离线修改data目录,即关闭整个集群后,修改数 ...
随机推荐
- MVC 之 WebAPI 系列二
今天,我想在此记录下 WebApi 跨域调用 1. 什么叫跨域: 跨域问题简单理解就是JavaScript同源策略的限制,其根本原因是因为浏览器对于这种请求,所给予的权限是较低的,通常只允许调用本域中 ...
- C++中下标操作注意事项
C++中,下标操作不添加元素,对于任何使用下标操作的情况,如string类型.vector类型等等,必须是已存在的元素才能用下标操作符进行索引.如果类型为空,通过 下标操作进行赋值时,不会添加任何元素 ...
- ADV-时间分配
#include<stdio.h> int map[20][4]; typedef struct node{ int star; int end; }node; node dui[100] ...
- iazq更新网址
[版本:1.1] [介绍:哈哈(ಡωಡ)hiahiahia 新版软件试试去和哥哥刚放学噢噢噢天然呆翡翠城] [链接:http://info.3g.qq.com/g/s?aid=index&g_ ...
- sublime配置coffeeScript
node.js 全局模块所在目录 npm -g ls 1.安装 npm install -g coffee-script 2.sublime安装CoffeeScript sublime语法高亮插件 ...
- MSMQ(Microsoft Message Queue)
http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...
- 禁止VMware虚拟机与Host的时间同步
禁止VMware虚拟机与Host的时间同步 1. 查看虚拟机是否安装了 VMware Tools, 如果有安装,则将 VMware Tools 属性窗口的“选项”-->“其他选项”中“虚拟机与宿 ...
- 浅入了解GCD 并发 并行 同步 异步 多线程
什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurre ...
- 使用django-admin.py 时出错
我在安装好django后,运行django-admin.py 时出现两处错误: 一.当你在dos命令下输入django-admin.py 时不会运行,而是以记事本的方式打开了. 解决办法:找到你的dj ...
- MyBatis Generator 详解 【转来纯为备忘】
版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com 目录(?)[+] MyBatis Generator中文文档 运行MyBatis Generator X ...