介紹
sqlsugar已經在第一時間完美相容.NET5並且已經有人在使用了, 很多人都擔心用了開源框架遇到問題無法解決,導致前功盡棄,使用SqlSugar你大可放心,除了有詳細文件和幾年的大量使用者積累,
SqlSugar還提供了完整的服務,讓您的專案沒有後顧之憂
優點: 簡單易用、功能齊全、高效能、輕量級、服務齊全
支援資料庫:MySql、SqlServer、Sqlite、Oracle 、 postgresql、達夢、人大金倉
免費服務
1、基本用法諮詢
2、BUG提交
3、採納建議和需求
4、程式碼開源 可用於任何商用專案 不收取費用 下載
5、qq交流群討論 995692596(空閒) 654015377(1800/2000 擁擠) 726648662((已滿) 225982985 (已滿)
實踐技巧1 :效能監控
通過該功能我們能輕鬆的監控到執行超過1秒的sql,並且可以拿 到他的 C#程式碼檔案和行數 和方法
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { DbType = DbType.SqlServer, ConnectionString = Config.ConnectionString, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true }); db.Aop.OnLogExecuted = (sql, p) => { //執行時間超過1秒 if (db.Ado.SqlExecutionTime.TotalSeconds > 1) {
//程式碼CS檔名 var fileName= db.Ado.SqlStackTrace.FirstFileName; //程式碼行數 var fileLine = db.Ado.SqlStackTrace.FirstLine; //方法名 var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
//sql
var exesql=sql;
//引數
var sqlpars=p; //db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 獲取上層方法的資訊 } };
實踐功能2:資料變化監控
當我們的程式碼刪了哪具體的程式碼,新增了具體的程式碼,修改了哪個列如果沒有強大的日誌功能將你將無法找回,SqlSugar可以輕鬆實現高安全級別的資料日誌
db.Aop.OnDiffLogEvent = it => { var editBeforeData = it.BeforeData;//操作前記錄 包含: 欄位描述 列名 值 表名 表描述 var editAfterData = it.AfterData;//操作後記錄 包含: 欄位描述 列名 值 表名 表描述 var sql = it.Sql; var parameter = it.Parameters; var data = it.BusinessData;//這邊會顯示你傳進來的物件 var time = it.Time; var diffType=it.DiffType;//enum insert 、update and delete //Write logic }; //新增 db.Insertable(new Student() { Name = "beforeName" }) .EnableDiffLogEvent(new { title="我是插入"}) //啟用日誌並新增業務物件 .ExecuteReturnIdentity();
//修改 db.Updateable<Student>(new Student() { Id = id, CreateTime = DateTime.Now, Name = "afterName", SchoolId = 2 }) .EnableDiffLogEvent() //啟動日誌 .ExecuteCommand();
//刪除 db.Deleteable<Student>(id) .EnableDiffLogEvent()//啟動日誌 .ExecuteCommand();
實踐功能3:JSON型別完美支援
SqlSugar不但支援PgSql的Json array型別外,哪怕你的資料庫沒有JSON型別一樣可以使用JSON物件進行儲存
ublic class UnitJsonTest { [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } [SqlSugar.SugarColumn(ColumnDataType ="varchar(max)", IsJson = true)] public Order Order { get; set; } public string Name{get;set;} } Db.Insertable(new UnitJsonTest() { Name="json1",Order = new Order { Id = 1, Name = "order1" } }).ExecuteCommand(); var list = Db.Queryable<UnitJsonTest>().ToList();
實踐功能4:分庫+分表+多庫事務
1、動態建立資料庫
下面程式碼將會建立db1和db2資料庫
string conn = "server=.;uid=sa;pwd=haosql;database={0}"; var db = new SqlSugarClient(new ConnectionConfig() { DbType = SqlSugar.DbType.SqlServer, ConnectionString = string.Format(conn, "db1"), InitKeyType=InitKeyType.Attribute }); db.DbMaintenance.CreateDatabase(); var db2 = new SqlSugarClient(new ConnectionConfig() { DbType = SqlSugar.DbType.SqlServer, ConnectionString = string.Format(conn, "db2") }); db2.DbMaintenance.CreateDatabase();
2、動態建表
下面程式碼將生成生Order1和Order2 兩張表 //注意db必須是同一個上下文 var db = new SqlSugarClient(new ConnectionConfig() { DbType = SqlSugar.DbType.SqlServer, ConnectionString = ".;xxx", InitKeyType=InitKeyType.Attribute //這個屬性必須這麼設定 }); db.MappingTables.Add(typeof(Order).Name, typeof(Order).Name + 1); db.CodeFirst.InitTables(typeof(Order)); db.MappingTables.Add(typeof(Order).Name, typeof(Order).Name + 2); db.CodeFirst.InitTables(typeof(Order));
3、實體增、刪、查、改
var list= db.Queryable<Order>().AS("Order1").ToList();//查詢Order1的表 //增 刪 改用法和查詢一樣 Inasertable().AS Deleteable().AS Updateable().As
4、跨庫聯表查詢
var list = db.Queryable<Order, OrderItem, Custom>((o, i, c) => o.Id == i.OrderId&&c.Id == o.CustomId) .AS("xx.order") .AS<OrderItem>("yy.OrderItem") .AS<Custom>("zz.Custom") .Select<ViewOrder>() .ToList();
5、多切換
SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>() { new ConnectionConfig(){ ConfigId="1", DbType=DbType.SqlServer, ConnectionString=Config.ConnectionString,InitKeyType=InitKeyType.Attribute,IsAutoCloseConnection=true }, new ConnectionConfig(){ ConfigId="2", DbType=DbType.MySql, ConnectionString=Config.ConnectionString4 ,InitKeyType=InitKeyType.Attribute ,IsAutoCloseConnection=true} }); //庫1 try { db.BeginTran(); db.Deleteable<Order>().ExecuteCommand(); db.ChangeDatabase("2");//使用庫2 db.Deleteable<Order>().ExecuteCommand(); db.CommitTran(); } catch { db.RollbackTran(); }
實踐功能5:無限級別的級聯插入
使用sqlsugar只需要配置主鍵,不需要實體配置任何外來鍵關係就能實現級聯插入
//有自動賦值的外來鍵 db.Insertable(new Order() { Name = "訂單 1", CustomId = 1, Price = 100, CreateTime = DateTime.Now, Id = 0,//自增列 Items = new List<OrderItem>() { new OrderItem(){ CreateTime=DateTime.Now, OrderId=0,//需要自動獲取訂單的自增列 Price=1, ItemId=1 } } }) .AddSubList(it => it.Items.First().OrderId )//設定item表的OrderId等於訂單自增列 .ExecuteReturnPrimaryKey();
實踐功能6:全自動二級快取
當我們用到Redis等操作時,更新資料時需要及時去清理快取會變的非常複雜,SqlSugar支援多表快取,並且更新其中一張表並且能夠清除快取
二緩快取是將結果集進行快取,當SQL和引數沒發生變化的時候從快取裡面讀取資料,減少資料庫的讀寫操作
ICacheService myCache = new HttpRuntimeCache(); SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true, ConfigureExternalServices = new ConfigureExternalServices() { DataInfoCacheService = myCache //配置我們建立的快取類 } }); db.Queryable<Student>().Where(it => it.Id > 0).WithCache().ToList();//設定快取預設一天 db.Queryable<Student>().WithCache(1000).ToList();//設定具體過期時間
刪除資料同時更新快取,插入用和更新也一樣的用法
db.Deleteable<Student>().RemoveDataCache().Where(it => it.Id == 1).ExecuteCommand(); //remove所有引用Student表的快取,包含多表查詢
實踐功能7:支援對資料庫的多種操作
名稱 | 備註 | 返回型別 |
---|---|---|
GetDataBaseList | 獲取所有資料庫名稱 | List |
GetViewInfoList | 獲取所有檢視 | List |
GetTableInfoList | 獲取所有表 | List |
GetColumnInfosByTableName | 獲取列根據表名 | List |
GetIsIdentities | 獲取自增列 | List |
GetPrimaries | 獲取主鍵 | List |
IsAnyTable | 表是否存在 | bool |
IsAnyColumn | 列是否存在 | bool |
IsPrimaryKey | 主鍵是否存在 | bool |
IsIdentity | 自增是否存在 | bool |
IsAnyConstraint | 約束是否存在 | bool |
DropTable | 刪除表 | bool |
TruncateTable | 清空表 | bool |
CreateTable | 建立列(不建議使用,用CodeFirst建表) | bool |
AddColumn | 新增列 | bool |
UpdateColumn | 更新列 | bool |
AddPrimaryKey | 新增主鍵 | bool |
DropConstraint | 刪除約束 | bool |
BackupDataBase | 備份庫 | bool |
DropColumn | 刪除列 | bool |
RenameColumn | 重新命名列 | bool |
AddTableRemark | 新增表描述 | bool |
AddColumnRemark | 新增列描述 | bool |
DeleteColumnRemark | 刪除列描述 | bool |
RenameTable | 重新命名錶 | bool |
實踐功能8:動態SQL完美防注入方案
var orderField = "order';drop table order"; var orderInfo= db.EntityMaintenance.GetEntityInfo<Order>(); if (orderInfo.Columns.Any(it => it.DbColumnName != orderField)) { throw new Exception("請不要非法注入"); } db.Queryable<Order>().OrderBy(orderField).ToList();
SqlSugar一直在努力的變的更好,所有功能都是來自客戶並且經受過長期的使用者實踐,為了能夠給我更多動力
原碼下載: https://github.com/sunkaixuan/SqlSugar 只需你點贊,讓我動力十足