一个轻量级的基于 .NET Core 的 ORM 框架 HSQL
HSQL 是一种轻量级的基于 .NET Core 的数据库对象关系映射「ORM」框架

HSQL 是一种可以使用非常简单且高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事。目前支持的数据库有 MySql、SQLServer。
安装方法
Install-Package HSQL-standard
使用方法
性能
无索引、单机、单表、表数据为十万行
[Table("t_student")]
public class Student
{
[Column("id")]
public string Id { get; set; }
[Column("name")]
public string Name { get; set; }
[Column("age")]
public int Age { get; set; }
[Column("school_id")]
public string SchoolId { get; set; }
[Column("birthday")]
public long Birthday { get; set; }
}
Table 标记一个表对象。如:[Table("t_student")] 代表 Student 类将映射为数据库表 t_student
Column 标记一个列对象。如:[Column("id")] 代表 Id 属性将映射为数据库列 id
var connectionString = $"Server=127.0.0.1;Database=test;Uid=root;Pwd=123456;";
var database = new Database(Dialect.MySQL, connectionString);
connectionString 为数据库连接字符串。
Dialect.MySQL 表示访问数据库的类型为 MYSQL
var result = database.Insert<Student>(new Student()
{
Name = "zhangsan",
Age = ,
SchoolId = ""
});
Insert 方法可插入一个对象,表示对 t_student 表插入一条数据。
最后被解释为 SQL 语句 ->
INSERT INTO t_student(id,name,age,school_id,birthday) VALUES(@id,@name,@age,@school_id,@birthday);
var list = new List<Student>();
for (var i = ; i < ; i++)
{
list.Add(new Student()
{
Id = $"{i}",
Name = "zhangsan",
Age = ,
SchoolId = ""
});
}
var result = database.Insert<Student>(list);
Insert 方法可插入一个集合对象,表示对 t_student 表进行批量插入。
最后被解释为事务性批量插入的 SQL 语句,如
INSERT INTO t_student(id,name,age,school_id,birthday) VALUES(@id,@name,@age,@school_id,@birthday);
会进行多条语句事务操作。
var result = database.Update<Student>(x => x.Id.Contains("test_update_list"), new Student() { Age = });
Update 方法表示更新操作。如:
参数1:x => x.Id.Contains("test_update_list") 被解释为 WHERE id LIKE '%test_update_list%'
参数2:new Student() { Age = 19 } 被解释为 SET age = @age
最终SQL语句为:
UPDATE t_student SET age = @age WHERE id LIKE '%test_update_list%';
var result = database.Delete<Student>(x => x.Age > );
Delete 方法表示删除操作。最终被解释为 SQL 语句:
DELETE FROM t_student WHERE age > 0;
var list = database.Query<Student>(x => x.Age == && x.Id.Contains("test_query_list")).ToList();
Query => ToList 方法表示查询操作。最终被解释为 SQL 语句:
SELECT id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id LIKE '%test_query_list%';
var student = database.Query<Student>(x => x.Age == && x.Id.Equals("test_query_single")).FirstOrDefault();
Query => ToList 方法表示查询操作:
当 Dialect 为 MySQL 时 最终被解释为 SQL 语句:
SELECT id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id = 'test_query_single' LIMIT 0,1;
当 Dialect 为 SQLServer 时 最终被解释为 SQL 语句:
SELECT TOP 1 id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id = 'test_query_single';
var list = database.Query<Student>(x => x.Age == && x.Id.Contains("test_query_page_list")).ToList(, );
Query => ToList(2,10) 方法表示分页查询操作,pageIndex 为第几页,pageSize 为每页记录条数。
最终被解释为 SQL 语句:
SELECT id,name,age,school_id,birthday FROM t_student WHERE age = 19 AND id LIKE '%test_query_page_list%' LIMIT 10,10;
var list = database.Query<Student>(x => x.Age == && x.Id.Contains("test_query_page_list")).AddCondition(x => x.Name == "zhangsan").ToList(, );
AddCondition 方法可以对查询进行动态增加条件。
最终解释的 SQL 的 WHERE 部分会包含 AND name = 'zhangsan'
var database = new Database(Dialect.MySQL, connnectionString);
database.Delete<Student>(x => x.Age >= );
var list = new List<Student>();
for (var i = ; i < ; i++)
{
list.Add(new Student()
{
Id = $"{i}",
Name = "zhangsan",
Age = ,
SchoolId = ""
});
} var stopwatch = new Stopwatch();
stopwatch.Start();
list.ForEach(x =>
{
var result = database.Insert<Student>(x);
});
stopwatch.Stop();
var elapsedMilliseconds = $"插入十万条次共耗时:{stopwatch.ElapsedMilliseconds}毫秒";
第一次测试 -> 插入十万条次共耗时: 111038 毫秒,平均单次插入耗时: 1.11038 毫秒
第二次测试 -> 插入十万条次共耗时: 109037 毫秒,平均单次插入耗时: 1.09037 毫秒
var database = new Database(Dialect.MySQL, connnectionString);
database.Delete<Student>(x => x.Age >= );
var list = new List<Student>();
for (var i = ; i < ; i++)
{
list.Add(new Student()
{
Id = $"{i}",
Name = "zhangsan",
Age = ,
SchoolId = ""
});
} var stopwatch = new Stopwatch();
stopwatch.Start();
var result = database.Insert<Student>(list);
stopwatch.Stop();
var elapsedMilliseconds = $"插入十万次共耗时:{stopwatch.ElapsedMilliseconds}毫秒";
第一次测试 -> 插入十万次共耗时: 11177 毫秒,平均单次查询耗时: 0.11177 毫秒
第二次测试 -> 插入十万条次共耗时: 10776 毫秒,平均单次查询耗时: 0.10776 毫秒
var database = new Database(Dialect.MySQL, connnectionString);
database.Delete<Student>(x => x.Age >= );
var list = new List<Student>();
for (var i = ; i < ; i++)
{
list.Add(new Student()
{
Id = $"{i}",
Name = "zhangsan",
Age = ,
SchoolId = ""
});
} var stopwatch = new Stopwatch();
stopwatch.Start();
for (var i = ; i < ; i++)
{
var student = database.Query<Student>(x => x.Age == && x.Id.Equals($"{i}") && x.SchoolId.Equals("")).FirstOrDefault();
}
stopwatch.Stop();
var elapsedMilliseconds = $"查询十万次共耗时:{stopwatch.ElapsedMilliseconds}毫秒";
十万条数据时:
第一次测试 -> 查询十万条次共耗时: 877936 毫秒,平均单次查询耗时: 8.77936 毫秒
第二次测试 -> 查询十万条次共耗时: 874122 毫秒,平均单次查询耗时: 8.74122 毫秒
项目地址:https://github.com/hexu6788
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
如果你对 .NET 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。
本文地址:http://www.cnblogs.com/hexu6788/p/12435814.html
作者博客:何旭
欢迎转载,请在明显位置给出出处及链接
一个轻量级的基于 .NET Core 的 ORM 框架 HSQL的更多相关文章
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 基于.NET的微软ORM框架视频教程(Entity Framework技术)
基于.NET的微软ORM框架视频教程(Entity Framework技术) 第一讲 ORM映射 第二讲 初识EntifyFramework框架 第三讲 LINQ表达式查询 第四讲 LINQ方法查询 ...
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
- 一个轻量级的基于RateLimiter的分布式限流实现
上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只 ...
- 基于.NET CORE微服务框架 -Api网关服务管理
1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...
- 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...
- 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
随机推荐
- 共克时艰,停工不停学 Serverless 在线课堂免费开课
二月份,Serverless 团队联合腾讯云大学与云+社区免费推出 Serverless 在线直播课程,课程涵盖 Serverless 架构解密.技术解析以及不同应用场景下的最佳实战指导,让你从 0 ...
- as such 位于句首
- [LC] 1099. Two Sum Less Than K
Given an array A of integers and integer K, return the maximum S such that there exists i < j wit ...
- python学习笔记(5)数据类型-字典
字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...
- MS12-020 3389蓝屏攻击
MS12-020 3389蓝屏攻击 search ms12_020 use exploit/dos/windows/rdp/ms12_020_maxchannelids set rhost 192.1 ...
- Mr.Yu
在linux下搭建Git服务器 git服务器环境 服务器 CentOS7 + git(version 1.8.3.1)客户端 Windows10 + git(version 2.16.0.window ...
- pycharm全局搜索快捷键无反应
原因:和搜狗输入法的快捷键冲突
- open()操作文件
open()函数用来读取.写文件 参数解释: r:只读 w:只写,此时进行读,会报错 a:只追加 r+:可读可写 w+:可读可写 a+:可读可写 rb\rb+\wb\wb+\ab\ab+ 针对二进制文 ...
- Ionic3学习笔记(十五)自定义 tab icon
本文为原创文章,转载请标明出处 美工做了一套 icon,自然是要用的.将 icon copy 到 assets 文件夹下. 例如 .icon-ios-home-custom 为 iOS icon 选中 ...
- TCP/IP 协议栈初识
原文:深入浅出 TCP/IP 协议栈 0. 简介 TCP/IP 协议栈是网络通信中一系列网络协议的综合,是核心骨架.它定义了电子设备接入因特网.以及数据在它们之间的传输方式,是一份标准.TCP/IP ...