一個輕量級的基於 .NET Core 的 ORM 框架 HSQL

来源:https://www.cnblogs.com/hexu6788/archive/2020/03/07/12435814.html
-Advertisement-
Play Games

HSQL 是一種輕量級的基於 .NET Core 的資料庫對象關係映射「ORM」框架 HSQL 是一種可以使用非常簡單且高效的方式進行資料庫操作的一種框架,通過簡單的語法,使資料庫操作不再成為難事。目前支持的資料庫有 MySql、SQLServer。 安裝方法 Install-Package HSQ ...


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 毫秒

 

 

 

 項目地址:https://github.com/hexu6788

 

如果你覺得本篇文章對您有幫助的話,感謝您的【推薦】。

如果你對 .NET 有興趣的話可以關註我,我會定期的在博客分享我的學習心得。

本文地址:http://www.cnblogs.com/hexu6788/p/12435814.html

作者博客:何旭

歡迎轉載,請在明顯位置給出出處及鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 曾有邪教稱1999年12月31日是世界末日,當然該謠言已經不攻自破。 還有人稱今後的某個世紀末的12月31日,如果是星期一則會..…. 有趣的是,任何一個世紀末的年份的12月31日都不可能是星期一!!! 於是,“謠言製造商”又修改為星期日...... 1999年的12月31日是星期五,請問:未來哪一 ...
  • 前言 我們都知道redis是常駐在記憶體當中的,因此他的效率比MySQL要快很多很多。但又引發了另外一個問題,記憶體從本質上講,它是昂貴的,不能用於大量的長時間的存儲,他是“不安全不穩定的“,並且有可能存在記憶體泄露,不能與磁碟相比。 那麼如果解決這種問題呢?因此我們使用redis的時候,強制的應該給每個 ...
  • 一.前言 在講解 str / bytes /unicode區別之前首先要明白位元組和字元的區別,請參考:bytearray/bytes/string區別 中對位元組和字元有清晰的講解,最重要是明白: 字元str是給人看的,例如:文本保存的內容,用來操作的; 位元組bytes是給電腦看的,例如:二進位數據 ...
  • 一.目標 SpringBoot整合Mybatis對單表的增、刪、改、查操作 二.開發工具及項目環境 IDE: IntelliJ IDEA 2019.3 SQL: Navicat for MySQL 三.基礎環境配置 1. 創建資料庫: demodb 2. 創建數據表及插入數據 3. 必備Maven依 ...
  • 做Android手機系統或App測試的過程中, 如果碰到了bug,開發一般會需要測試人員提供當時的bug截圖, 如何用Python 批處理腳本, 快速實現截圖呢? 準備階段 1. adb shell screencap p /sdcard/a.png 命令, 可以實現手機截圖並保存到/sdcard/ ...
  • 基於 Redis 實現 CAS 操作 Intro 在 .NET 里併發情況下我們可以使用 來實現 CAS (Compare And Swap) 操作,在分散式的情景下很多時候我們都會使用 Redis ,最近在改之前做的一個微信小游戲項目,之前是單機運行的,有些數據存儲是基於記憶體的,直接基於對象操作的 ...
  • Main函數代碼 using System; namespace ConsoleApp4 { class Program { public static void Main(string[] args) { Console.WriteLine(args[0]); Console.WriteLine( ...
  • VS2019 for MAC已經發佈很長時間了,本以為項目移過去很麻煩,一直沒有動作,最近呆家裡快發黴了,決定研究研究,沒想到一句代碼都不需要動,直接完功,這下可以生產了。同學們可以放心整了。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...