Fast Framework

项目地址 https://gitee.com/China-Mr-zhong/Fast.Framework
Author Mr-zhong
Wechat 850856667
Email 850856667@qq.com
QQ群 693979005

一、前言

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

2.Fast Framework 是一个基于NET6.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. 手动创建
var options = new DefaultDbOptions() //数据选项
{
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);//数据库上下文
  1. 依赖注入
var builder = WebApplication.CreateBuilder(args);

// 正式项目请用配置文件注入,为了测试方便直接引用实现类库

builder.Services.AddScoped<IAdo<DefaultDbOptions>, Ado<DefaultDbOptions>>();
builder.Services.AddScoped<IDbContext<DefaultDbOptions>, DbContext<DefaultDbOptions>>();
  1. 加载Json配置文件
builder.Services.Configure<DefaultDbOptions>(configuration.GetSection("DbFactory:MySqlDb"));
  1. 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;"
}
}
  1. Controller 构造方法注入已注册的DbContext对象
namespace Fast.Framework.Web.Test.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ProductController : ControllerBase
{ /// <summary>
/// 数据库
/// </summary>
private readonly IDbContext<DefaultDbOptions> db; /// <summary>
/// 日志
/// </summary>
private readonly ILogger<ProductController> logger; /// <summary>
/// 构造方法
/// </summary>
/// <param name="db"></param>
public ProductController(ILogger<ProductController> logger, IDbContext<DefaultDbOptions> db)
{
this.db = db;
this.logger = logger;
}
}
}
  1. 示例
                #region 增 删 改
//实体对象插入
{
var result = await db.Insert(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).ExecuteAsync();
Console.WriteLine(result);
} //实体对象插入并返回自增ID 仅支持 SQLServer Mysql Sqlite
{
var result = await db.Insert(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).ExecuteReturnIdentityAsync();
Console.WriteLine(result);
} //实体对象列表插入 列表插入不支持批量返回自增ID
{
var list = new List<ProductModel>();
list.Add(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" });
list.Add(new ProductModel() { ProductCode = "1002", ProductName = "测试产品2" });
var result = await db.Insert(list).ExecuteAsync();
Console.WriteLine(result);
} //匿名对象插入 必须使用 As 方法显示指定表名称
{
var result = db.Insert(new { ProductCode = "1001", ProductName = "测试产品1" }).As("Product").ExecuteAsync();
Console.WriteLine(result);
} //匿名对象列表插入 必须使用As 显示指定表名称
{
var list = new List<object>();
list.Add(new { ProductCode = "1001", ProductName = "测试产品1" });
list.Add(new { ProductCode = "1002", ProductName = "测试产品2" });
var result = await db.Insert(list).As("Product").ExecuteAsync();
Console.WriteLine(result);
} //实体无条件删除
{
var result = await db.Delete<ProductModel>().ExecuteAsync();
Console.WriteLine(result);
} //实体条件删除
{
var result = await db.Delete<ProductModel>().Where(w => w.ProductId == 1).ExecuteAsync();
Console.WriteLine(result);
} //父类对象删除
{
var result = db.Delete<object>().As("Product").ExecuteAsync();
Console.WriteLine(result);
} //匿名对象条件删除
{
var obj = new { ProductCode = "测试" };
var result = await db.Delete(obj).Where(w => w.ProductCode == obj.ProductCode).As("Product").ExecuteAsync();
Console.WriteLine(result);
} //实体对象无条件更新
{
var result = await db.Update(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).ExecuteAsync();
Console.WriteLine(result);
} //实体对象条件更新
{
var result = await db.Update(new ProductModel() { ProductCode = "1001", ProductName = "测试产品1" }).Where(w => w.ProductId == 1).ExecuteAsync();
Console.WriteLine(result);
} //实体对象列表更新
{
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);
} //匿名对象无条件更新
{
var result = await db.Update(new { ProductCode = "1001", ProductName = "测试产品1" }).As("Product").ExecuteAsync();
Console.WriteLine(result);
} //匿名对象条件更新
{
var result = await db.Update(new { ProductId = 1, ProductCode = "1001", ProductName = "测试产品1" }).Where(w => w.ProductId == 1).As("Product").ExecuteAsync();
Console.WriteLine(result);
} //匿名对象列表更新 需要显示指定主键名称
{
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 查 //返回单个对象
{
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();
} //分页查询
{
var data = await db.Query<ProductModel>().ToPageListAsync(1, 10);
Console.WriteLine(JsonSerializer.Serialize(data.Data));//页数据
Console.WriteLine($"总数:{data.Count}");
} //联表查询
{
var data = await db.Query<ProductModel>().InnerJoin<ProductCategoryModel>((a, b) => a.CategoryId == b.CategoryId).ToListAsync();
} //分组查询
{
var data = await db.Query<ProductModel>().GroupBy(g => g.ProductName).Select(s => new { Count = 1.Count(), s.ProductName }).ToListAsync();
} //排序查询
{
var data = await db.Query<ProductModel>().OrderBy(o => o.ProductName).ToListAsync();
} //动态条件表达式
{
var obj = new { ProductName = "测试" };
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();
} // 合并查询
{
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 批量复制 建议数据量达到500以上使用这个方法 仅支持 SqlServer MySql Oracle PostgreSql
{
var list = new List<ProductModel>();
for (int i = 1; i <= 10000; i++)
{
list.Add(new ProductModel() { ProductCode = i.ToString(), ProductName = $"测试{i}" });
}
// 因为 ProductModel 类还有其它属性 所以需要使用 Select 扩展方法 显示指定要导入的属性名称和表名称
var result = await db.BigData().BulkCopyAsync(list.Select(s => new { s.ProductCode, s.ProductName }), "Product");
Console.WriteLine(result);
}
#endregion
方法太多 写文档是个体力活 更多请看源码

基于NET 6.0 封装的 Fast.Framework的更多相关文章

  1. 基于AFNetWorking 3.0封装网络请求数据的类

    对于使用 AFNetworking 的朋友来说,很多朋友都是直接调用 AFNetworking的 API ,这样不太好,无法做到全工程统一配置. 最好的方式就是对网络层再封装一层,全工程不允许直接使用 ...

  2. Fast.Framework ORM 于中秋节后 正式开源

    Fast Framework 作者 Mr-zhong 开源项目地址 https://github.com/China-Mr-zhong/Fast.Framework QQ交流群 954866406 欢 ...

  3. Fast.Framework ORM 试用

    简介 Fast.Framework 是一款基于 .NET 6 封装的轻量级ORM框架,支持多种数据库(SQL Server.Oracle.MySQL.PostgreSQL.SQLite). 优点 性能 ...

  4. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

  5. Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  6. 如何让基于.NET 2.0的应用在高版本的系统上运行?

    我们的WinForm项目是基于.NET 2.0开发的,在部署时,发现有些机器没有.NET 2.0,但是即使这些机器有装.NET 2.0 以上的版本,也无法运行我们的程序.这就比较蛋疼了. 我们查了一下 ...

  7. 简单的基于promise的ajax封装

    基于promise的ajax封装 //调用方式: /* ajaxPrmomise({ url:, method:, headers:{} }).then(res=>{}) */ ;(functi ...

  8. 基于Ant Design Vue封装一个表单控件

    开源代码 https://github.com/naturefwvue/nf-vue3-ant 有缺点本来是写在最后的,但是博文写的似乎有点太长了,估计大家没时间往下看,于是就把有缺点写在前面了,不喜 ...

  9. 谈谈基于OAuth 2.0的第三方认证 [下篇]

    从安全的角度来讲,<中篇>介绍的Implicit类型的Authorization Grant存在这样的两个问题:其一,授权服务器没有对客户端应用进行认证,因为获取Access Token的 ...

随机推荐

  1. django之集成第三方支付平台PaysAPI与百度云视频点播服务接入

    PaysAPI直接查看接口文档:https://www.paysapi.com/docindex,比较简单 百度云视频点播服务接入: 1. 准备工作:百度云的示例:http://cyberplayer ...

  2. GDB死锁调试

    1.测试代码 代码中开启两个线程,加锁后轮流输出数据,其中一个线程误将pthread_mutex_unlock(),写成pthread_mutex_lock()代码如下: int g_tickets ...

  3. 微服务架构 | 10.2 使用 Papertrail 实现日志聚合

    目录 前言 1. Papertrail 基础知识 1.1 Papertrail 特点 1.2 Papertrail 是什么 2. 使用 Papertrail 进行日志聚合的示例 2.1 创建 Pape ...

  4. X000011

    P1890 gcd区间 \(\gcd\) 是满足结合律的,所以考虑用 ST 表解决 时间复杂度 \(O((n\log n+m)\log a_i)\) 考虑到 \(n\) 很小,你也可以直接算出所有的区 ...

  5. 「CTSC2010」产品销售

    「CTSC2010」产品销售 30pts的费用流都会吧... 100pts只要模拟费用流就行了,是不是很简单呀( 咕咕咕 令\(M_i\)表示\(i-1\to i\)的正向边,\(M_i^{'}\)表 ...

  6. TCP连接的状态转换图深度剖析

    转载请注明来源:https://www.cnblogs.com/hookjc/ 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (1)第一次握手:建立连接时 ...

  7. ARC下的内存管理

    1.ARC下单对象内存管理 局部变量释放对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = ...

  8. Vue项目中实现文件下载到本地的功能

    公司业务需求,我需要实现一个合同模板,自定义输入内容后生成合同随后导出下载合同.(自定义部分用到的是) 为了实现这个文件下载到本地的功能,真的是废了九牛二虎之力,以至于差点放弃(主要还是自己菜).刚开 ...

  9. springBoot2.*使用redis集群/单机方法

    在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuce. 此处springboot2.x,所以使用的是Lettuce.关于jedis跟 ...

  10. SpringMVC5中,@ModelAttribute注解详解

    看这个注解的前提最好熟悉一下SpringMVC的model组件,该注解可以有五种使用方式: ①②③为 @ModelAttribute 跟@RequestMapping 分开修饰方法,被@ModelAt ...