• 重磅开源:基于.NET 6.0 自研轻量级ORM框架


    Fast Framework

    项目:https://gitee.com/China-Mr-zhong/Fast.Framework

    一、前言

    1、为了实现快速开发,省去编写大量Sql时间,更好的面向对象编程由此诞生了 Fast Framework

    2、Fast Framework 是一个基于.NET 6.0 封装的轻量级 ORM 框架 支持数据库 SqlServer Oracle MySql PostgreSql Sqlite 由于底层使用System.Data.Common 抽象类封装 理论支持所有Ado.Net 实现的类库,差异部分可能需要额外处理。

    3、框架

    优点:体积小 流畅API 使用更加简单 性能高

    缺点:不具备有自动建库建表迁移等复杂的功能 由于不同数据库差异较大 实现较为复杂 所以暂时不考虑实现

    二、项目明细 (后缀为Test均为测试项目)

    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

    三、快速入门

    1、手动创建

    1. var options = new DefaultDbOptions() //数据选项
    2.                 {
    3.                     DbType = DbType.MySQL,
    4.                     ProviderName = "MySqlConnector",
    5.                     FactoryName = "MySqlConnector.MySqlConnectorFactory,MySqlConnector",
    6.                     ConnectionStrings = "server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=3;max pool size=100;connect timeout =30;AllowLoadLocalInfile=True;"
    7.                 };
    8.             var ado = new Ado<DefaultDbOptions>(options);//原生Ado
    9.             var db = new DbContext<DefaultDbOptions>(ado);//数据库上下文

    2、依赖注入

    1. var builder = WebApplication.CreateBuilder(args);
    2. // 正式项目请用配置文件注入,为了测试方便直接引用实现类库
    3. builder.Services.AddScoped<IAdo<DefaultDbOptions>, Ado<DefaultDbOptions>>();
    4. builder.Services.AddScoped<IDbContext<DefaultDbOptions>, DbContext<DefaultDbOptions>>();

    3、加载Json配置文件

    builder.Services.Configure<DefaultDbOptions>(configuration.GetSection("DbFactory:MySqlDb"));
    

    4、Json 格式

    1. "DbFactory": {
    2.     "MySQLDb": {
    3.       "DbType""MySQL",
    4.       "ProviderName""MySqlConnector",
    5.       "FactoryName""MySqlConnector.MySqlConnectorFactory,MySqlConnector",
    6.       "ConnectionStrings""server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=3;max pool size=100;connect timeout =30;"
    7.     },
    8.     "SQLServerDb": {
    9.       "DbType""SQLServer",
    10.       "ProviderName""System.Data.SqlClient",
    11.       "FactoryName""System.Data.SqlClient.SqlClientFactory,System.Data",
    12.       "ConnectionStrings""server=localhost;database=Test;user=sa;pwd=123456789;min pool size=3;max pool size=100;connect timeout =30;"
    13.     },
    14.     "OracleDb": {
    15.       "DbType""Oracle",
    16.       "ProviderName""Oracle.ManagedDataAccess.Client",
    17.       "FactoryName""Oracle.ManagedDataAccess.Client.OracleClientFactory,Oracle.ManagedDataAccess",
    18.       "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;"
    19.     },
    20.     "PostgreSQLDb": {
    21.       "DbType""PostgreSQL",
    22.       "ProviderName""Npgsql",
    23.       "FactoryName""Npgsql.NpgsqlFactory,Npgsql",
    24.       "ConnectionStrings""host=localhost;database=test;userid=postgres;pwd=123456789;port=5432;"
    25.     },
    26.     "SQLiteDb": {
    27.       "DbType""SQLite",
    28.       "ProviderName""System.Data.SQLite",
    29.       "FactoryName""System.Data.SQLite.SQLiteFactory,System.Data.SQLite",
    30.       "ConnectionStrings""data source=mysqlite.db;pooling=true;"
    31.     }
    32.   }

    5、Controller 构造方法注入已注册的DbContext对象

    1. namespace Fast.Framework.Web.Test.Controllers
    2. {
    3.     [Route("api/[controller]/[action]")]
    4.     [ApiController]
    5.     public class ProductController : ControllerBase
    6.     {
    7.         /// <summary>
    8.         /// 数据库
    9.         /// </summary>
    10.         private readonly IDbContext<DefaultDbOptions> db;
    11.         /// <summary>
    12.         /// 日志
    13.         /// </summary>
    14.         private readonly ILogger<ProductController> logger;
    15.         /// <summary>
    16.         /// 构造方法
    17.         /// </summary>
    18.         /// <param name="db"></param>
    19.         public ProductController(ILogger<ProductController> logger, IDbContext<DefaultDbOptions> db)
    20.         {
    21.             this.db = db;
    22.             this.logger = logger;
    23.         }
    24.     }
    25. }

    6、示例

    1. #region 增 删 改
    2. //实体对象插入
    3. {
    4.     var result = await db.Insert(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).ExecuteAsync();
    5.     Console.WriteLine(result);
    6. }
    7. //实体对象插入并返回自增ID 仅支持 SQLServer Mysql Sqlite
    8. {
    9.     var result = await db.Insert(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).ExecuteReturnIdentityAsync();
    10.     Console.WriteLine(result);
    11. }
    12. //实体对象列表插入 列表插入不支持批量返回自增ID
    13. {
    14.     var list = new List<ProductModel>();
    15.     list.Add(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" });
    16.     list.Add(new ProductModel() { ProductCode = "1002", ProductName = "测试产品2" });
    17.     var result = await db.Insert(list).ExecuteAsync();
    18.     Console.WriteLine(result);
    19. }
    20. //匿名对象插入 必须使用 As 方法显示指定表名称
    21. {
    22.     var result = db.Insert(new { ProductCode = "1001", ProductName = "测试产品1" }).As("Product").ExecuteAsync();
    23.     Console.WriteLine(result);
    24. }
    25. //匿名对象列表插入 必须使用As 显示指定表名称
    26. {
    27.     var list = new List<object>();
    28.     list.Add(new { ProductCode = "1001", ProductName = "测试产品1" });
    29.     list.Add(new { ProductCode = "1002", ProductName = "测试产品2" });
    30.     var result = await db.Insert(list).As("Product").ExecuteAsync();
    31.     Console.WriteLine(result);
    32. }
    33. //实体无条件删除
    34. {
    35.     var result = await db.Delete<ProductModel>().ExecuteAsync();
    36.     Console.WriteLine(result);
    37. }
    38. //实体条件删除
    39. {
    40.     var result = await db.Delete<ProductModel>().Where(w => w.ProductId == 1).ExecuteAsync();
    41.     Console.WriteLine(result);
    42. }
    43. //父类对象删除
    44. {
    45.     var result = db.Delete<object>().As("Product").ExecuteAsync();
    46.     Console.WriteLine(result);
    47. }
    48. //匿名对象条件删除
    49. {
    50.     var obj = new { ProductCode = "测试" };
    51.     var result = await db.Delete(obj).Where(w => w.ProductCode == obj.ProductCode).As("Product").ExecuteAsync();
    52.     Console.WriteLine(result);
    53. }
    54. //实体对象无条件更新
    55. {
    56.     var result = await db.Update(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).ExecuteAsync();
    57.     Console.WriteLine(result);
    58. }
    59. //实体对象条件更新
    60. {
    61.     var result = await db.Update(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).Where(w => w.ProductId == 1).ExecuteAsync();
    62.     Console.WriteLine(result);
    63. }
    64. //实体对象列表更新
    65. {
    66.     var list = new List<ProductModel>();
    67.     for (int i = 0; i < 10; i++)
    68.     {
    69.         list.Add(new ProductModel() { ProductId = 16395 + i, ProductCode = $"{16395 + i}", ProductName = $"{16395 + i}" });
    70.     }
    71.     var result = await db.Update(list).ExecuteAsync();
    72.     Console.WriteLine(result);
    73. }
    74. //匿名对象无条件更新
    75. {
    76.     var result = await db.Update(new { ProductCode = "1001", ProductName = "测试产品1" }).As("Product").ExecuteAsync();
    77.     Console.WriteLine(result);
    78. }
    79. //匿名对象条件更新
    80. {
    81.     var result = await db.Update(new { ProductId = 1, ProductCode = "1001", ProductName = "测试产品1" }).Where(w => w.ProductId == 1).As("Product").ExecuteAsync();
    82.     Console.WriteLine(result);
    83. }
    84. //匿名对象列表更新 需要显示指定主键名称
    85. {
    86.     var list = new List<object>();
    87.     for (int i = 0; i < 10; i++)
    88.     {
    89.         list.Add(new { ProductId = 16395 + i, ProductCode = $"{16395 + i}", ProductName = $"{16395 + i}" });
    90.     }
    91.     var result = await db.Update(list.ToList()).As("Product").Where("ProductId").ExecuteAsync();
    92.     Console.WriteLine(result);
    93. }
    94. #endregion
    95. #region 查
    96. //返回单个对象
    97. {
    98.     var data = await db.Query<ProductModel>().Where(w => w.ProductId == 1).FirstAsync();
    99. }
    100. //返回列表
    101. {
    102.     var data = await db.Query<ProductModel>().ToListAsync();
    103. }
    104. //返回字典
    105. {
    106.     var data = await db.Query<ProductModel>().DictionaryAsync();
    107. }
    108. //返回字典列表
    109. {
    110.     var data = await db.Query<ProductModel>().DictionaryListAsync();
    111. }
    112. //分页查询
    113. {
    114.     var data = await db.Query<ProductModel>().ToPageListAsync(110);
    115.     Console.WriteLine(JsonSerializer.Serialize(data.Data));//页数据
    116.     Console.WriteLine($"总数:{data.Count}");
    117. }
    118. //联表查询
    119. {
    120.     var data = await db.Query<ProductModel>().InnerJoin<ProductCategoryModel>((a, b) => a.CategoryId == b.CategoryId).ToListAsync();
    121. }
    122. //分组查询
    123. {
    124.     var data = await db.Query<ProductModel>().GroupBy(g => g.ProductName).Select(s => new { Count = 1.Count(), s.ProductName }).ToListAsync();
    125. }
    126. //排序查询
    127. {
    128.     var data = await db.Query<ProductModel>().OrderBy(o => o.ProductName).ToListAsync();
    129. }
    130. //动态条件表达式
    131. {
    132.     var obj = new { ProductName = "测试" };
    133.     var ex = DynamicWhereExpression.Create<ProductModel>().AndIF(!string.IsNullOrWhiteSpace(obj.ProductName), a => a.ProductName == obj.ProductName);
    134.     var data = await db.Query<ProductModel>().Where(ex.Build()).ToListAsync();
    135. }
    136. // 合并查询
    137. {
    138.     var query1 = db.Query<ProductModel>().Where(w => w.ProductId < 100);
    139.     var query2 = db.Query<ProductModel>().Where(w => w.ProductId > 100);
    140.     var data = await db.UnionAll(query1, query2).ToListAsync();
    141. }
    142. #endregion
    143. #region 批量复制 建议数据量达到500以上使用这个方法 仅支持 SqlServer MySql Oracle PostgreSql
    144. {
    145.     var list = new List<ProductModel>();
    146.     for (int i = 1; i <= 10000; i++)
    147.     {
    148.         list.Add(new ProductModel() { ProductCode = i.ToString(), ProductName = $"测试{i}" });
    149.     }
    150.     // 因为 ProductModel 类还有其它属性 所以需要使用 Select 扩展方法 显示指定要导入的属性名称和表名称
    151.     var result = await db.BigData().BulkCopyAsync(list.Select(s => new { s.ProductCode, s.ProductName }), "Product");
    152.     Console.WriteLine(result);
    153. }
    154. #endregion

    方法太多 写文档是个体力活 更多请看源码

     https://gitee.com/China-Mr-zhong/Fast.Framework

  • 相关阅读:
    Java生成二维码工具
    PyQt5开发相关
    Spring Boot的魔法:构建高效Java应用的秘诀
    国庆作业 day1
    求一个网页设计作业——个人博客(HTML+CSS)
    二十六、java版 SpringCloud分布式微服务云架构之Java 接口
    SpringMVC返回不带引号的字符串方案汇总
    thinkphp5.1 获取缓存cache(‘cache_name‘)特别慢,php 7.0 unserialize 特别慢
    扩展欧几里得算法的实现
    redis实战-redis实现好友关注&消息推送
  • 原文地址:https://blog.csdn.net/biyusr/article/details/126726532