好奇害死猫

一直觉得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. 小程序开发-block组件的使用

    微信小程序中,block不是一个组件,而是一个包装元素,不会在页面中做任何渲染. 使用情况:条件渲染 wx:if 因为 wx:if 是一个控制属性,需要将它添加到一个标签/组件上,用于控制隐藏与显示. ...

  2. Fabric1.4 kafka共识的多orderer集群

    https://www.cnblogs.com/zhangmingcheng/p/10556469.html#FeedBack https://yq.aliyun.com/articles/63746 ...

  3. Webpack 打包优化之体积篇

    谈及如今欣欣向荣的前端圈,不仅有各类框架百花齐放,如Vue, React, Angular等等,就打包工具而言,发展也是如火如荼,百家争鸣:从早期的王者Browserify, Grunt,到后来赢得宝 ...

  4. Linux搭建SonarQube

    环境:linux+jdk8+mysql5.7.31+sonarqube7.5+sonar-scanner-4.4+jenkins2.249+sonar-l10n-zh-plugin-1.25.jar ...

  5. 虚拟机安装centos常见问题

    一.centos下载安装 环境:win10系统,虚拟机vm12, centos6.5 http://vault.centos.org/ 链接打开 选择6.5=>isos/=>x86_64= ...

  6. docker启动容器报错 Unknown runtime specified nvidia.

    启动docker容器时,报错 问题复现 当我启动一个容器时,运行以下命令: docker run --runtime=nvidia .... 后面一部分命令没写出来,此时报错的信息如下: docker ...

  7. 刀哥多线程自动释放池autoreleasepool

    自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...

  8. [算法]美团春招笔试题C-求有趣子序列数(DP)

    题目 输入n,以及长度为n的数组元素 输出数组的非空子序列中有多少个"有趣序列"mod 998244353,有趣序列指所有元素满足arr[i]%i == 0, i从0记. 例: 输 ...

  9. [剑指Offer]66-构建乘积数组

    题目 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1].不能使用除法. 题 ...

  10. Hadoop演进与Hadoop生态

    1.了解对比Hadoop不同版本的特性,可以用图表的形式呈现. (1)0.20.0~0.20.2: Hadoop的0.20分支非常稳定,虽然看起来有些落后,但是经过生产环境考验,是 Hadoop历史上 ...