主要功能介紹
支持Oracle,SQL Server,MySQL,SQLLite等數據庫。。主要功能:
- 支持查詢返回動態類型Dynamic以及可擴展類型ExpandoDynamic
- 表拆分,根據某個日期字段在Insert時,字段按年,月,日,季度生成表,並將數據插入對應日期的表
- 表檢查,在系統啟動時,根據程序實體層(Model類)自動創建缺失的表,字段功能
- 通過Emit方式進行數據對象的填充和映射,替代反射操作對象。提供性能和效率。執行效率能達到Ado.net原生效率
- 自定義主鍵,通過MyIdMake生成全局唯一ID,18位數值型,類型為Int64,long,BigInt,Number(18)等數值類型。ID具有遞增:下一個 ID 一定大於上一個 ID,滿足排序等特殊需求
- 對於其他數據庫,可執行擴展,只需繼承類DBSession,並重載對應方法即可
- 支持在同一個項目中同時連接多個不同的數據庫
- 支持常用的:分頁,泛型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。具有一下優點:
- 18位數值型,類型為Int64,long,BigInt,Number(18)等數值類型
- 全局唯一性:不能出現重復的 ID 號;
- 遞增:下一個 ID 一定大於上一個 ID,例如排序等特殊需求
- 信息安全:如果 ID 是連續的,惡意用戶的爬取工作就非常容易做了
參考:https://mp.weixin.qq.com/s/8XH6oN7KR93vvyB7rcIdtw
用法:
1:在初始化時設置機器編號:MyIdMake.MyIdNo = 1;
2:MyIdMake. 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