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

本文地址:

作者博客:

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