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