基于.NET 6.0 自研輕量級(jí)ORM框架
Fast Framework
項(xiàng)目:https://gitee.com/China-Mr-zhong/Fast.Framework
一、前言
1、為了實(shí)現(xiàn)快速開(kāi)發(fā),省去編寫(xiě)大量Sql時(shí)間,更好的面向?qū)ο缶幊逃纱苏Q生了 Fast Framework
2、Fast Framework 是一個(gè)基于.NET 6.0 封裝的輕量級(jí) ORM 框架 支持?jǐn)?shù)據(jù)庫(kù) SqlServer Oracle MySql PostgreSql Sqlite 由于底層使用System.Data.Common 抽象類(lèi)封裝 理論支持所有Ado.Net 實(shí)現(xiàn)的類(lèi)庫(kù),差異部分可能需要額外處理。
3、框架
優(yōu)點(diǎn):體積小 流暢API 使用更加簡(jiǎn)單 性能高
缺點(diǎn):不具備有自動(dòng)建庫(kù)建表遷移等復(fù)雜的功能 由于不同數(shù)據(jù)庫(kù)差異較大 實(shí)現(xiàn)較為復(fù)雜 所以暫時(shí)不考慮實(shí)現(xiàn)
二、項(xiàng)目明細(xì) (后綴為T(mén)est均為測(cè)試項(xiàng)目)
1、Fast.Framework
2、Fast.Framework.CustomAttribute
3、Fast.Framework.Extensions
4、Fast.Framework.Interfaces
5、Fast.Framework.Logging
6、Fast.Framework.Models
7、Fast.Framework.Utils
三、快速入門(mén)
1、手動(dòng)創(chuàng)建
var options = new DefaultDbOptions() //數(shù)據(jù)選項(xiàng)
{
DbType = DbType.MySQL,
ProviderName = "MySqlConnector",
FactoryName = "MySqlConnector.MySqlConnectorFactory,MySqlConnector",
ConnectionStrings = "server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=3;max pool size=100;connect timeout =30;AllowLoadLocalInfile=True;"
};
var ado = new Ado<DefaultDbOptions>(options);//原生Ado
var db = new DbContext<DefaultDbOptions>(ado);//數(shù)據(jù)庫(kù)上下文
2、依賴(lài)注入
var builder = WebApplication.CreateBuilder(args);
// 正式項(xiàng)目請(qǐng)用配置文件注入,為了測(cè)試方便直接引用實(shí)現(xiàn)類(lèi)庫(kù)
builder.Services.AddScoped<IAdo<DefaultDbOptions>, Ado<DefaultDbOptions>>();
builder.Services.AddScoped<IDbContext<DefaultDbOptions>, DbContext<DefaultDbOptions>>();
3、加載Json配置文件
builder.Services.Configure<DefaultDbOptions>(configuration.GetSection("DbFactory:MySqlDb"));
4、Json 格式
"DbFactory": {
"MySQLDb": {
"DbType": "MySQL",
"ProviderName": "MySqlConnector",
"FactoryName": "MySqlConnector.MySqlConnectorFactory,MySqlConnector",
"ConnectionStrings": "server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=3;max pool size=100;connect timeout =30;"
},
"SQLServerDb": {
"DbType": "SQLServer",
"ProviderName": "System.Data.SqlClient",
"FactoryName": "System.Data.SqlClient.SqlClientFactory,System.Data",
"ConnectionStrings": "server=localhost;database=Test;user=sa;pwd=123456789;min pool size=3;max pool size=100;connect timeout =30;"
},
"OracleDb": {
"DbType": "Oracle",
"ProviderName": "Oracle.ManagedDataAccess.Client",
"FactoryName": "Oracle.ManagedDataAccess.Client.OracleClientFactory,Oracle.ManagedDataAccess",
"ConnectionStrings": "data source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)));user id=system;password=Oracle2022;min pool size=3;max pool size=100;connect timeout =30;"
},
"PostgreSQLDb": {
"DbType": "PostgreSQL",
"ProviderName": "Npgsql",
"FactoryName": "Npgsql.NpgsqlFactory,Npgsql",
"ConnectionStrings": "host=localhost;database=test;userid=postgres;pwd=123456789;port=5432;"
},
"SQLiteDb": {
"DbType": "SQLite",
"ProviderName": "System.Data.SQLite",
"FactoryName": "System.Data.SQLite.SQLiteFactory,System.Data.SQLite",
"ConnectionStrings": "data source=mysqlite.db;pooling=true;"
}
}
5、Controller 構(gòu)造方法注入已注冊(cè)的DbContext對(duì)象
namespace Fast.Framework.Web.Test.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ProductController : ControllerBase
{
/// <summary>
/// 數(shù)據(jù)庫(kù)
/// </summary>
private readonly IDbContext<DefaultDbOptions> db;
/// <summary>
/// 日志
/// </summary>
private readonly ILogger<ProductController> logger;
/// <summary>
/// 構(gòu)造方法
/// </summary>
/// <param name="db"></param>
public ProductController(ILogger<ProductController> logger, IDbContext<DefaultDbOptions> db)
{
this.db = db;
this.logger = logger;
}
}
}
6、示例
#region 增 刪 改
//實(shí)體對(duì)象插入
{
var result = await db.Insert(new ProductModel() { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).ExecuteAsync();
Console.WriteLine(result);
}
//實(shí)體對(duì)象插入并返回自增ID 僅支持 SQLServer Mysql Sqlite
{
var result = await db.Insert(new ProductModel() { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).ExecuteReturnIdentityAsync();
Console.WriteLine(result);
}
//實(shí)體對(duì)象列表插入 列表插入不支持批量返回自增ID
{
var list = new List<ProductModel>();
list.Add(new ProductModel() { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" });
list.Add(new ProductModel() { ProductCode = "1002", ProductName = "測(cè)試產(chǎn)品2" });
var result = await db.Insert(list).ExecuteAsync();
Console.WriteLine(result);
}
//匿名對(duì)象插入 必須使用 As 方法顯示指定表名稱(chēng)
{
var result = db.Insert(new { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).As("Product").ExecuteAsync();
Console.WriteLine(result);
}
//匿名對(duì)象列表插入 必須使用As 顯示指定表名稱(chēng)
{
var list = new List<object>();
list.Add(new { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" });
list.Add(new { ProductCode = "1002", ProductName = "測(cè)試產(chǎn)品2" });
var result = await db.Insert(list).As("Product").ExecuteAsync();
Console.WriteLine(result);
}
//實(shí)體無(wú)條件刪除
{
var result = await db.Delete<ProductModel>().ExecuteAsync();
Console.WriteLine(result);
}
//實(shí)體條件刪除
{
var result = await db.Delete<ProductModel>().Where(w => w.ProductId == 1).ExecuteAsync();
Console.WriteLine(result);
}
//父類(lèi)對(duì)象刪除
{
var result = db.Delete<object>().As("Product").ExecuteAsync();
Console.WriteLine(result);
}
//匿名對(duì)象條件刪除
{
var obj = new { ProductCode = "測(cè)試" };
var result = await db.Delete(obj).Where(w => w.ProductCode == obj.ProductCode).As("Product").ExecuteAsync();
Console.WriteLine(result);
}
//實(shí)體對(duì)象無(wú)條件更新
{
var result = await db.Update(new ProductModel() { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).ExecuteAsync();
Console.WriteLine(result);
}
//實(shí)體對(duì)象條件更新
{
var result = await db.Update(new ProductModel() { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).Where(w => w.ProductId == 1).ExecuteAsync();
Console.WriteLine(result);
}
//實(shí)體對(duì)象列表更新
{
var list = new List<ProductModel>();
for (int i = 0; i < 10; i++)
{
list.Add(new ProductModel() { ProductId = 16395 + i, ProductCode = $"{16395 + i}", ProductName = $"{16395 + i}" });
}
var result = await db.Update(list).ExecuteAsync();
Console.WriteLine(result);
}
//匿名對(duì)象無(wú)條件更新
{
var result = await db.Update(new { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).As("Product").ExecuteAsync();
Console.WriteLine(result);
}
//匿名對(duì)象條件更新
{
var result = await db.Update(new { ProductId = 1, ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).Where(w => w.ProductId == 1).As("Product").ExecuteAsync();
Console.WriteLine(result);
}
//匿名對(duì)象列表更新 需要顯示指定主鍵名稱(chēng)
{
var list = new List<object>();
for (int i = 0; i < 10; i++)
{
list.Add(new { ProductId = 16395 + i, ProductCode = $"{16395 + i}", ProductName = $"{16395 + i}" });
}
var result = await db.Update(list.ToList()).As("Product").Where("ProductId").ExecuteAsync();
Console.WriteLine(result);
}
#endregion
#region 查
//返回單個(gè)對(duì)象
{
var data = await db.Query<ProductModel>().Where(w => w.ProductId == 1).FirstAsync();
}
//返回列表
{
var data = await db.Query<ProductModel>().ToListAsync();
}
//返回字典
{
var data = await db.Query<ProductModel>().DictionaryAsync();
}
//返回字典列表
{
var data = await db.Query<ProductModel>().DictionaryListAsync();
}
//分頁(yè)查詢(xún)
{
var data = await db.Query<ProductModel>().ToPageListAsync(1, 10);
Console.WriteLine(JsonSerializer.Serialize(data.Data));//頁(yè)數(shù)據(jù)
Console.WriteLine($"總數(shù):{data.Count}");
}
//聯(lián)表查詢(xún)
{
var data = await db.Query<ProductModel>().InnerJoin<ProductCategoryModel>((a, b) => a.CategoryId == b.CategoryId).ToListAsync();
}
//分組查詢(xún)
{
var data = await db.Query<ProductModel>().GroupBy(g => g.ProductName).Select(s => new { Count = 1.Count(), s.ProductName }).ToListAsync();
}
//排序查詢(xún)
{
var data = await db.Query<ProductModel>().OrderBy(o => o.ProductName).ToListAsync();
}
//動(dòng)態(tài)條件表達(dá)式
{
var obj = new { ProductName = "測(cè)試" };
var ex = DynamicWhereExpression.Create<ProductModel>().AndIF(!string.IsNullOrWhiteSpace(obj.ProductName), a => a.ProductName == obj.ProductName);
var data = await db.Query<ProductModel>().Where(ex.Build()).ToListAsync();
}
// 合并查詢(xún)
{
var query1 = db.Query<ProductModel>().Where(w => w.ProductId < 100);
var query2 = db.Query<ProductModel>().Where(w => w.ProductId > 100);
var data = await db.UnionAll(query1, query2).ToListAsync();
}
#endregion
#region 批量復(fù)制 建議數(shù)據(jù)量達(dá)到500以上使用這個(gè)方法 僅支持 SqlServer MySql Oracle PostgreSql
{
var list = new List<ProductModel>();
for (int i = 1; i <= 10000; i++)
{
list.Add(new ProductModel() { ProductCode = i.ToString(), ProductName = $"測(cè)試{i}" });
}
// 因?yàn)?nbsp;ProductModel 類(lèi)還有其它屬性 所以需要使用 Select 擴(kuò)展方法 顯示指定要導(dǎo)入的屬性名稱(chēng)和表名稱(chēng)
var result = await db.BigData().BulkCopyAsync(list.Select(s => new { s.ProductCode, s.ProductName }), "Product");
Console.WriteLine(result);
}
#endregion
方法太多 寫(xiě)文檔是個(gè)體力活 更多請(qǐng)看源碼https://gitee.com/China-Mr-zhong/Fast.Framework
轉(zhuǎn)自:China-Mr-zhong
鏈接:cnblogs.com/China-Mr-zhong/p/15992962.html
