HTML5技术

分享自己的超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上 - 陌城心灵捕手

字号+ 作者:H5之家 来源:博客园 2016-07-29 14:00 我要评论( )

Deft简介 Deft是一个超轻量级高性能O/R mapping数据访问组件,简单易用,几分钟即可上手。 原文地址: Deft包含如下且不限于此的优点: 1、按照Transact-SQL的语法语义风格来设计,只要调用者熟悉基本的Transact-SQL语法即可瞬间无忧开码,大大降低了学习Deft

Deft简介

Deft是一个超轻量级高性能O/R mapping数据访问组件,简单易用,几分钟即可上手。
原文地址:

Deft包含如下且不限于此的优点:

1、按照Transact-SQL的语法语义风格来设计,只要调用者熟悉基本的Transact-SQL语法即可瞬间无忧开码,大大降低了学习Deft的成本,甚至零成本。
2、Deft表示性能方面真不是针对谁,包括纯手工代码。通过缓存+Emit反射IDataReader,极速获取List<T>。
3、强大的查询功能,支持使用Lambda表达式任意组装where条件,支持各种各样的运算符和括号优先级,支持给查询字段取别名。
4、支持SQLServer、MySQL、Oracle、SQLite等多数据库类型,同时也支持一个业务系统里面存在多个数据库。
5、支持事务、分页查询、排序等。
6、支持like,in等sql操作符,支持avg,count,max,min,sum等sql函数。
7、颜值高,支持Lambda 表达式,链式编程,任意组装sql,极度美观。
8、支持手写sql, List<T> Select<T>(string sql)。
9、各种映射能力,包括任意查询的结果映射,支持dynamic。
10、实体类非常简单,手写即可,不需要借助工具,也没有特性标记或者继承BaseEntity等杂七杂八的东西。
11、参数化赋值,防止sql注入。
12、开放DbHelper,满足特定使用场景(比如考勤报表),可以直接执行成百上千行的复杂sql。
13、对象化操作,编译时检查。使用Lambda 表达式做写入操作时,只会对表达式指定的字段做写入操作。
14、调用代码极其简单,干净清爽,可读性强,方便维护。
15、对外抛出OnDbExecute事件,调用方可自行处理日志埋点、sql监控等。
16、开发效率快,基本无配置,无工具支持也可以开发(例如 NHibernate 配置起来就比较繁琐)。
17、超轻量,Entity Framework 和 NHibernate 则臃肿不堪。
18、......等您来发现

为什么叫Deft?

 

Deft 核心类介绍

Deft共计有4个核心类
Jugg      用于对外提供ORM核心方法的静态类
JuggContext      用于对外提供ORM核心方法的实例类
JuggDbHelper    用于数据库访问的帮助类
JuggConfig    用于设置一些配置项的静态类

Jugg一词来源于游戏中的剑圣,是一个敏捷且攻击属性都很强的战斗英雄

 

Deft 3分钟即可上手使用

实体类

public class UserInfo { public Int32 Id { get; set; } public String Name { get; set; } public Byte? Age { get; set; } public Byte? Sex { get; set; } public String Email { get; set; } public String Address { get; set; } public String Remark { get; set; } public Object Test { get; set; } //无意义字段 }

 

.config文件中配置数据库连接信息

硬编码也可以配置数据库连接信息,遵守约定大于配置

JuggConfig.DefaultDbConCfg = , ConnectionString = };

 

强大灵活且易用的语法 

list = Jugg.Select<UserInfo>().Query(); //查询指定的几个字段 list = Jugg.Select<UserInfo>(x => x.Name).Query(); list = Jugg.Select<UserInfo>(x => new { x.Id, x.Name, x.Email }).Query(); //查询的时候,给字段取别名 list = Jugg.Select<UserInfo>(x => new { UserId = x.Id, UserName = x.Name, x.Email }).Query(); idParameter = 23; list = Jugg.Select<UserInfo>().Where(x => x.Id != idParameter).Query(); [] aryId = { 1, 2, 3 }; list = Jugg.Select<UserInfo>(). Where(x => x.Id != null && // where Id is not null (x.Age > 18 || x.Email == null) && // and ( Age>18 or Email is null ) x.Id.ToString().Contains() && // and Id like '%8%' aryId.Contains(x.Id) && // and Id in (1,2,3) x.Name.StartsWith() && // and Name like '张%' x.Remark.EndsWith() && // and Remark like '%test' x.Email.Contains() || // and Email like '%@qq.com%' x.Address != ). Query(); //排序 list = Jugg.Select<UserInfo>().Where(x => x.Id > 0).OrderBy(x => x.Id).Query(); list = Jugg.Select<UserInfo>(). Where(x => x.Id > 0). OrderByDesc(x => x.Id). Query(); //分页查询 list = Jugg.Select<UserInfo>(). Where(x => x.Id != null && (x.Age > 18 || x.Email == null)). GetPage(). //查询第1页,每页记录数读取JuggConfig.PageRecordCount配置的值 Query(); list = Jugg.Select<UserInfo>(). GetPage(5, 80). //查询第5页,每页80条记录 Query(); //查询某一个范围的记录 list = Jugg.Select<UserInfo>(). GetRange(337, 100). //查询第337~437条记录 Query(); //手写sql查询,支持dynamic映射 List<); list = Jugg.Select<UserInfo>(); listDynamic = Jugg.GetPage(); list = Jugg.GetPage<UserInfo>(); listDynamic = Jugg.GetRange(); list = Jugg.GetRange<UserInfo>(); u = Jugg.Find<UserInfo>(x => x.Id == 0); u = Jugg.Single<UserInfo>(x => x.Id == 239); b = Jugg.Exists<UserInfo>(x => x.Id == 105); uid = Jugg.Max<UserInfo>(x => x.Id).Query<int>(); //Min 函数返回一列中的最小值。null 值不包括在计算中。 uid = Jugg.Min<UserInfo>(x => x.Id).Where(x => x.Id > 1000).Query<int>(); age = Jugg.Avg<UserInfo>(x => x.Age).Query<int>(); //Sum 函数返回数值列的总数(总额)。 age = Jugg.Sum<UserInfo>(x => x.Age).Query<int>(); count = Jugg.Count<UserInfo>().Query<int>(); //Count(column_name) 函数返回指定列的值的数目(null 不计入)。 count = Jugg.Count<UserInfo>(x => x.Name).Query<int>(); id = Jugg.Insert(});//根据传入的对象来新增 id = Jugg.Insert<UserInfo>(x => , affectedRowsNum = Jugg.Delete(new UserInfo { Id = 668 });//根据传入对象的Id删除 affectedRowsNum = Jugg.Delete<UserInfo>().Where(x => x.Id == 23 && x.Name != null).Execute();//根据where条件删除 affectedRowsNum = Jugg.Delete<UserInfo>().Execute();//全表删除 affectedRowsNum = Jugg.Update(});//根据传入的对象来更新 affectedRowsNum = Jugg.Update<UserInfo>(x => ). Where(x => x.Id == 23).Execute();//根据Lambda 表达式,只更新指定的字段 (JuggContext context = new JuggContext()) { try { context.BeginTransaction(); id = context.Insert<UserInfo>(a => , , 22); ). Where(x => x.Id == id). Execute(); int r2 = context.Delete<UserInfo>(). Where(a => a.Id == id). Execute(); bool r3 = context.Exists<UserInfo>(x => x.Id == id); if (id > 0 && r1 == 1 && r2 == 1 && !r3) { context.Commit(); } else { context.Rollback(); } } catch { context.Rollback(); } }

 

其他可选的配置参数

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注 - QISHUANG

    调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加

    2017-04-18 10:02

  • DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架 - Frank.Cui

    DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的OR

    2017-03-18 14:07

  • 一个想法照进现实-《IT连》创业项目:三天的风投对接活动内幕分享 - 路过秋天

    一个想法照进现实-《IT连》创业项目:三天的风投对接活动内幕分享 -

    2017-03-14 18:05

  • 南京.NET技术行业落地分享交流会圆满成功 - 徐龙的博客

    南京.NET技术行业落地分享交流会圆满成功 - 徐龙的博客

    2017-03-13 09:00

网友点评