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. centOS 强制卸载PHP

    centOS上的php过低是需要重新安装时,不得不卸载自定义安装,如下操作 查看php版本命令: #php -v 这个命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #p ...

  2. 如何添加自己的code snippet

    好了我们开始说吧 1.先建一个后缀名为.sublime-snippet的文件

  3. cmd中删除、添加、修改注册表命令

    转自:http://www.jb51.net/article/30586.htm regedit的运行参数 REGEDIT [/L:system] [/R:user] filename1 REGEDI ...

  4. 接口里的default,static方法

    我们都知道接口里的变量默认隐含类型是public static final,也是就是说是常量.而方法默认类型是public abstract,所以接口的方法都是抽象方法,但是事实真的是这样吗? 我的P ...

  5. go基础——运算符

    算数运算符 /* 算术运算符:+,-,*,/,%,++,-- */ a := 10 b := 3 sum := a + b //加减乘类似 fmt.Printf("%d + %d = %d\ ...

  6. Java两个整数相除保留n位小数

    方式1:被除数转double后,除以除数,结果是一个double类型的数,将double结果按要求保留n位小数即可. 保留n位小数的写法 int a = 10; int b = 3; double r ...

  7. 系统基础优化( 创建yum私有仓库最详细操作及解释 )

    目录 系统基础优化 一.Linux中安装软件的方式 安装方式 三种安装方式的区别 二.RPM安装☆ 1.安装及其他命令 2.手动下载软件包,可将其拖入shell中自动传入 1).手动网页下载软件包 2 ...

  8. 从 MMU 看内存管理

    在计算机早期的时候,计算机是无法将大于内存大小的应用装入内存的,因为计算机读写应用数据是直接通过总线来对内存进行直接操作的,对于写操作来说,计算机会直接将地址写入内存:对于读操作来说,计算机会直接读取 ...

  9. SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现

      针对业务开发人员通常面对的业务需求,我们将日志分为操作(请求)日志和系统运行日志,操作(请求)日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作,便于分析统计用户行为: ...

  10. 使用docker部署awx-1.7.1.0(ansible图形化界面)

    文章目录 关于环境 下载awx 下载安装所需依赖 安装docker-compose 配置inventory文件 出现的报错 TASK [local_docker : Run migrations in ...