七天.NET 8操作SQLite入門到實戰 - 第五天引入SQLite-net ORM並封裝常用方法(SQLiteHelper)

前言

上一章節我們搭建好了EasySQLite的前後端框架,今天我們的主要任務是在後端框架中引入SQLite-net ORM並封裝常用方法(SQLiteHelper)。

七天.NET 8操作SQLite入門到實戰詳細教程

EasySQLite項目源碼地址

GitHub地址:https://github.com/YSGStudyHards/EasySQLite

SQLite-net介紹

簡單、強大、跨平臺的 SQLite 客戶端和 .NET 的 ORM。

SQLite-net提供了以下四個包:

PackageDescriptionPackage Address
sqlite-net-pcl .NET Standard 庫 https://www.nuget.org/packages/sqlite-net-pcl
sqlite-net-sqlcipher 支持加密 https://www.nuget.org/packages/sqlite-net-sqlcipher
sqlite-net-static 使用平臺提供的 sqlite3 的 P/Invokes 的特殊版本 https://www.nuget.org/packages/sqlite-net-static
sqlite-net-base 使用 SQLitePCLRaw 捆綁包,以便您可以選擇自己的提供程序 https://www.nuget.org/packages/sqlite-net-base

SQLite-net 設計目標

SQLite-net 被設計爲一個快速便捷的數據庫層。其設計遵循以下目標:

  • 非常容易與現有項目集成,並在所有 .NET 平臺上運行。
  • 對 SQLite 的薄包裝,快速高效。(這個庫不應該成爲查詢性能的瓶頸。)
  • 提供非常簡單的方法來安全執行 CRUD 操作和查詢(使用參數),以及以強類型方式檢索這些查詢結果。
  • 在不強制更改類的情況下與數據模型一起工作。(包含一個小型的反射驅動 ORM 層。)

安裝 sqlite-net-pcl  Nuget包

搜索sqlite-net-pcl,選擇最新穩定版本進行安裝:

SQLite同步和異步方法幫助類

SQLiteHelper

    /// <summary>
    /// SQLite同步方法幫助類
    /// 作者:追逐時光者
    /// 創建時間:2023年11月30日
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class SQLiteHelper<T> where T : new()
    {
        private readonly string _databasePath = Path.Combine(Environment.CurrentDirectory, "ClassManagement.db");
        private readonly SQLiteConnection _connection; // SQLite連接對象

        /// <summary>
        /// 構造函數
        /// </summary>
        public SQLiteHelper()
        {
            // 創建SQLite連接對象並打開連接
            _connection = new SQLiteConnection(_databasePath);
            _connection.CreateTable<T>(); // 如果表不存在,則創建該表[不會創建重複的表]
        }

        /// <summary>
        /// 數據插入
        /// </summary>
        /// <param name="item">要插入的數據項</param>
        /// <returns></returns>
        public int Insert(T item)
        {
            return _connection.Insert(item);
        }

        /// <summary>
        /// 數據刪除
        /// </summary>
        /// <param name="id">要刪除的數據的主鍵ID</param>
        /// <returns></returns>
        public int Delete(int id)
        {
            return _connection.Delete<T>(id);
        }

        /// <summary>
        /// 數據更新
        /// </summary>
        /// <param name="item">要更新的數據項</param>
        /// <returns></returns>
        public int Update(T item)
        {
            return _connection.Update(item);
        }

        /// <summary>
        /// 根據條件查詢記錄
        /// </summary>
        /// <param name="predExpr">查詢條件</param>
        /// <returns></returns>
        public List<T> Query(Expression<Func<T, bool>> predExpr)
        {
            return _connection.Table<T>().Where(predExpr).ToList();
        }

        /// <summary>
        /// 查詢所有數據
        /// </summary>
        /// <returns></returns>
        public List<T> QueryAll()
        {
            return _connection.Table<T>().ToList();
        }

        /// <summary>
        /// 根據條件查詢單條記錄
        /// </summary>
        /// <param name="predExpr">查詢條件</param>
        /// <returns></returns>
        public T QuerySingle(Expression<Func<T, bool>> predExpr)
        {
            return _connection.Table<T>().Where(predExpr).FirstOrDefault();
        }
    }

SQLiteAsyncHelper

    /// <summary>
    /// SQLite異步方法幫助類
    /// 作者:追逐時光者
    /// 創建時間:2023年11月30日
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class SQLiteAsyncHelper<T> where T : new()
    {
        private readonly string _databasePath = Path.Combine(Environment.CurrentDirectory, "ClassManagement.db");
        private readonly SQLiteAsyncConnection _connectionAsync; // SQLite連接對象

        /// <summary>
        /// 構造函數
        /// </summary>
        public SQLiteAsyncHelper()
        {
            // 創建SQLite連接對象並打開連接
            _connectionAsync = new SQLiteAsyncConnection(_databasePath);
            _connectionAsync.CreateTableAsync<T>(); // 如果表不存在,則創建該表[不會創建重複的表]
        }

        /// <summary>
        /// 數據插入
        /// </summary>
        /// <param name="item">要插入的數據項</param>
        /// <returns></returns>
        public async Task<int> InsertAsync(T item)
        {
            return await _connectionAsync.InsertAsync(item);
        }

        /// <summary>
        /// 數據刪除
        /// </summary>
        /// <param name="id">要刪除的數據的主鍵ID</param>
        /// <returns></returns>
        public async Task<int> DeleteAsync(int id)
        {
            return await _connectionAsync.DeleteAsync<T>(id);
        }

        /// <summary>
        /// 數據更新
        /// </summary>
        /// <param name="item">要更新的數據項</param>
        /// <returns></returns>
        public async Task<int> UpdateAsync(T item)
        {
            return await _connectionAsync.UpdateAsync(item);
        }

        /// <summary>
        /// 根據條件查詢記錄
        /// </summary>
        /// <param name="predExpr">查詢條件</param>
        /// <returns></returns>
        public async Task<List<T>> QueryAsync(Expression<Func<T, bool>> predExpr)
        {
            return await _connectionAsync.Table<T>().Where(predExpr).ToListAsync();
        }

        /// <summary>
        /// 查詢所有數據
        /// </summary>
        /// <returns></returns>
        public async Task<List<T>> QueryAllAsync()
        {
            return await _connectionAsync.Table<T>().ToListAsync();
        }

        /// <summary>
        /// 根據條件查詢單條記錄
        /// </summary>
        /// <param name="predExpr">查詢條件</param>
        /// <returns></returns>
        public async Task<T> QuerySingleAsync(Expression<Func<T, bool>> predExpr)
        {
            return await _connectionAsync.Table<T>().Where(predExpr).FirstOrDefaultAsync();
        }
    }

DotNetGuide技術社區交流羣

  • DotNetGuide技術社區是一個面向.NET開發者的開源技術社區,旨在爲開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、項目推薦、招聘資訊和解決問題的平臺。
  • 在這個社區中,開發者們可以分享自己的技術文章、項目經驗、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
  • 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺,爲廣大.NET開發者帶來更多的價值和成長機會。

歡迎加入DotNetGuide技術社區微信交流羣👪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章