1. 程式人生 > 其它 >使用開源框架Sqlsugar結合mysql開發一個小demo

使用開源框架Sqlsugar結合mysql開發一個小demo

使用開源框架Sqlsugar結合mysql開發一個小demo

https://cloud.tencent.com/developer/article/1601136

一、Sqlsugar簡介

1.效能上有很大優勢

sqlsugar是效能最好的ORM之一,具有超越Dapper的效能 ,走的是EMIT夠構中間語言動態編譯到程式集,完成高效能的實體繫結,達到原生水平。

2.功能非常強大

除了EF以外可以說的是功能最大的ORM框架

支援 DbFirst、CodeFirst、資料庫維護、鏈式查詢、鏈式更新、鏈式刪除、鏈式插入、實體屬性、複雜模型的查詢、ADO.NET。特別是批量等功能都是貨真價實的並非迴圈操作。

SqlSugar 4.0版本 6月底支援SqlSever的Core版 ,預計7月份支援多庫,8月分開始分散式ORM的開發。 (3.x版本已經支援了4種資料庫,相對穩定功能簡單)

3.語法簡單

完美的語法,可以秒殺現有所有ORM框架

詳細語法請看孫凱旋部落格園 http://www.codeisbug.com/Doc/8

二、主要介紹的是如何使用結合mysql資料庫使用Sqlsugar

1.新建解決方案,自定義解決方案名稱和儲存路徑

2.此時我們需要新增三個包,首先找到工具 =》NuGet包管理器 =>管理解決方案的NuGet程式包

3.依次新增以下三個程式包

Newtonsoft.Json:要注意最好新增較高版本的,否則會有相容性問題

Sqlsugar:這個版本要根據你的.Net Framework的版本選擇你合適的版本,這裡我用的是.Net Framework4.5所以我安裝的是sqlsugar5.0.0.8

MySql.Data

4.準備工作已經做完了,現在可以開始正文了

先貼一段程式碼,這個是我封裝的一個操作資料庫的一個類,我採用的是單例模式,不過有個弊端就是不能使用高併發的情況

public class DBContext<T> where T : class, new()
    {
        public SqlSugarClient Db;
        private static DBContext<T> mSingle = null;
        public static DBContext<T> GetInstance()
        {
            if (mSingle == null)
                mSingle = new DBContext<T>();
            return mSingle;
        }
        protected DBContext()
        {  //通過這個可以直接連線資料庫
            Db = new SqlSugarClient(new ConnectionConfig()
            {
                //可以在連線字串中設定連線池pooling=true;表示開啟連線池
                //eg:min pool size=2;max poll size=4;表示最小連線池為2,最大連線池是4;預設是100
                ConnectionString = "database='" + "BookShop" + "';Data Source = '" + "127.0.0.1" + "'; User Id = '" + "root" + "'; pwd='" + "1234" + "';charset='utf8';pooling=true",
                DbType = SqlSugar.DbType.MySql,//我這裡使用的是Mysql資料庫
                IsAutoCloseConnection = true,//自動關閉連線
                InitKeyType = InitKeyType.Attribute
            });
            //調式程式碼 用來列印SQL
            //Db.Aop.OnLogExecuting = (sql, pars) =>
            //{
            //    Console.WriteLine(sql + "\r\n" +
            //        Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
            //    Console.WriteLine();
            //};
        }
        public void Dispose()
        {
            if (Db != null)
            {
                Db.Dispose();
            }
        }
        public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }

        /// <summary>
        /// 獲取所有
        /// </summary>
        /// <returns></returns>
        public virtual List<T> GetList()
        {
            return CurrentDb.GetList();
        }

        /// <summary>
        /// 根據表示式查詢
        /// </summary>
        /// <returns></returns>
        public virtual List<T> GetList(Expression<Func<T, bool>> whereExpression)
        {
            return CurrentDb.GetList(whereExpression);
        }


        /// <summary>
        /// 根據表示式查詢分頁
        /// </summary>
        /// <returns></returns>
        public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel)
        {
            return CurrentDb.GetPageList(whereExpression, pageModel);
        }

        /// <summary>
        /// 根據表示式查詢分頁並排序
        /// </summary>
        /// <param name="whereExpression">it</param>
        /// <param name="pageModel"></param>
        /// <param name="orderByExpression">it=>it.id或者it=>new{it.id,it.name}</param>
        /// <param name="orderByType">OrderByType.Desc</param>
        /// <returns></returns>
        public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc)
        {
            return CurrentDb.GetPageList(whereExpression, pageModel, orderByExpression, orderByType);
        }


        /// <summary>
        /// 根據主鍵查詢
        /// </summary>
        /// <returns></returns>
        public virtual List<T> GetById(dynamic id)
        {
            return CurrentDb.GetById(id);
        }

        /// <summary>
        /// 根據主鍵刪除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Delete(dynamic id)
        {
            if (string.IsNullOrEmpty(id.ObjToString))
            {
                Console.WriteLine(string.Format("要刪除的主鍵id不能為空值!"));
            }
            return CurrentDb.Delete(id);
        }


        /// <summary>
        /// 根據實體刪除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Delete(T data)
        {
            if (data == null)
            {
                Console.WriteLine(string.Format("要刪除的實體物件不能為空值!"));
            }
            return CurrentDb.Delete(data);
        }

        /// <summary>
        /// 根據主鍵刪除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Delete(dynamic[] ids)
        {
            if (ids.Count() <= 0)
            {
                Console.WriteLine(string.Format("要刪除的主鍵ids不能為空值!"));
            }
            return CurrentDb.AsDeleteable().In(ids).ExecuteCommand() > 0;
        }

        /// <summary>
        /// 根據表示式刪除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Delete(Expression<Func<T, bool>> whereExpression)
        {
            return CurrentDb.Delete(whereExpression);
        }


        /// <summary>
        /// 根據實體更新,實體需要有主鍵
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Update(T obj)
        {
            if (obj == null)
            {
                Console.WriteLine(string.Format("要更新的實體不能為空,必須帶上主鍵!"));
            }
            return CurrentDb.Update(obj);
        }

        /// <summary>
        ///批量更新
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Update(List<T> objs)
        {
            if (objs.Count <= 0)
            {
                Console.WriteLine(string.Format("要批量更新的實體不能為空,必須帶上主鍵!"));
            }
            return CurrentDb.UpdateRange(objs);
        }

        /// <summary>
        /// 插入
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Insert(T obj
) { return CurrentDb.Insert(obj); } /// <summary> /// 批量 /// </summary> /// <param name="id"></param> /// <returns></returns> public virtual bool Insert(List<T> objs) { return CurrentDb.InsertRange(objs); } //可以擴充套件更多方法 }

5.還有就是需要有model類,就是跟資料庫中表對應的model類,比如我這裡是book和booktype,附加一段程式碼做個參考

    [SugarTable("Books")]//指定資料庫中的表名,要對應資料庫的表名,否則會出錯
    public class Books
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//指定主鍵和自動增長
        public int Id { get; set; }
        public int  BId { get; set; }
        public string BName { get; set; }
        public int TypeId { get; set; }
    }

6.開始操作資料庫了

           Books b = new Books() { BId = 2, BName = "西遊記", TypeId = 2 };
            BookType bt = new BookType() {  TId= 3, TName = "健康"};

            if (DBContext<Books>.GetInstance().CurrentDb.Insert(b))
            {
                Console.WriteLine("books_新增成功!");
            }
            if (DBContext<BookType>.GetInstance().Db.Insertable(bt).ExecuteCommand() > 0)
            {
                Console.WriteLine("BookType_新增成功!");
            }

其他操作資料庫的例子參考孫凱旋的部落格園吧,附連結 http://www.codeisbug.com/Doc/8/1123

例子到這裡就結束了,分享一下,我在做這個過程中遇到的問題:

1.因為我原本專案中已經存在程式包Newtonsoft.Json,而它的版本較低,當時忽略了版本問題,導致版本不相容問題。後面升級之後就可以了。

2.猶豫專案需要高併發處理資料,所以我上邊寫的單例模式其實存在一定的問題,所以做了一定的修改,程式碼貼一下

  public class DBContext<T> where T : class, new()
    {
        public SqlSugarClient Db;

        /// <summary>
        /// 修改後的程式碼
        /// </summary>
        /// <returns></returns>
        public static DBContext<T> OpDB()
        {
            DBContext<T> dbcontext_t = new DBContext<T>();
            dbcontext_t.Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "database='" + "bookshop" + "';Data Source = '" + "127.0.0.1" + "'; User Id = '" + "root" + "'; pwd='" + "1234" + "';charset='utf8';pooling=true",
                DbType = SqlSugar.DbType.MySql,
                IsAutoCloseConnection = true,
                InitKeyType = InitKeyType.Attribute
            });
            return dbcontext_t;
        }

        protected DBContext()
        {
            Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "database='" + "bookshop" + "';Data Source = '" + "127.0.0.1" + "'; User Id = '" + "root" + "'; pwd='" + "1234" + "';charset='utf8';pooling=true",
                DbType = SqlSugar.DbType.MySql,
                IsAutoCloseConnection = true,
                InitKeyType = InitKeyType.Attribute
            });
            //調式程式碼 用來列印SQL
            Db.Aop.OnLogExecuting = (sql, pars) =>
            {
                Console.WriteLine(sql + "\r\n" +
                    Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                Console.WriteLine();
            };
        }
        public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }



        //可以擴充套件更多方法 
    }

ok,該demo的分享就到這了,如果有什麼錯誤的地方歡迎指出,有不理解的也可以留言。