你必須知道的 SmartSql !

来源:https://www.cnblogs.com/Ahoo-Wang/archive/2019/04/24/SmartSql-README.html
-Advertisement-
Play Games

介紹 SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ...... 簡潔、高效、高性能、擴展性、監控、漸進式開發! 她是如何工作的? SmartSql 借鑒了 M ...


介紹

SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ......


簡潔、高效、高性能、擴展性、監控、漸進式開發!

她是如何工作的?

SmartSql 借鑒了 MyBatis 的思想,使用 XML 來管理 SQL ,並且提供了若幹個篩選器標簽來消除代碼層面的各種 if/else 的判斷分支。

SmartSql將管理你的 SQL ,並且通過篩選標簽來維護本來你在代碼層面的各種條件判斷,使你的代碼更加優美。

為什麼選擇 SmartSql ?

DotNet 體系下大都是 Linq 系的 ORM,Linq 很好,消除了開發人員對 SQL 的依賴。
但卻忽視了一點,SQL 本身並不複雜,而且在複雜查詢場景當中開發人員很難通過編寫Linq來生成良好性能的SQL,相信使用過EF的同學一定有這樣的體驗:“我想好了Sql怎麼寫,然後再來寫Linq,完了可能還要再查看一下Linq輸出的Sql是什麼樣的“。這是非常糟糕的體驗。要想對Sql做絕對的優化,那麼開發者必須對Sql有絕對的控制權。另外Sql本身很簡單,為何要增加一層翻譯器呢?

SmartSql 從正式開源已歷經倆年多的時間,在生產環境經過若幹個微服務驗證。
同時也有一部分企業正在使用 SmartSql (如果您也在使用 SmartSql 歡迎提交issue)Who is using SmartSql
目前已加入 NCC
未來(Roadmap-2019) SmartSql 也會持續加入一些新的特性來幫助開發者提升效率。歡迎提交 Issue https://github.com/dotnetcore/SmartSql/issues

那麼為什麼不是 Dapper,或者 DbHelper ?

Dapper 確實很好,並且又很好的性能,但是會讓給你的代碼裡邊充斥著 SQL 和各種判斷分支,這些將會使代碼維護難以閱讀和維護。另外 Dapper 只提供了DataReader 到 Entity 的反序列化功能。而 SmartSql 提供了大量的特性來提升開發者的效率。

特性概覽

SmartSql

動態倉儲

動態代理倉儲(SmartSql.DyRepository)組件是 SmartSql 非常獨特的功能,它能簡化 SmartSql 的使用。對業務代碼幾乎沒有侵入。可以說使用 ISqlMapper 是原始方法,而 DyRepository 自動幫你實現這些方法。

DyRepository 的表現是只需要定義倉儲介面,通過簡單配置就能自動實現這些介面並註冊到 IoC 容器中,使用時註入即刻獲取實現。原理是通過介面和介面方法的命名規則來獲取 SmartSql 的 xml 文件中的 Scope 和 SqlId ,用介面方法的參數作為 Request ,通過 xml 中的 sql 自動判斷是查詢還是執行操作,最後實現對 ISqlMapper 的調用。

0. 定義倉儲介面

    public interface IUserRepository : IRepository<User, long>
    {
    }

1. 註入依賴

            services.AddSmartSql()
                .AddRepositoryFromAssembly(options => { options.AssemblyString = "SmartSql.Starter.Repository"; });

2. 使用

    public class UserService
    {
        IUserRepository userRepository;

        public UserService(IActivityRepository userRepository)
        {
            this.userRepository = userRepository;
        }
    }

SmartSql 最佳實踐 -> SmartCode

SmartCode

通過 SmartCode 開發人員僅需配置好資料庫連接即可生成解決方案所需的一切,包括但不限於:

  • 解決方案工程
  • 幫你 restore 一下
  ReStore:
    Type: Process
    Parameters: 
      FileName: powershell
      WorkingDirectory: '{{Project.Output.Path}}'
      Args: dotnet restore
  • Docker
    • 構建 Docker 鏡像 & 運行實例
 BuildDocker:
    Type: Process
    Parameters:
      FileName: powershell
      WorkingDirectory: '{{Project.Output.Path}}'
      Args: docker build -t {{Project.Parameters.DockerImage}}:v1.0.0 .

  RunDocker:
    Type: Process
    Parameters:
      FileName: powershell
      WorkingDirectory: '{{Project.Output.Path}}'
      Args: docker run --name {{Project.Parameters.DockerImage}} --rm -d -p 8008:80 {{Project.Parameters.DockerImage}}:v1.0.0 .
  • 順便開啟個瀏覽器
  RunChrome:
    Type: Process
    Parameters:
      FileName: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      CreateNoWindow: false
      Args: http://localhost:8008/swagger

Docker

SmartCode
SmartCode
SmartCode
SmartCode

SmartCode 生成的目錄結構

SmartCode-directory-structure

讀寫分離

SmartSql 讀寫分離特別簡便,僅需提供好配置即可:

  <Database>
    <DbProvider Name="PostgreSql"/>
    <Write Name="WriteDB" ConnectionString="${Master}"/>
    <Read Name="ReadDb-1" ConnectionString="${Slave-0}" Weight="100"/>
    <Read Name="ReadDb-2" ConnectionString="${Slave-1}" Weight="100"/>
  </Database>

緩存

  • Lru 最近最少使用演算法
  • Fifo 先進先出演算法
  • RedisCacheProvider
  • 其他繼承自ICacheProvider緩存類型均可
<Caches>
    <Cache Id="LruCache" Type="Lru">
      <Property Name="CacheSize" Value="10"/>
      <FlushOnExecute Statement="AllPrimitive.Insert"/>
      <FlushInterval Hours="1" Minutes="0" Seconds="0"/>
    </Cache>
    <Cache Id="FifoCache" Type="Fifo">
      <Property Name="CacheSize" Value="10"/>
    </Cache>
    <Cache Id="RedisCache" Type="${RedisCacheProvider}">
      <Property Name="ConnectionString" Value="${Redis}" />
      <FlushInterval Seconds="60"/>
    </Cache>
  </Caches>
   <Statement Id="QueryByLruCache"  Cache="LruCache">
      SELECT Top 6 T.* From T_User T;
    </Statement>

類型處理器

SmartSql 內部實現了 DotNet 主要類型的類型處理器,並且提供了部分類型相容的類型轉換處理器,同時還提供了比較常用的 JsonTypeHanlder 。

    <TypeHandler PropertyType="SmartSql.Test.Entities.UserInfo,SmartSql.Test" Type="${JsonTypeHandler`}">
      <Properties>
        <Property Name="DateFormat" Value="yyyy-MM-dd mm:ss"/>
        <Property Name="NamingStrategy" Value="Camel"/>
      </Properties>
    </TypeHandler>

CUD 代碼生成

SmartSql 同時提供了 CUD 擴展函數幫助開發者生成好 CUD-SQL ,方便開發者直接使用,無需編寫任何配置。

public static TEntity GetById<TEntity, TPrimaryKey>(this ISqlMapper);
public static TPrimaryKey Insert<TEntity, TPrimaryKey>(this ISqlMapper sqlMapper, TEntity entity);
public static int DyUpdate<TEntity>(this ISqlMapper sqlMapper, object entity);
public static int Update<TEntity>(this ISqlMapper sqlMapper, TEntity entity);
public static int DeleteById<TEntity, TPrimaryKey>(this ISqlMapper sqlMapper, TPrimaryKey id);
public static int DeleteMany<TEntity, TPrimaryKey>(this ISqlMapper sqlMapper, IEnumerable<TPrimaryKey> ids);

Id 生成器

SnowflakeId

<IdGenerators>
    <IdGenerator Name="SnowflakeId" Type="SnowflakeId">
      <Properties>
        <Property Name="WorkerIdBits" Value="10"/>
        <Property Name="WorkerId" Value="888"/>
        <Property Name="Sequence" Value="1"/>
      </Properties>
    </IdGenerator>
</IdGenerators>
    <Statement Id="Insert">
      <IdGenerator Name="SnowflakeId" Id="Id"/>
      INSERT INTO T_UseIdGenEntity
      (
      Id,
      Name
      )
      VALUES
      (
      @Id,
      @Name
      );
      Select @Id;
    </Statement>
var id = SqlMapper.ExecuteScalar<long>(new RequestContext
            {
                Scope = nameof(UseIdGenEntity),
                SqlId = "Insert",
                Request = new UseIdGenEntity()
                {
                    Name = "SmartSql"
                }
            });

DbSequence

<IdGenerators>
    <IdGenerator Name="DbSequence" Type="DbSequence">
      <Properties>
        <Property Name="Step" Value="10"/>
        <Property Name="SequenceSql" Value="Select Next Value For IdSequence;"/>
      </Properties>
    </IdGenerator>
</IdGenerators>
    <Statement Id="InsertByDbSequence">
      <IdGenerator Name="DbSequence" Id="Id"/>
      INSERT INTO T_UseIdGenEntity
      (
      Id,
      Name
      )
      VALUES
      (
      @Id,
      @Name
      );
      Select @Id;
    </Statement>
            var id = SqlMapper.ExecuteScalar<long>(new RequestContext
            {
                Scope = nameof(UseIdGenEntity),
                SqlId = "InsertByDbSequence",
                Request = new UseIdGenEntity()
                {
                    Name = "SmartSql"
                }
            });

AOP 事務

        [Transaction]
        public virtual long AddWithTran(User user)
        {
            return _userRepository.Insert(user);
        }

事務嵌套

當出現事務嵌套時,子函數的事務特性註解將不再開啟,轉而使用上級調用函數的事務

        [Transaction]
        public virtual long AddWithTranWrap(User user)
        {
            return AddWithTran(user);
        }

BulkInsert

using (var dbSession= SqlMapper.SessionStore.Open())
            {
                var data = SqlMapper.GetDataTable(new RequestContext
                {
                    Scope = nameof(AllPrimitive),
                    SqlId = "Query",
                    Request = new { Taken = 100 }
                });
                data.TableName = "T_AllPrimitive";
                IBulkInsert bulkInsert = new BulkInsert(dbSession);
                bulkInsert.Table = data;
                bulkInsert.Insert();
            }

Skywalking 監控

SmartSql 目前支持 Skywalking 監控,通過安裝 SkyAPM-dotnet 代理來啟用。以下是部分截圖。

監控執行命令

Query

查看是否緩存,以及返回的記錄數

Query-Detail

查看執行的SQL語句

Query-Statement

事務

Transaction

異常

Error

異常堆棧跟蹤

Error-Detail

示例項目

SmartSql.Sample.AspNetCore

技術交流

點擊鏈接加入QQ群【SmartSql 官方交流群】:604762592

瞭解更多,請移步官方文檔

https://smartsql.net/


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

-Advertisement-
Play Games
更多相關文章
  • 本文介紹如何處理多個用戶併發更新同一實體(同時)時出現的衝突 。 主要是兩種:一種,檢查屬性併發衝突,使用 [ConcurrencyCheck] ;另一種,檢測行的併發衝突,使用 rowversion 跟蹤屬性,如果在保存之前有修改,就報錯 發生併發衝突的情況: 1.用戶導航到實體編輯頁面; 2.第 ...
  • ASP.NET Core 有內置的log組件,遺憾的是看了微軟官方文檔,貌似無法直接將日誌存於文件或資料庫,只能由自己實現或引用第三方日誌組件。 以下為Nlog和log4net的使用記錄 Nlog使用 搜索添加Nuget包 搜索添加Nuget包 新建一個xml文件,並改名為nlog.config 新 ...
  • C 開發輔助類庫,和士官長一樣身經百戰且越戰越勇的戰爭機器,能力無人能出其右。 GitHub: "MasterChief" 歡迎Star,歡迎Issues; 項目架構思維導圖: 目錄 ================= "1\. 資料庫訪問" "2\. 日誌" "3\. 緩存" "4\. 配置" " ...
  • 今天我們先來聊聊有關線程的話題...... 一. 線程概述 1. 簡單區分程式、進程和線程 程式是指一段靜態的代碼 進程是指正在執行的程式,將靜態的代碼運行起來 線程是指正在執行程式的小單元 舉個慄子,班級準備大掃除,在大掃除之前,老師在紙上列了一個清單,每個同學都有不同的工作任務,分配好任務之後, ...
  • getLoginQRCode (獲取登錄二維碼)CheckLoginQRCode(檢測掃碼狀態)ManualAuth(掃碼登錄)ManualAuth(62數據登錄)ManualAuth(賬號密碼登錄)newverifypasswd(驗證密碼)GetQRCode(獲取個人或群二維碼)F2FQrcode ...
  • 1.UI/Default代碼研究首先,我想到的是,既然是對圖集紋理進行採樣,而且又不能統一更改材質的紋理UV值,我們通常寫的shader都是直接根據模型UV值對主紋理進行採樣,那會不會是shader中對MainTexture進行了什麼神奇的處理,讓圖片採樣只根據指定的UV值進行採樣呢?我去官網下載了 ...
  • 要使用Dictionary集合,需要導入C#泛型命名空間 System.Collections.Generic(程式集:mscorlib) 要使用Dictionary集合,需要導入C#泛型命名空間 System.Collections.Generic(程式集:mscorlib) Dictionary ...
  • 註意:首先引入dll文件ICSharpCode.SharpZipLib.dll 壓縮文件 文件下載 具體使用 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...