欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一个轻量级的基于 .NET Core 的 ORM 框架 HSQL

程序员文章站 2022-05-28 14:44:32
HSQL 是一种轻量级的基于 .NET Core 的数据库对象关系映射「ORM」框架 HSQL 是一种可以使用非常简单且高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事。目前支持的数据库有 MySql、SQLServer。 安装方法 Install-Package HSQ ......

hsql 是一种轻量级的基于 .net core 的数据库对象关系映射「orm」框架

一个轻量级的基于 .NET Core 的 ORM 框架 HSQL

 

 

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 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

本文地址:

作者博客:

欢迎转载,请在明显位置给出出处及链接