用NetCore 和Dapper 和mySql做一个简单的实例,

一准备工作

1:VS2017+windos系统,也可以用其他的操作系统和工具

2:一台Cenetos的虚拟机或者虚拟机

二:开始

1:用微软官方的netCore的ToDo项目改造,项目的主体结构如下图,源连接

https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-web-api

1:打开Nuget控制台,安装 MySQL官方.NET Core驱动,并且支持 EF Core

>Install-Package SapientGuardian.MySql.Data -Pre

2:打开Nuget控制台,安装Dapper

>Install-Package Dapper -Pre

3:在Models文件夹下新建ToDoItem 的实体

 public class ToDoItem
{
[Required]
public string ID { get; set; } [Required]
public string Name { get; set; } [Required]
public string Notes { get; set; } public bool Done { get; set; }
}

4:在appsettings.json里面配置MySql的数据库连接字符串,然后点开appsettings.json的属性将“复制到输出目录”项的值改为“始终复制”,

SslMode=none的作用是解决连接的时候报SSL错误的
  "ConnectionStrings": {
"SqlServerConnection": "Server=(LocalDb)\\MSSQLLocalDB, Database=test",
"MySqlConnection": "Server=自己的服务器;Database=test;User ID=root;Password=111111;SslMode=none"
}

5:在Common下面新建一个AppConfigurtaionServices的类,用于读取appsettings.json里面的连接字符串(appsettings.json属性如果没有选中始终复制,在代码运行的时候,

IConfiguration 会报错

)

public class AppConfigurtaionServices
{
public static IConfiguration Configuration { get; set; }
static AppConfigurtaionServices()
{
Configuration = new ConfigurationBuilder()
.Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
.Build();
}
}

6:新建一个Interfaces文件夹,然后下面建一个IToDoRepository的接口类

 public interface IToDoRepository
{
bool DoesItemExist(string id);
IEnumerable<ToDoItem> All();
ToDoItem Find(string id);
int Insert(ToDoItem item);
int Update(ToDoItem item);
int Delete(string id);
}

  

7:新建一个Services然后下面新建ToDoRepository类 是我们的数据仓储类 记得要引用(using Dapper;和 using MySql.Data.MySqlClient;)

 public class ToDoRepository : IToDoRepository
{
private static string DefaultSqlConnectionString = "";
public ToDoRepository()
{
DefaultSqlConnectionString = AppConfigurtaionServices.Configuration.GetConnectionString("MySqlConnection"); }
public static IDbConnection GetSqlConnection(string sqlConnectionString = null)
{
if (string.IsNullOrWhiteSpace(sqlConnectionString))
{
sqlConnectionString = DefaultSqlConnectionString;
}
IDbConnection conn = new MySqlConnection(sqlConnectionString);
conn.Open();
return conn;
}
/// <summary>
/// 获取全部
/// </summary>
/// <returns></returns>
public IEnumerable<ToDoItem> All()
{
using (IDbConnection conn = GetSqlConnection())
{
string strsql = "select * from ToDoItem";
return conn.Query<ToDoItem>(strsql, null);
}
} /// <summary>
/// 查询是否存在
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool DoesItemExist(string id)
{
using (IDbConnection conn = GetSqlConnection())
{
int cout = conn.Query<int>("select count(*) from ToDoItem where ID=@ID", new { ID = id }).FirstOrDefault();
if (cout > 0)
return true;
else
return false;
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int Delete(string id)
{
using (IDbConnection conn = GetSqlConnection())
{
string strsql = "DELETE from ToDoItem where ID=@ID";
return conn.Execute(strsql, new { ID = id });
} } /// <summary>
/// 查询整个对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ToDoItem Find(string id)
{
using (IDbConnection conn = GetSqlConnection())
{
string strsql = "select * from ToDoItem where ID=@ID";
return conn.Query<ToDoItem>(strsql, new { ID = id }).FirstOrDefault();
}
}
/// <summary>
/// 新增项
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public int Insert(ToDoItem item)
{
using (IDbConnection conn = GetSqlConnection())
{
string strsql = "INSERT into ToDoItem(ID,Name,Notes,Done)values(@ID,@Name,@Notes,@Done)";
return conn.Execute(strsql, item);
}
} /// <summary>
/// 修改
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public int Update(ToDoItem item)
{
using (IDbConnection conn = GetSqlConnection())
{
string strsql = " UPDATE ToDoItem SET Name=@Name,Notes=@Notes,Done=@Done where ID=@ID";
return conn.Execute(strsql, item);
}
} }

8:在Controller下面新增一个ToDoItemsController的控制器,记得添加相关的命名空间

 [Route("api/[controller]")]
public class ToDoItemsController : Controller
{
private readonly IToDoRepository _toDoRepository; public ToDoItemsController(IToDoRepository toDoRepository)
{
_toDoRepository = toDoRepository;
} /// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult List()
{
return Ok(_toDoRepository.All());
}
/// <summary>
/// 新增项
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
[HttpPost]
public IActionResult Create([FromBody] ToDoItem item)
{
try
{
if (item == null || !ModelState.IsValid)
{
return BadRequest("没有通过验证");
}
bool itemExists = _toDoRepository.DoesItemExist(item.ID);
if (itemExists)
{
return StatusCode(StatusCodes.Status409Conflict, "已经存在此项");
}
_toDoRepository.Insert(item);
}
catch (Exception)
{
return BadRequest("创建失败");
} return Ok(item);
} /// <summary>
/// 修改项
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
[HttpPut]
public IActionResult Edit([FromBody] ToDoItem item)
{
try
{
if(item==null || !ModelState.IsValid)
return BadRequest("没有通过必填验证");
var existingItem = _toDoRepository.Find(item.ID);
if(existingItem==null)
{
return NotFound("没有发现此记录");
}
_toDoRepository.Update(item);
}
catch(Exception)
{
return BadRequest("修改失败");
}
return NoContent();
} /// <summary>
/// 删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public IActionResult Delete(string id)
{
try
{
var item = _toDoRepository.Find(id);
if (item == null)
return NotFound("没有此记录");
_toDoRepository.Delete(id);
}
catch(Exception )
{
return BadRequest("删除失败");
} return NoContent();
} }

 9:在ConfigureServices里配置IToDoRepository 和ToDoRepository服务

   services.AddSingleton<IToDoRepository, Services.ToDoRepository>();

10:配置Swagger(丝袜哥)具体Swagger的基础知识可以连接到

https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs=visual-studio

10.1:在Nuget控制台添加引用

>Install-Package Swashbuckle.AspNetCore

10.2:在Startup类中配置Swagger

10.2.1:在ConfigureServices方法里面添加Swagger服务

    //添加Swagger服务
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "ToDo API",
Description = "A simple example ASP.NET Core Web API",
TermsOfService = "None",
Contact = new Contact { Name = "Shayne Boyer", Email = "", Url = "https://twitter.com/spboyer" },
License = new License { Name = "Use under LICX", Url = "https://example.com/license" }
}); var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var xmlPath = Path.Combine(basePath, "ToDoApi.xml");
c.IncludeXmlComments(xmlPath);
});

10.2.2:在Configure配置Swagger服务

app.UseSwagger();
//配置Swagger服务
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

10.3:最终的Startup类如下

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.PlatformAbstractions;
using Swashbuckle.AspNetCore.Swagger;
using System.IO;
using ToDoApi.Interfaces; namespace ToDoApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } //添加服务
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); //添加Swagger服务
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "ToDo API",
Description = "A simple example ASP.NET Core Web API",
TermsOfService = "None",
Contact = new Contact { Name = "Shayne Boyer", Email = "", Url = "https://twitter.com/spboyer" },
License = new License { Name = "Use under LICX", Url = "https://example.com/license" }
}); var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var xmlPath = Path.Combine(basePath, "ToDoApi.xml");
c.IncludeXmlComments(xmlPath);
});
services.AddSingleton<IToDoRepository, Services.ToDoRepository>();
} // 配置服务
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSwagger();
//配置Swagger服务
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
//配置开发环境
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseMvc();
}
}
}

10.4:启动项设置为swagger启动

在launchSettings.json做如下修改

这样你的项目用IIS Express启动来就是swagger界面

11:最终效果

11.2:测试获取数据的方法

12:对NetCore的理解还很浅,只是做了一个简单的demo希望能帮到你,只是写了mysql的,如果是要用SqlServer,则修改读取SqlServerConnection的数据连接然后把数据仓储里面的 MySql.Data.MySqlClien改成Sql server的就可以了

13:demo连接:

https://files.cnblogs.com/files/gouguo/ToDoApi.rar

  

net Core做一个webApi的简单实例的更多相关文章

  1. 第四章 .net core做一个简单的登录

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  2. SpringMvc+Mybatis+Maven+Mysql做一个CRUD的简单例子

    本文档结合 SpringMVC. Mybatis. MySQL,说明如何实现一个简单的数据库单表 CRUD操作.开发工具使用集成了spring mvc的eclipse(Spring Tool Suit ...

  3. 一个jsonp的简单实例

    <script type="text/javascript"> //添加<script>标签的方法 function addScriptTag(src){ ...

  4. java构造器执行顺序一个有趣的简单实例

    一 Animal为父类,构造器中调用public(default.protected) say方法,Dog继承了Animal,并重载了say方法.新建Dog对象,查看运行结果,若将Animal中say ...

  5. resteasy简单实例

    1.建一个maven web项目 新建一个maven项目,next,第一个框不要勾选 选择maven-archetype-webapp,建一个web项目 键入项目组织id与项目id 一般此时搭建的只是 ...

  6. .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

    目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...

  7. SpringMVC4+thymeleaf3的一个简单实例(篇五:页面和MySql的数据交互-展示以及存储)

    这一篇将介绍怎样把页面数据保存的MySQL数据库,并将数据库内容展示到页面上.首先做一个基础工作,添加以下jar到lib:1: mysql-connector-Java-5.1.40-bin.jar ...

  8. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  9. 使用React并做一个简单的to-do-list

    1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...

  10. react实例之todo,做一个实时响应的列表操作

    react实例之todo, 做一个实时响应的列表操作 在所有的mvc框架中,最常见的例子不是hello world,而是todo,由于reactjs的简单性,在不引用flux和redux的情况下,我们 ...

随机推荐

  1. k8s部署canal-1.1.6版本实现MySQL数据库数据同步

    1.版本说明 软件&镜像 版本&镜像信息 说明 Kubernetes v1.23.7 k8s服务器 Kuboard v3.5.2.0 k8s连接管理工具 Canal v1.1.6 数据 ...

  2. Java编译异常捕捉与上报笔记

    异常处理机制的作用:增强程序的健壮性 处理编译异常方式一: 在方法声明位置上使用throws关键字抛出,谁调用该方法,就交给谁处理 注意:为Exception的是需要处理的,否则编译器会报错,可以一直 ...

  3. 使用idea的maven项目使用mybatis时遇到的坑

    在使用idea的maven项目中使用mybatis时遇到的一个问题,这个问题困扰了我一段时间,所以我来这里记录一下! 出现的问题是: 我把相同的代码复制到eclipse中,在eclipse中却能正常运 ...

  4. centos7.6安装teamviewer-原来还可以用yum 安装rpm包,自动解决依赖,太爽了

    1.在官网下载teamviewer安装包 2.安装.一直用rpm -ivh 的方式安装rpm包,但是不会自动解决依赖,今天才知道,原来还可以用yum -y install rpm包,自动解决依赖. [ ...

  5. JZOJ 1090. 【SDOI2009】晨跑

    题目 略,luogu上有 解析 一眼费用流 然而怎么建图? 首先我们要挖掘题中的限制条件和性质 一个点只能经过一次 能走的天数最长 满足第二条的条件下走过的路程最短 那么显然是最小费用最大流了 对于后 ...

  6. Python arcpy创建栅格、批量拼接栅格

      本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作.   首先,相关操作所需具体代码如下: import os import arcp ...

  7. Vulhub 漏洞学习之:Fastjson

    Vulhub 漏洞学习之:Fastjson 目录 Vulhub 漏洞学习之:Fastjson 0 背景知识 0.1 FastJson POC解析 0.1.1 基于rmi的利用方式 0.1.2 基于ld ...

  8. 深入解读.NET MAUI音乐播放器项目(三):界面交互

    UI设计的本质是对于产品的理解在界面中多种形式的映射,当需求和定位不同时,对相同的功能表达出了不同的界面和交互方式. 作为播放器,界面可以是千差万别的.<番茄播放器>的iOS平台上我开发了 ...

  9. Android病毒分析基础(二)—ChatGPT提问技巧

    今天我们来用最近比较火的"ChatGPT"学习一下Android病毒分析基础,看看和我们之前学的有什么不同,又能学习到什么新的东西,同时了解一下"ChatGPT" ...

  10. 面向对象程序设计第二次blog

    一.前言 第四次题目集总结-- 题量:较多 难度:较高 知识点: 获取输入字符串的特定字符类型 获取并储存.计算 循环.选择.字符串.数组的使用 继承 类的设计 总结:题目比较难,题量较少,需要用到正 ...