1. 程式人生 > >【Zara原創】SqlSugar4輕量級ORM框架的使用指南

【Zara原創】SqlSugar4輕量級ORM框架的使用指南

前言:sqlSugar出生已經有3年之久了,從1.0到現在的4.x的版本,為了以後方便使用SqlSugar,所以特意花了2個小時來敘述它。

關於SqlSugar

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

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

相容性:支援多種資料庫,具體就是SqlSugar的DbType列舉中有MySql、Oracle、SqlLite、SqlServer、PostgreSQL

 入門使用

以下程式碼是建立連線,其中屬性構造器的四個值分別為連線字串、資料庫型別、是否自動銷燬連線、獲取自增列主鍵資訊。

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "Data Source=DESKTOP-OEJGKOO;Initial Catalog=TextInfo;Integrated Security=True",
                DbType = SqlSugar.DbType.SqlServer,
                IsAutoCloseConnection = true,
                InitKeyType = InitKeyType.Attribute
            });

那我們做一個查詢系列吧,資料庫還是依舊的Users,實體類應和資料的結構一樣,在此其中呢,你也可以指定一些特性,這樣是有很大的好處的。

  public class Users
    {
        public int UserID { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
    }

最基本的查詢:

var list = db.Queryable<Users>().ToList();//查詢所有

這個Queryable就是SqlSugar4的內建方法,我寫入的泛型引數必須和資料庫一樣嗎,那我的實體類應該怎麼辦,我如何在asp.net mvc中,我的model這樣也一定會出現諸多的問題,那其實問題很簡單,在實體中寫上特性即可。

[SugarTable("Users")]
    public class Users
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int UserID { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
    }

這樣問題也就隨之解決了,關於UserID這個主鍵列,資料庫中也要設定主鍵和自增列才會有效,那我們再寫一些條件查詢、按主鍵查詢、分頁查詢,以下程式碼呢根據主鍵查詢,你的model層必須指定才可以,反則是無效的。

var objById = db.Queryable<Users>().InSingle(1);//根據主鍵查詢
var getObjByWhere = db.Queryable<Users>().Where(u => u.UserID == 1);//根據條件查詢
var total = 0;
var getPage = db.Queryable<Users>().Where(it => it.UserName == "zaranet").ToPageList(1, 2, ref total);

查詢我們基本上都說完了,你們心裡一定在想,CRUD的操作,還有3呢,哦?,那其實很簡單的,比查詢so easy的多。

Users users = new Users() {  UserName = "student hard",   Email="[email protected]",  Address="美國洛杉磯" };
int result = db.Insertable(users).ExecuteCommand();//insert
var user2 = new Users(){ UserID = 12, UserName = "厲害了我的ge" };
int result2 = db.Insertable(users).ExecuteCommand();//update                                     
int result3 = db.Deleteable<Users>(1).ExecuteCommand();//bey key del obj

使用SimpleClient優化你的程式碼

我們之前已經學會用SimpleClient了,但是我們發現我們的查詢每次都要通過db.Querytable去搞一些事情,非常的繁瑣。我們可以去封裝以下Client,建立DbContext;Db.Aop.OnLogExecuting是Sugar給我們提供檢視sql的介面;其下圖是生成的sql。

DbContext的定義:

    public class DbContext
    {
        public DbContext()
        {
            Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "Data Source=DESKTOP-OEJGKOO;Initial Catalog=TextInfo;Integrated Security=True",
                DbType = SqlSugar.DbType.SqlServer,
                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 SqlSugarClient Db;
        public SimpleClient<Users> UsersDb {
            get { return new SimpleClient<Users>(Db); } 
    } } 

使用DbContext玩轉CRUD

其中需要注意的是使用SqlSugar的部分功能的時候,一定要引用newtonSoft.json.dll 9.0.1及以上版本,否則會出現一些錯誤,比如:

 關於使用SqlSugar的查詢有很多方法,根據主鍵啊,where啊,getsingle啊,你回頭自己再看看,我這裡就不一一列舉了。

使用DbContext要在類中去繼承自DbContext,這樣你的類都是DbContext派生類了,下面程式碼中,通過一個簡單的條件還有一個列舉型別,做了一個最基本的分頁查詢,那我們如果是多條件呢,難道還要 && 條件嗎?

public class UsersService : DbContext
    {
        public void SearchDemo()
        {
            var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分頁查詢
            //分頁+排序
            var data = UsersDb.GetPageList(u => u.UserName == "zaraNet", p, u => u.UserName, OrderByType.Asc);
            Console.WriteLine(p.PageCount);
        }
    }

我們可以通過IConditionalModel這個類來組合條件,以方便我們的查詢,其程式碼所示:

var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分頁查詢
List<IConditionalModel> conModels = new List<IConditionalModel>();
            conModels.Add(new ConditionalModel()
            {
                FieldName = "id",
                ConditionalType = ConditionalType.Equal,
                FieldValue = "1"
            });
var data = UsersDb.GetPageList(conModels,p,it => it.UserName,OrderByType.Desc);

 噢!,其實這樣是比較方便了,但是後期維護也是很累的,你看著吧,你想怎麼用就怎麼用,我們在說一說增刪改吧,查我們已經說的差不多了。

首先說一下新增,也是非常簡單,直接new物件呼叫Insert就好,但有一個值得提的是,SqlSugar給我們提供了陣列系列,也就是說我們不用迴圈操作了,其示例程式碼如下:

var p = new PageModel() { PageIndex = 1, PageSize = 2 };// 分頁查詢
var user = new Users() { UserName = "zara1", Email = "sad", Address = "asd" };
var user2 = new Users() { UserName = "zaranet", Email = "asd", Address = "zxc" };
UsersDb.Insert(user);//插入
UsersDb.InsertRange(new Users[] {user,user2});

下面是SqlSugar生成的Sql,不難發現插入陣列的sql非常的犀利,採用的是insert select 語法。

INSERT INTO [Users]
([UserName],[Email],[Address])
VALUES
(@UserName,@Email,@Address) ;
{"@UserName":"zara1","@Email":"sad","@Address":"asd"}

INSERT [Users] ([UserName],[Email],[Address])
SELECT N'zara1' AS [UserName],N'sad' AS [Email],N'asd' AS [Address]
UNION ALL
SELECT N'zaranet' AS [UserName],N'asd' AS [Email],N'zxc' AS [Address]

 在說一說更新和刪除吧,當然他們同樣有著range系列的操作,其程式碼所示:

View Code

 SqlSugar的事務簡單使用,我通常都是這麼用的,通過這種方式是免去 db.CommitTran();這種囉嗦且邋遢程式碼。

 var result = Db.Ado.UseTran(() =>
            {
                var obj = UsersDb.GetById(0);
                obj.UserName = "事務demo";
                UsersDb.Update(obj);
            });
            if (result.IsSuccess)
            {
                Console.WriteLine("事務提交了");
                //成功
            }
            else
            {
                Console.WriteLine(result.ErrorMessage);
            }

 如何優雅的使用DbContext

UsersService.cs
public class UsersService: DbContext<User>
{
   //有特殊需要的時候在重寫方法組
}

 DbContext中被改造成了泛型類,你傳過來什麼我幹什麼,這樣DbContext真的就是管上下文的了,其優雅度從程式碼中就可以看出!如果你有特殊情況你需要重寫方法,你直接重寫即可,這個時候你就可以把這個東西想象成三層框架中的BLL.

 public class UsersService : DbContext<Users>
    {
        public override List<Users> GetList()
        {
            return base.GetList();
        }
    }

 其DbContext的最終定義:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;

namespace dapperDemo
{
    public class DbContext<T> where T: class,new()
    {
        public DbContext()
        {
            Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = "Data Source=DESKTOP-OEJGKOO;Initial Catalog=TextInfo;Integrated Security=True",
                DbType = SqlSugar.DbType.SqlServer,
                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 SqlSugarClient Db;
        public SimpleClient<Users> UsersDb {
            get { return new SimpleClient<Users>(Db);
          } }
        public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }
        /// <summary>
        /// 可重寫的更新
        /// </summary>
        public virtual bool Update(T obj)
        {
            return CurrentDb.Update(obj);
        }
        public virtual bool Delete(dynamic id)
        {
            return CurrentDb.DeleteById(id);
        }
        public virtual List<T> GetList()
        {
            return CurrentDb.GetList();
        }
    }
}

  喜歡的話,點個贊噢