好奇害死猫

一直觉得ORM框架好用、功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! 随着发际线后移高亮意识到优秀程序员写的优秀的ORM框架会做一些Sql优化,Sql优化不是一成不变的,ORM框架不会根据项目业务场景等主动优化Sql语句。如果ORM真的强大的到开发人员不需要关注Sql,会针对当前项目情况做出相对应很好的优化,必然会增加ORM框架的体积、带来性能等相关问题。知己知彼,百战不殆。一直想探索ORM原理,为什么调用ORM Add或Insert方法都可以把实体写入到数据库???由于好奇之心我准备写一个ORM系列随笔,浅谈对ORM的理解,作者水平有限欢迎园友纠正错误及不恰当之处。

千里之行始于足下


ORM对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

技术栈: .NET Core 3.1 + MySql + Autofac + Swagger

官方地址传送:

微软NET Core 3.1: 中文https://docs.microsoft.com/zh-cn/dotnet/   英文https://docs.microsoft.com/en-us/dotnet/

MySql 8.x 文档: https://dev.mysql.com/doc/

Autofac文档: 中文https://autofaccn.readthedocs.io/zh/latest/   英文https://autofaccn.readthedocs.io/en/latest/

Swagger文档: https://swagger.io/docs/

目前计划

手撸ORM浅谈ORM框架之基础篇

手撸ORM浅谈ORM框架之Add篇

手撸ORM浅谈ORM框架之Update篇

手撸ORM浅谈ORM框架之Delete篇

手撸ORM浅谈ORM框架之Query篇

后续待定。。。。。。

MySql 8.x 坎(待解决)


//Grant all privileges on learndb.* to 'learn_user@'@'%'

//> 1410 - You are not allowed to create a user with GRANT
//Sql = @"CREATE DATABASE IF NOT EXISTS learndb;"

因此,权限需要先手动授予: 服务器权限-》Create

注:遇到的项目中一般都是数据库优先或者使用的EntityFramework来创建数据库,MySql8.x命令授权给用户不太熟练。

新风尚WebApi

.NET Framework使用静态资源除了保护文件夹可以直接添加需要的静态资源文件夹即可;.NET Core使用静态文件需要在Startup-》Configure 方法中启用静态文件UseStaticFiles并且文件夹的名称:wwwroot,否则禁止访问静态资源。WebApi添加wwwroot文件夹存放静态资源,.Net Core中需要手动添加swagger静态样式资源,下载地址 : swagger-ui ,您也可以使用项目中的wwwroot里面的样式。

Api神器Swagger

Startup-》ConfigureServices 方法中添加Swagger 文档doc、xml、security等信息。新版本Swashbuckle.AspNetCore.Swagger有一些改动,例如SwaggerDoc-》OpenApiInfo的属性TermsOfService由String修改为Uri,在对TermsOfService赋值时如果非Uri或String无法转换正确的Uri项目Debug时会抛出下面异常。

System.UriFormatException
HResult=0x80131537
Message=Invalid URI: The format of the URI could not be determined.

 1 private const string ProjectName = "Learn.WebApi";
2
3 // This method gets called by the runtime. Use this method to add services to the container.
4 public void ConfigureServices(IServiceCollection services)
5 {
6 #region Swagger
7
8 services.AddSwaggerGen(c =>
9 {
10 c.SwaggerDoc("v1", new OpenApiInfo
11 {
12 Title = ProjectName,
13 Version = "v1",
14 Description = $"{ProjectName} HTTP API ",
15 TermsOfService = new Uri("https://github.com/dingshuanglei"),
16 Contact = new OpenApiContact { Name = "丁双磊", Email = "shuangleiding@163.com", Url = new Uri("https://github.com/dingshuanglei") }
17 });
18
19 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
20 var xmlPath = Path.Combine(basePath, $"{ProjectName}.xml");
21 c.IncludeXmlComments(xmlPath, true);
22 var modelXmlPath = Path.Combine(basePath, "Learn.Model.xml");
23 c.IncludeXmlComments(modelXmlPath, true);
24
25 // Add security definitions
26 c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
27 {
28 Description = "Please enter into field the word 'Bearer' followed by a space and the JWT value",
29 Name = "token",
30 In = ParameterLocation.Header,
31 Type = SecuritySchemeType.ApiKey,
32 });
33 c.AddSecurityRequirement(new OpenApiSecurityRequirement
34 {
35 {
36 new OpenApiSecurityScheme
37 {
38 Reference = new OpenApiReference()
39 {
40 Id = "Bearer",
41 Type = ReferenceType.SecurityScheme
42 }
43 }, Array.Empty<string>()
44 }
45 });
46 });
47
48 #endregion
49
50 #region db init
51
52 InitDbTable.InitTable();
53
54 #endregion
55
56 services.AddControllers();
57 }

Startup-》Configure 方法中启用Swagger和静态文件UseStaticFiles。

 1 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
2 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
3 {
4 if (env.IsDevelopment())
5 {
6 app.UseDeveloperExceptionPage();
7 }
8
9 app.UseRouting();
10
11 #region Swagger
12 app.UseSwagger();
13 app.UseSwaggerUI(c =>
14 {
15 c.SwaggerEndpoint("/swagger/v1/swagger.json", $"v1");
16 c.RoutePrefix = string.Empty;
17 });
18 #endregion
19
20 app.UseAuthorization();
21
22 //使用静态文件
23 app.UseStaticFiles();
24
25 app.UseEndpoints(endpoints =>
26 {
27 endpoints.MapControllers();
28 });
29 }

Program-》CreateHostBuilder 方法中将默认ServiceProviderFactory指定为AutofacServiceProviderFactory。

1 public static IHostBuilder CreateHostBuilder(string[] args) =>
2 Host.CreateDefaultBuilder(args)
3 //将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
4 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
5 .ConfigureWebHostDefaults(webBuilder =>
6 {
7 webBuilder.UseStartup<Startup>();
8 });

Autofac Ioc

Startup-》添加ConfigureContainer方法注入需要Ioc管理的类及类库,当前项目中使用的注入没有特殊的需求,普通的注入业务层和数据访问层类库,也可以根据您自身项目的需要指定注入的生命周期、单接口多实现等等。

 1 /// <summary>
2 /// autofac ioc
3 /// </summary>
4 /// <param name="builder"></param>
5 public void ConfigureContainer(ContainerBuilder builder)
6 {
7 //使用单例模式
8 //builder.RegisterType<Test>().As<ITest>().SingleInstance().PropertiesAutowired();
9
10 //单接口多实现
11 //builder.RegisterType<TestOne>().Named<ITest>(nameof(TestOne));
12 //builder.RegisterType<TestTwo>().Named<ITest>(nameof(TestTwo));
13
14 Assembly[] assembliesService = new Assembly[] { Assembly.Load("Learn.Service") };
15 builder.RegisterAssemblyTypes(assembliesService).Where(type => !type.IsAbstract && typeof(IocService).IsAssignableFrom(type)).AsImplementedInterfaces().PropertiesAutowired();
16
17 Assembly[] assembliesRepository = new Assembly[] { Assembly.Load("Learn.Repository") };
18 builder.RegisterAssemblyTypes(assembliesRepository).Where(type => !type.IsAbstract).AsImplementedInterfaces().PropertiesAutowired();
19 }

代码下载地址: SourceCode  作者水平有限欢迎园友纠正错误及不恰当之处,予以及时修正以免误导他人!

手撸ORM浅谈ORM框架之基础篇的更多相关文章

  1. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  2. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  3. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  4. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. 手撸基于swoole 的分布式框架 实现分布式调用(20)讲

    最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...

  6. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  7. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  8. 13.Object-C--浅谈Foundation框架常用的结构体

    ------- android培训.iOS培训.期待与您交流! ---------- 昨天学习了Foundation框架中常用的结构体,下面我简单的总结一下,如果错误麻烦请留言指正,谢谢! Found ...

  9. 浅谈chainer框架

    一 chainer基础 Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.The ...

随机推荐

  1. bootstrap-table存在合并单元格怎么处理数据

    效果如图: js文件如下: $(function () { initTable() $('#load_vip').change(function () { $ .ajax({ type: 'POST' ...

  2. shell小技巧(4)AIX和Linux计算天前日期

    Linux计算天前日期: date -d "- day" +%Y%m%d AIX计算5天前日期: perl -e "use POSIX qw(strftime); pri ...

  3. opentracting+jager分布式链路追踪探索实践

    一.Opentracing opentracing通过提供平台无关.厂商无关的API,使得开发人员可以方便地实现追踪系统.opentracing提供了用于运营支撑系统和针对特定平台的辅助程序库,被跟踪 ...

  4. 单应用模式 - Layuiadmin单页版放入TP6.0的部署方案

    thinkphp6.0.3单应用模式.layuiadmin1.4.0单页版,不需要tp的视图驱动 1. 复制 src.start 两个文件夹 2. 粘贴到 thinkphp 的 public 目录下 ...

  5. Ubuntu下开启/关闭防火墙及端口

    有管理员权限可省略sudo. 1.查看端口开启状态 sudo ufw status 2.开启某个端口(以8866为例) sudo ufw allow 8866 3.开启防火墙 sudo ufw ena ...

  6. JS基础回顾_函数

    函数 不要使用C风格的大括号 // log function return1() { return { name: 'oceans', } } function return2() { return ...

  7. java 求水仙花数

    package com.yc.bean; public class ShuiXianHua { public static void main(String[] args) { /** * 题目:打印 ...

  8. [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)

    题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...

  9. Docker应用安装

    一.安装mysql 1.查看可用的 MySQL 版本 访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags . 可以通过 Sort by 查看其 ...

  10. 浅入webpack

    webpack.base.conf---webpack基础配置: f利用各种文件对项目中的文件进行处理 利用loader,preloader对工程文件进行处理,输出新的工程文件(options中对文件 ...