c#數據庫操作ORM映射框架


主要功能介紹

支持Oracle,SQL Server,MySQL,SQLLite等數據庫。。主要功能:

  1. 支持查詢返回動態類型Dynamic以及可擴展類型ExpandoDynamic
  2. 表拆分,根據某個日期字段在Insert時,字段按年,月,日,季度生成表,並將數據插入對應日期的表
  3. 表檢查,在系統啟動時,根據程序實體層(Model類)自動創建缺失的表,字段功能
  4. 通過Emit方式進行數據對象的填充和映射,替代反射操作對象。提供性能和效率。執行效率能達到Ado.net原生效率
  5. 自定義主鍵,通過MyIdMake生成全局唯一ID,18位數值型,類型為Int64,long,BigInt,Number(18)等數值類型。ID具有遞增:下一個 ID 一定大於上一個 ID,滿足排序等特殊需求
  6. 對於其他數據庫,可執行擴展,只需繼承類DBSession,並重載對應方法即可
  7. 支持在同一個項目中同時連接多個不同的數據庫
  8. 支持常用的:分頁,泛型List,實體List,自定義對象List,動態類型Dynamic的List,可擴展類型ExpandoDynamic的List等查詢,支持事務操作,AddParameter方式添加參數避免sql注 

實體類(Model型)

實體類主要實現C#類和數據庫表的映射。例如: 

映射特性說明,具體參數詳見注釋:

DBTable:數據庫表映射,主要用戶類上

DBColumn:字段映射

DBPrimary:主鍵映射,支持聯合主鍵,即多個主鍵

/// <summary>
    ///管理用戶表
    /// </summary>
    [DBTable("AdminUser")]
    public class AdminUser 
    {
        /// <summary>
        ///Id
        /// </summary>
        [DBPrimaryKey("Id")]
        public Int64 Id { get; set; }

        /// <summary>
        ///用戶名
        /// </summary>
        [DBColumn("UserName")]
        public string UserName { get; set; }

        /// <summary>
        ///密碼
        /// </summary>
        [DBColumn("PassWord")]
        public string PassWord { get; set; }

        /// <summary>
        ///姓名
        /// </summary>
        [DBColumn("Name")]
        public string Name { get; set; }

        /// <summary>
        ///狀態
        /// </summary>
        [DBColumn("State")]
        public StateType State { get; set; }

        /// <summary>
        ///CreateTime
        /// </summary>
        [DBColumn("CreateTime")]
        public DateTime CreateTime { get; set; }
    }

  

 

初始化

//構造初始化參數
 DBContext db = new DBContext("WebSite", DataBaseType.SQLServer, constring, 5);

 //初始化數據庫連接,第二個參數指定數據庫映射的實體類
 DBSession.InitDBSession(db, typeof(Model.AdminUser).Assembly);

 //設置默認的數據庫連接
 DBSession.DefaultDBKey = "WebSite"; 

  

DBContext 構造參數說明:

dbKey(上面第一個參數):為此數據庫連接指定自定義名稱

DataBaseType.SQLServer (上面第二個參數):指定數據庫類型

constring(上面第三個參數):數據庫連接字符串

5(上面第四個參數):連接對象池初始大小,如果為0 則不啟用連接對象池 

 

 數據庫操作說明

 常用寫法如下:如果不需要事務,則去掉try。所有的數據庫操作都直接通過對象session的方法進行操作。

using (DBSession session = DBSession.TryGet())
{
     try
       {
             session.BeginTransaction();

                    …你的數據庫操作邏輯

             session.Commit();
         }
         catch (Exception ex)
         {
             session.Rollback();
             throw ex;
         }
  }

   

如果不使用using寫法

DBSession session = DBSession.TryGet();
try{
             …你的數據庫操作邏輯
   }catch (Exception ex)
   {
       throw ex;
   }finally
  {     session.Disponse();//一定要關閉連接   }

   

Sql參數寫法示例

session.ExecuteNonQuery("update StoreHouse set State=? where id=? ", state, id);

對於sql中的參數以?替代,后面按照順序進行輸入即可

 

原生數據庫操作方法

支持原生的數據庫操作方法有:

//執行增、刪、改
int ExecuteNonQuery(string sql, params object[] paras):

//獲取查詢結果的第一行第一列
object ExecuteScalar(string sql, params object[] paras)

//獲取查詢結果的第一行第一列,並返回指定的泛型類型
T ExecuteScalar<T>(string sql, params object[] paras)

//獲取一個DataTable
DataTable GetTable(string sql, params object[] paras)

//讀取一個Reader
IDataReader ExecuteReader(string sql, params object[] paras)

//執行存儲過程 並返回一張表
DataTable ExecuteProcRtuTB(string procName)

//執行存儲過程
object ExecuteProc(string procName)

  

新增

//新增對象
Insert<T>(T instance)

//批量新增,采用批量新增的sql語句新增 目前僅支持Oracle Sql Server
int InsertBatch<T>(List<T> list, int pageSize = 100, DateTime? date = null)

//批量新增 采用SqlBulkCopy方式批量新增 目前僅支持Sql Server
void InsertBatchBulkCopy<T>(List<T> list, DateTime? date = null)

//批量新增 采用SqlBulkCopy方式批量新增
InsertBatchBulkCopy<T>(DataTable dt, DateTime? date = null)

  

修改

//修改對象,會修改所有字段
int Update<T>(T instance)

  

刪除

//根據主鍵刪除,例如:session.Delete<Dept, Int64>(deptId)
int Delete<T, IdT>(IdT id)

//根據條件刪除,例如:session.Delete<W_UserRole>("UserId=?", old.Id);
int Delete<T>(string where, params object[] paras)

  

映射類查詢(返回結果為實體類)

//通過ID(主鍵)獲取指定類型的對象
T GetById<T>(object id)

//根據條件查詢對象,例如:session.GetObject<WebUser>("Tel=?","13012345678");
T GetObject<T>(string where, params object[] paras)

//根據SQL語句查詢對象
T GetObjectBySQL<T>(string sql, params object[] paras)

//根據SQL語句查詢列表
List<T> GetListBySQL<T>(string sql, params object[] paras)

//根據條件獲取列表,例如:session.GetList<WebUser>("Tel like ?","Tel desc","130%");
List<T> GetList<T>(string where, string order, params object[] paras)

  

自定義類型查詢(返回結果為非映射類)

//獲取自定義的對象列表列表
List<T> GetCustomerList<T>(string sql, params object[] paras)

//根據SQL語句查詢對象
T GetCustomerObject<T>(string sql, params object[] paras)

//獲取自定義對象列表,分頁查詢
List<T> GetCustomPagingList<T>(
            int pageIndex,
            int pageSize,
            string before,
            string fields,
            string from,
            string where,
            string group,
            string order,
            params object[] paras)

  

動態類查詢(返回結果為Dynamic類型)

//獲取自定義對象列表,自己給定SQL語句
object GetDynamicList(string sql, params object[] paras)

//獲取符合條件的第一條記錄, 給定SQL語句
object GetDynamicObject(string sql, params object[] paras)

//獲取自定義對象列表 分頁查詢
object GetDynamicPagingList(
            int pageIndex,
            int pageSize,
            string fields,
            string from,
            string where,
            string group,
            string order,
            params object[] paras)
        {
            Command.CommandType = CommandType.Text;
            Command.CommandText = PrepareCustomSelectPaging(pageIndex, pageSize, fields, from, where, group, order, paras);
            using (IDataReader reader = Command.ExecuteReader())
            {
                return FullDataReader.CreateDegFullDynamicList(reader)(reader);
            }
        } 

  

可擴展類查詢(返回結果為System.Dynamic.ExpandoObject類型)

//動態可擴展集合對象列表。返回對象與列名一致,返回對象可動態擴展
object GetExpandoDynamicList(string sql, params object[] paras)

//動態可擴展集合對象
object GetExpandoDynamicObject(string sql, params object[] paras)

//動態可擴展集合對象 分頁查詢
object GetExpandoDynamicPagingList(
            int pageIndex,
            int pageSize,
            string before,
            string fields,
            string from,
            string where,
            string group,
            string order,
            params object[] paras)

   

數據庫主鍵策略

DBFrame中類MyIdMake 自定義了主鍵策略。常見的主鍵策略自增長:缺點對於表間關系維護是個大麻煩。Guid:太長,無序導致insert性能降低。

MyIdMake是參考比較成熟的全局唯一ID生成算法生成的Id。具有一下優點:

  1. 18位數值型,類型為Int64,long,BigInt,Number(18)等數值類型
  2. 全局唯一性:不能出現重復的 ID 號;
  3. 遞增:下一個 ID 一定大於上一個 ID,例如排序等特殊需求
  4. 信息安全:如果 ID 是連續的,惡意用戶的爬取工作就非常容易做了

參考:https://mp.weixin.qq.com/s/8XH6oN7KR93vvyB7rcIdtw

用法:

1:在初始化時設置機器編號:MyIdMake.MyIdNo = 1;

2MyIdMake. NewId 生成一個當前時間主鍵

3: long New(DateTime pointTime) //根據指定時間生成一個新的主鍵

主鍵解析:

//獲取主鍵值中的時間
DateTime MyIdMake. GetMyIdDate(long id)

//獲取 某個時間點最小的Id,用於將Id作為時間查詢的值,在時間查詢時可通過Id大小查詢(主鍵查詢效率更高)
long MyIdMake. GetTimeQueryId (string time)

   

說明:

主鍵組成:yyMMdd+5位秒(距當天00:00:00秒數)+5位序號+2位機器碼

每秒鍾每台機器最多生成:99999個Id,超過后會阻塞當前線程,等待下一秒才生成並返回

 

結語

源代碼托管於GitHub,供大伙學習參考,項目地址:https://github.com/keguoquan/DBFrame。感興趣或覺得不錯的望賞個star,不勝感激!

若能順手點個贊,更加感謝!

如有疑問可以QQ咨詢:343798739

 

實體類生成工具

支持從PowerDesign數據庫設計工具以及Oracle,SQL Server,MySQL,SQLLite等數據庫獲取表機構並生成對應的實體類

實體生成工具,詳見本人另一篇文章:https://www.cnblogs.com/keguoquan/p/14541958.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM