好奇害死猫

一直觉得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. 初次使用maven创建web工程发现只有一个idea目录,src,webapp目录都不见了,解决方案

    修bug系列2之 初次使用maven创建web项目的src目录不知所踪 窗外下着下雨,屋内的我学着maven,本以为轻轻松松,没想到还是遇到了bug.好了不说了,来看看我是怎么解决的. 在初次使用ma ...

  2. IT人35岁危机:到底是因为爱还是责任?

    互联网蚕食世界,未来属于IT人. 这是属于互联网的时代,每个人都是网络的弄潮儿,由于网络越来越被需要,互联网IT行业被推上了较高的位置,这也导致IT行业的就业环境火热,越来越多的人被IT行业广阔的发展 ...

  3. xss中shellcode的调用

    shellcode就是利用漏洞所执行的代码 在完整的xss攻击之中,会将shellcode存放在一定的地方,然后触发漏洞,引发shellcode. 1.远程调用执行js 可将js代码单独放在一个js文 ...

  4. [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点

    题解 nodeA走一个链表A(A独有+公共),再走B独有的长度, nodeB走一个链表B(B独有+公共),再走A独有的长度. 结果:两者相遇点即为交点:若没有交点,两者都走到null,会返回null. ...

  5. 第 8 篇:内容支持 Markdown 语法,接口返回包含解析后的 HTML

    作者:HelloGitHub-追梦人物 在 Django博客教程(第二版) 中,我们给博客内容增加了 Markdown 的支持,博客详情接口应该返回解析后的 HTML 内容. 来回顾一下 Post 模 ...

  6. IntelliJ IDEA编辑器激活码

    2020-3-31 日 亲自测试有效,什么时候失效就母鸡了 激活码一: T3ACKYHDVF-eyJsaWNlbnNlSWQiOiJUM0FDS1lIRFZGIiwibGljZW5zZWVOYW1lI ...

  7. python常用os模块

    OS 模块 #os模块就是对操作系统进行操作,使用该模块必须先导入模块: import os #getcwd() 获取当前工作目录(当前工作目录默认都是当前文件所在的文件夹) result = os. ...

  8. SpringBoot普通消息队列线程池配置

    1 package com.liuhuan.study.config; 2 3 import com.google.common.util.concurrent.ThreadFactoryBuilde ...

  9. 关于数学公式Markdown

    打开写博客(这都打不开就...) 再打开"选项". 选"启用数学公式支持"对(以后有用嘻嘻) 在默认编辑器里有Markdown选对. 然后就可以 \[\sum\ ...

  10. xss小游戏通关

    xss url:http://test.ctf8.com/level1.php?name=test 小游戏payload: <script>alert("'test'" ...