一个轻量级的基于 .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 = 18, SchoolId = "123" });
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 = 0; i < 1000; i++) { list.Add(new Student() { Id = $"{i}", Name = "zhangsan", Age = 18, SchoolId = "123" }); } 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 = 19 });
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 > 0);
Delete 方法表示删除操作。最终被解释为 SQL 语句:
DELETE FROM t_student WHERE age > 0;
var list = database.Query<Student>(x => x.Age == 19 && 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 == 19 && 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 == 19 && x.Id.Contains("test_query_page_list")).ToList(2, 10);
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 == 19 && x.Id.Contains("test_query_page_list")).AddCondition(x => x.Name == "zhangsan").ToList(2, 10);
AddCondition 方法可以对查询进行动态增加条件。
最终解释的 SQL 的 WHERE 部分会包含 AND name = 'zhangsan'
var database = new Database(Dialect.MySQL, connnectionString); database.Delete<Student>(x => x.Age >= 0); var list = new List<Student>(); for (var i = 0; i < 100000; i++) { list.Add(new Student() { Id = $"{i}", Name = "zhangsan", Age = 18, SchoolId = "123" }); } 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 >= 0); var list = new List<Student>(); for (var i = 0; i < 100000; i++) { list.Add(new Student() { Id = $"{i}", Name = "zhangsan", Age = 18, SchoolId = "123" }); } 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 >= 0); var list = new List<Student>(); for (var i = 0; i < 100000; i++) { list.Add(new Student() { Id = $"{i}", Name = "zhangsan", Age = 18, SchoolId = "123" }); } var stopwatch = new Stopwatch(); stopwatch.Start(); for (var i = 0; i < 100000; i++) { var student = database.Query<Student>(x => x.Age == 18 && x.Id.Equals($"{i}") && x.SchoolId.Equals("123")).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
作者博客:何旭
欢迎转载,请在明显位置给出出处及链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?