一个轻量级的基于 .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 毫秒
项目地址:
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
如果你对 .net 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。
本文地址:
作者博客:
欢迎转载,请在明显位置给出出处及链接
推荐阅读
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.3 自动生成实体类
-
Mbp,一个用于学习.net core的开发框架
-
一个基于Net Core3.0的WPF框架Hello World实例
-
分享一个基于Net Core 3.1开发的模块化的项目
-
一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx
-
一个轻量级的基于 .NET Core 的 ORM 框架 HSQL
-
.NET Core的响应式框架,基于Ace Admin框架菜单导航,Bootstrap布局,fontAwesome图标,内嵌Iframe用EasyUI做数据绑定,动态配置列表,动态配置表单
-
第一章 搭建一个通用的.net core项目框架
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.2 在框架的基础上利用SqlSugar快速实现CRUD实战篇
-
基于ASP.Net Core开发的一套通用后台框架