<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      目錄

      * 前言 <https://www.cnblogs.com/AprilBlank/p/11282394.html#前言>
      * SqlSugar <https://www.cnblogs.com/AprilBlank/p/11282394.html#sqlsugar>
      * Service層 <https://www.cnblogs.com/AprilBlank/p/11282394.html#service層>
      * BaseService(基類)
      <https://www.cnblogs.com/AprilBlank/p/11282394.html#baseservice基類>
      * 小結(jié) <https://www.cnblogs.com/AprilBlank/p/11282394.html#小結(jié)>
      前言

      后端開發(fā)最常打交道的就是數(shù)據(jù)庫了(靜態(tài)網(wǎng)站靠邊),上一篇net core Webapi基礎(chǔ)工程搭建(五)——緩存機(jī)制
      <https://www.cnblogs.com/AprilBlank/p/11282349.html>
      ,緩存就是為了減少數(shù)據(jù)庫的讀操作,不過什么訪問都是會(huì)耗時(shí)的,拿空間(內(nèi)存)換時(shí)間對(duì)用戶體驗(yàn)來說是慣用手段,后續(xù)介紹界面操作的時(shí)候再說用戶體驗(yàn)。

      SqlSugar

      當(dāng)然你可以用EF(太重,擴(kuò)展性相對(duì)差,但不可否認(rèn)基本上涵蓋范圍夠廣),也可以用Dapper(這個(gè)我之前頭一回鼓搗net
      core的時(shí)候用的是Dapper),或者自己基于原生去寫數(shù)據(jù)庫的操作,都Ok,但是如果有造好的輪子,對(duì)于我們來說用就行了,可以深入理解但對(duì)于常規(guī)開發(fā)來說,CV大法是最好的(新手向),
      SqlSugar的文檔地址 <http://www.codeisbug.com/>。

      之前的工程在最初創(chuàng)建的時(shí)候,沒有創(chuàng)建完整,因?yàn)楫?dāng)時(shí)不操作數(shù)據(jù)層,所以偷個(gè)懶,這次一并創(chuàng)建,具體過程不再贅述
      ,同April.Util工程的創(chuàng)建一致,都是類庫項(xiàng)目,新建April.Service,April.Entity。

      好了,我們?cè)赟ervice與Entity項(xiàng)目中通過NuGet包引入sqlSugarCore,至于原因前面也說過net core
      Webapi基礎(chǔ)工程搭建(四)——日志功能log4net
      <https://www.cnblogs.com/AprilBlank/p/11282345.html>。

      這里應(yīng)該不需要再圖文介紹引入了,如果不清楚,也可以去上面的鏈接查看NuGet的引入方法。

      引入完成后,我們?cè)贓ntity項(xiàng)目創(chuàng)建一個(gè)類對(duì)象,命名為StudentEntity吧,只是做個(gè)示例。
      public class StudentEntity { private int _ID = -1; private string _Name =
      string.Empty; private string _Number = string.Empty; private int _Age = 0;
      private int _Sex = 0; private string _Address = string.Empty; }

      對(duì)象屬性這塊兒,看個(gè)人習(xí)慣,有些人偏向于直接get,set方法,我習(xí)慣于先初始化,選中所有的私有屬性,使用宇宙第一IDE的快捷鍵Ctrl+R+E,點(diǎn)擊確定,好了自己去加注釋去吧。



      這里也說下為什么Entity這個(gè)實(shí)例對(duì)象層也要引入SqlSugar,是因?yàn)槿绻愕谋砻蛘邔傩悦c數(shù)據(jù)庫不一致的時(shí)候,還是需要標(biāo)識(shí)出來的,比如下面的代碼,具體的用法還是去參考文檔吧,我這只是輕描淡寫下。
      [SugarTable("test_Student")] public class StudentEntity { private int _ID =
      -1; private string _Name = string.Empty; private string _Number = string.Empty;
      private int _Age = 0; private int _Sex = 0; private string _Address =
      string.Empty; /// <summary> /// 主鍵 /// </summary> [SugarColumn(IsPrimaryKey =
      true, IsIdentity = true)] public int ID { get => _ID; set => _ID = value; } ///
      <summary> /// 姓名 /// </summary> public string Name { get => _Name; set => _Name
      = value; } /// <summary> /// 學(xué)號(hào) /// </summary> public string Number { get =>
      _Number; set => _Number = value; } /// <summary> /// 年齡 /// </summary> public
      int Age { get => _Age; set => _Age = value; } /// <summary> /// 性別 ///
      </summary> public int Sex { get => _Sex; set => _Sex = value; } /// <summary>
      /// 家庭住址 /// </summary> [SugarColumn(ColumnName = "test_Address")] public
      string Address { get => _Address; set => _Address = value; } }
      實(shí)體對(duì)象我就不多寫了,重復(fù)的工作是根據(jù)你自己的業(yè)務(wù)所處理的。

      Service層

      這個(gè)地方我重點(diǎn)標(biāo)注下,是因?yàn)閿?shù)據(jù)庫這塊兒的操作還是需要重視的,我們先來新建個(gè)BaseDbContext用于執(zhí)行數(shù)據(jù)庫操作的實(shí)體。
      public class BaseDbContext { public SqlSugarClient Db; /// <summary> /// 構(gòu)造函數(shù)
      /// </summary> /// <param name="connStr">數(shù)據(jù)庫連接串</param> /// <param
      name="sqlType">數(shù)據(jù)庫類型</param> public BaseDbContext(string connStr, int sqlType =
      1) { InitDataBase(connStr, sqlType); } /// <summary> /// 構(gòu)造函數(shù) /// </summary>
      /// <param name="serverIp">服務(wù)器IP</param> /// <param name="user">用戶名</param> ///
      <param name="pass">密碼</param> /// <param name="dataBase">數(shù)據(jù)庫</param> public
      BaseDbContext(string serverIp, string user, string pass, string dataBase) {
      string connStr = $"server={serverIp};user
      id={user};password={pass};persistsecurityinfo=True;database={dataBase}";
      InitDataBase(connStr); } /// <summary> /// 初始化數(shù)據(jù)庫連接 /// </summary> /// <param
      name="listConn">連接字符串</param> private void InitDataBase(string connStr, int
      sqlType = 1) { Db = new SqlSugarClient(new ConnectionConfig() {
      ConnectionString = connStr, DbType = (DbType)sqlType, IsAutoCloseConnection =
      true, //SlaveConnectionConfigs = slaveConnectionConfigs });
      Db.Ado.CommandTimeOut = 30000;//設(shè)置超時(shí)時(shí)間 Db.Aop.OnLogExecuted = (sql, pars) =>
      //SQL執(zhí)行完事件 { //這里可以查看執(zhí)行的sql語句跟參數(shù) }; Db.Aop.OnLogExecuting = (sql, pars) =>
      //SQL執(zhí)行前事件 { //這里可以查看執(zhí)行的sql語句跟參數(shù) }; Db.Aop.OnError = (exp) =>//執(zhí)行SQL 錯(cuò)誤事件 {
      //這里可以查看執(zhí)行的sql語句跟參數(shù) }; Db.Aop.OnExecutingChangeSql = (sql, pars) => //SQL執(zhí)行前
      可以修改SQL { return new KeyValuePair<string, SugarParameter[]>(sql, pars); }; }
      /// <summary> /// 開啟事務(wù) /// </summary> public void BeginTran() {
      Db.Ado.BeginTran(); } /// <summary> /// 提交事務(wù) /// </summary> public void
      CommitTran() { Db.Ado.CommitTran(); } /// <summary> /// 回滾事務(wù) /// </summary>
      public void RollbackTran() { Db.Ado.RollbackTran(); } }
      構(gòu)造函數(shù)主要用于實(shí)例化你的數(shù)據(jù)庫對(duì)象(連接串,數(shù)據(jù)庫類型),日志的記錄,事務(wù)這些也都標(biāo)注上,后續(xù)可以替換直接使用。

      BaseService(基類)

      在最初寫net
      core的時(shí)候,我用Repository層來實(shí)現(xiàn)sql處理,Service用來做邏輯處理,傳統(tǒng)的三層架構(gòu),但是對(duì)于簡(jiǎn)單的工程來說,個(gè)人感覺Bll層的存在不是那么理想,可能是我沒徹底理解三層架構(gòu)吧,這個(gè)地方如果有個(gè)人想法或好的見解也希望一塊交流,互相進(jìn)步。

      在寫基類之前,我們?cè)赨til層新建一個(gè)SqlSqlFilterEntity
      ,這步可能算是多此一舉,但是為了減少團(tuán)隊(duì)其他人的學(xué)習(xí)成本,我還是寫了這個(gè)對(duì)象,以致于后續(xù)的封裝,會(huì)以此為參數(shù)做傳遞而不公開lambda的寫法使用。
      public class SqlFilterEntity { private string _Filter = string.Empty; private
      Dictionary<string, object> _Value = null; /// <summary> /// 查詢條件 /// </summary>
      public string Filter { get => _Filter; set => _Filter = value; } /// <summary>
      /// 查詢參數(shù) /// </summary> public Dictionary<string, object> Value { get =>
      _Value; set => _Value = value; } }
      在Service層新建IBaseService接口。
      public interface IBaseService<T> : IDisposable { /// <summary> /// 分頁查詢集合 ///
      </summary> /// <param name="pageIndex">頁碼</param> /// <param
      name="pageSize">分頁大小</param> /// <param name="strField">查詢字段</param> /// <param
      name="filter">查詢條件</param> /// <param name="strOrder">排序規(guī)則</param> /// <param
      name="totalCount">總數(shù)</param> /// <returns>數(shù)據(jù)集合</returns> List<T>
      GetPageList(int pageIndex, int pageSize, string strField, SqlFilterEntity
      filter, string strOrder, out int totalCount); /// <summary> /// 獲取列表集合 ///
      </summary> /// <param name="field">查詢字段</param> /// <param
      name="filter">查詢條件</param> /// <returns>數(shù)據(jù)集合</returns> ISugarQueryable<T>
      GetList(string field, SqlFilterEntity filter); /// <summary> /// 獲取列表集合 ///
      </summary> /// <returns>數(shù)據(jù)集合</returns> ISugarQueryable<T> GetList(int top = 0);
      /// <summary> /// 獲取對(duì)象 /// </summary> /// <param name="field">查詢字段</param> ///
      <param name="filter">查詢條件</param> /// <returns>對(duì)象</returns> T
      GetEntity(SqlFilterEntity filter, string field = ""); /// <summary> ///
      判斷數(shù)據(jù)是否存在 /// </summary> /// <param name="filter">查詢條件</param> ///
      <returns>執(zhí)行結(jié)果</returns> bool IsExists(SqlFilterEntity filter); /// <summary>
      /// 新增 /// </summary> /// <param name="entity">實(shí)例對(duì)象</param> /// <param
      name="ignoreColumns">排除列</param> /// <param name="isLock">是否加鎖</param> ///
      <returns>自增id</returns> int Insert(T entity, List<string> ignoreColumns = null,
      bool isLock = false); /// <summary> /// 修改 /// </summary> /// <param
      name="entity">實(shí)例對(duì)象</param> /// <param name="ignoreColumns">排除列</param> ///
      <param name="isLock">是否加鎖</param> /// <returns>執(zhí)行結(jié)果</returns> bool Update(T
      entity, List<string> ignoreColumns = null, bool isLock = false); /// <summary>
      /// 根據(jù)主鍵刪除 /// </summary> /// <param name="entity">實(shí)例對(duì)象</param> /// <param
      name="isLock">是否加鎖</param> /// <returns>執(zhí)行結(jié)果</returns> bool Delete(T entity,
      bool isLock = false); }
      可以看到,我通過SqlFilterEntity這一實(shí)例來傳遞我的Where條件。

      實(shí)現(xiàn)接口方法,新建BaseService。
      public class BaseService<T> : IBaseService<T> where T : class, new() {
      private BaseDbContext baseDb; protected SqlSugarClient db; public BaseService()
      { baseDb = new BaseDbContext("你的數(shù)據(jù)庫連接"); db = baseDb.Db; } /// <summary> ///
      分頁查詢集合 /// </summary> /// <param name="pageIndex">頁碼</param> /// <param
      name="pageSize">分頁大小</param> /// <param name="strField">查詢字段</param> /// <param
      name="filter">查詢條件</param> /// <param name="strOrder">排序規(guī)則</param> /// <param
      name="totalCount">總數(shù)</param> /// <returns>數(shù)據(jù)集合</returns> public List<T>
      GetPageList(int pageIndex, int pageSize, string strField, SqlFilterEntity
      filter, string strOrder, out int totalCount) { totalCount = 0; if (pageIndex <=
      0) { pageIndex = 1; } if (pageSize <= 0) { pageSize = 10;//暫定默認(rèn)分頁大小為10 } if
      (string.IsNullOrEmpty(strField)) { strField = ""; } if
      (string.IsNullOrEmpty(strOrder)) { strOrder = string.Format("ID
      asc");//這個(gè)地方我當(dāng)時(shí)是在Config設(shè)置默認(rèn)的排序 } if (filter == null) { filter = new
      SqlFilterEntity(); } return
      db.Queryable<T>().With(SqlWith.NoLock).Select(strField).WhereIF(!string.IsNullOrEmpty(filter.Filter),
      filter.Filter, filter.Value).OrderByIF(!string.IsNullOrEmpty(strOrder),
      strOrder).ToPageList(pageIndex, pageSize, ref totalCount); } /// <summary> ///
      獲取列表集合 /// </summary> /// <param name="field">查詢字段</param> /// <param
      name="filter">查詢條件</param> /// <returns>數(shù)據(jù)集合</returns> public
      ISugarQueryable<T> GetList(string field, SqlFilterEntity filter) { if
      (string.IsNullOrEmpty(field)) { field = ""; } if (filter == null) { filter =
      new SqlFilterEntity(); } return
      db.Queryable<T>().With(SqlWith.NoLock).Select(field).WhereIF(!string.IsNullOrEmpty(filter.Filter),
      filter.Filter, filter.Value); } /// <summary> /// 獲取列表集合 /// </summary> ///
      <returns>數(shù)據(jù)集合</returns> public ISugarQueryable<T> GetList(int top = 0) { if
      (top > 0) { return db.Queryable<T>().With(SqlWith.NoLock).Take(top); } else {
      return db.Queryable<T>().With(SqlWith.NoLock); } } /// <summary> /// 獲取對(duì)象 ///
      </summary> /// <param name="field">查詢字段</param> /// <param
      name="filter">查詢條件</param> /// <returns>對(duì)象</returns> public T
      GetEntity(SqlFilterEntity filter, string field = "") { if
      (string.IsNullOrEmpty(field)) { field = ""; } if (filter != null) { return
      db.Queryable<T>().With(SqlWith.NoLock).Select(field).WhereIF(!string.IsNullOrEmpty(filter.Filter),
      filter.Filter, filter.Value).First(); } return default(T); } /// <summary> ///
      判斷數(shù)據(jù)是否存在 /// </summary> /// <param name="filter">查詢條件</param> ///
      <returns>執(zhí)行結(jié)果</returns> public bool IsExists(SqlFilterEntity filter) { var
      result =
      db.Queryable<T>().With(SqlWith.NoLock).WhereIF(!string.IsNullOrEmpty(filter.Filter),
      filter.Filter, filter.Value).Count(); return result > 0; } /// <summary> /// 新增
      /// </summary> /// <param name="entity">實(shí)例對(duì)象</param> /// <param
      name="ignoreColumns">排除列</param> /// <param name="isLock">是否加鎖</param> ///
      <returns>自增id</returns> public int Insert(T entity, List<string> ignoreColumns
      = null, bool isLock = false) { if (ignoreColumns == null) { ignoreColumns = new
      List<string>(); } var result = isLock ?
      db.Insertable(entity).With(SqlWith.UpdLock).IgnoreColumns(ignoreColumns.ToArray()).ExecuteReturnIdentity()
      :
      db.Insertable(entity).IgnoreColumns(ignoreColumns.ToArray()).ExecuteReturnIdentity();
      return result; } /// <summary> /// 修改 /// </summary> /// <param
      name="entity">實(shí)例對(duì)象</param> /// <param name="ignoreColumns">排除列</param> ///
      <param name="isLock">是否加鎖</param> /// <returns>執(zhí)行結(jié)果</returns> public bool
      Update(T entity, List<string> ignoreColumns = null, bool isLock = false) { if
      (ignoreColumns == null) { ignoreColumns = new List<string>(); } var result =
      isLock ?
      db.Updateable(entity).With(SqlWith.UpdLock).IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand()
      :
      db.Updateable(entity).IgnoreColumns(ignoreColumns.ToArray()).ExecuteCommand();
      return result > 0; } /// <summary> /// 根據(jù)主鍵刪除 /// </summary> /// <param
      name="entity">實(shí)例對(duì)象</param> /// <param name="isLock">是否加鎖</param> ///
      <returns>執(zhí)行結(jié)果</returns> public bool Delete(T entity, bool isLock = false) { var
      result = isLock ?
      db.Deleteable<T>(entity).With(SqlWith.RowLock).ExecuteCommand().ObjToBool() :
      db.Deleteable<T>(entity).ExecuteCommand().ObjToBool(); return result; } public
      void Dispose() { } }
      小結(jié)

      這一篇感覺寫的不多,但是代碼放的有點(diǎn)兒多,習(xí)慣性的把東西盡可能介紹詳細(xì)點(diǎn)兒,萬一有人真的從小白開始一點(diǎn)點(diǎn)兒想折騰個(gè)啥東西呢(比如說我),下一篇Part 2
      介紹具體的用法和測(cè)試吧。

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          老骚逼影视 | 日日夜夜一区 | 无码紧身牛仔裤在线视频 | 国产强奸视频 | 乱伦三区 | 亚洲国产精品自拍 | 午夜激情导航 | 翔田千里无码XXXXXX | 热久久av | www免费视频在线观看播放 |