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

HSQL是一种轻量级的基于.NET Core的数据库对象关系映射「ORM」框架

HSQL是一种可以使用非常简单且高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事。目前支持的数据库有 MySql、SQLServer。

安装方法

Install-Package HSQL-standard

使用方法

  • 创建映射模型

  • 创建数据库操作实例

  • 进行数据库操作

  1. 新增

  2. 批量新增

  3. 修改

  4. 删除

  5. 查询

  6. 单实例查询

  7. 分页查询

  8. 灵活条件查询

性能

无索引、单机、单表、表数据为十万行

  • 单实例插入十万次

  • 批量插入十万次

  • 查询单实例十万次

创建映射模型

[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

发表回复

相关推荐

下肢静脉血栓的症状及预防

下肢深静脉血栓对于大家来说可能比较陌生,但这个病如果不能及时治疗后果是非常严重的,严重时会导致持续疼痛和食欲不振甚至 ...

· 9秒前

寶寶感冒拖一拖,竟變心肌炎?

與流感和感冒一起上“熱搜”的,還有一詞叫“心肌炎”。隻要和“心”掛上勾的疾病,一般都不會簡單。特別是最為兇險的暴發性心肌炎—...

· 20秒前

经典《三国演义》连环画,集结三十多位大师,这线条笔触绝了,谁画的最精彩

作为四大名著之一的《三国演义》,是无数艺术家创作的源泉,这段磅礴的历史和精彩绝伦的小说,在画家们笔下,呈现出了多种多 ...

· 30秒前

在香港半山電梯,尋找王傢衛的身影

從位於士丹利街的陸羽茶室出來,我們沿街一路向前,走到底便是通向半山的扶梯。在高樓林立的香港,扶梯並不起眼,透著些許歲...

· 42秒前

人生的希望到底在哪裡?

問:我今天早晨一覺醒來,有一種人生無望的感覺。然後,我上“知乎”查瞭一下,發現很多人都有過這種感覺,請問法師這是為什麼...

· 51秒前