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的更多相关文章

  1. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  2. 基于.NET的微软ORM框架视频教程(Entity Framework技术)

    基于.NET的微软ORM框架视频教程(Entity Framework技术) 第一讲  ORM映射 第二讲 初识EntifyFramework框架 第三讲 LINQ表达式查询 第四讲 LINQ方法查询 ...

  3. 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

    0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...

  4. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...

  5. 一个轻量级的基于RateLimiter的分布式限流实现

    上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只 ...

  6. 基于.NET CORE微服务框架 -Api网关服务管理

    1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...

  7. 基于.NET CORE微服务框架 -谈谈surging的服务容错降级

    一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...

  8. 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

    1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...

  9. 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

随机推荐

  1. 共克时艰,停工不停学 Serverless 在线课堂免费开课

    二月份,Serverless 团队联合腾讯云大学与云+社区免费推出 Serverless 在线直播课程,课程涵盖 Serverless 架构解密.技术解析以及不同应用场景下的最佳实战指导,让你从 0 ...

  2. as such 位于句首

  3. [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 ...

  4. python学习笔记(5)数据类型-字典

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...

  5. MS12-020 3389蓝屏攻击

    MS12-020 3389蓝屏攻击 search ms12_020 use exploit/dos/windows/rdp/ms12_020_maxchannelids set rhost 192.1 ...

  6. Mr.Yu

    在linux下搭建Git服务器 git服务器环境 服务器 CentOS7 + git(version 1.8.3.1)客户端 Windows10 + git(version 2.16.0.window ...

  7. pycharm全局搜索快捷键无反应

    原因:和搜狗输入法的快捷键冲突

  8. open()操作文件

    open()函数用来读取.写文件 参数解释: r:只读 w:只写,此时进行读,会报错 a:只追加 r+:可读可写 w+:可读可写 a+:可读可写 rb\rb+\wb\wb+\ab\ab+ 针对二进制文 ...

  9. Ionic3学习笔记(十五)自定义 tab icon

    本文为原创文章,转载请标明出处 美工做了一套 icon,自然是要用的.将 icon copy 到 assets 文件夹下. 例如 .icon-ios-home-custom 为 iOS icon 选中 ...

  10. TCP/IP 协议栈初识

    原文:深入浅出 TCP/IP 协议栈 0. 简介 TCP/IP 协议栈是网络通信中一系列网络协议的综合,是核心骨架.它定义了电子设备接入因特网.以及数据在它们之间的传输方式,是一份标准.TCP/IP ...