1、通过Nuget引用MySqlConnector
MySqlConnector是用于.NET和.NET Core的异步MySQL连接器,MySQL的ADO.NET数据提供程序。它提供的实现,查询和更新从托管代码数据库所需类(DbConnection
,DbCommand
,DbDataReader
,DbTransaction
等)。此库为数据库操作实现真正的异步I/O,而不阻塞(或使用Task.Run在后台线程上运行同步方法)。这极大地提高了执行数据库操作的Web服务器的吞吐量。
官方地址:https://github.com/mysql-net/MySqlConnector
在Nuget管理程序中,搜索'MySqlConnector' =》选中然后点击'安装'。
相关文档:VS(Visual Studio)中Nuget的使用
2、appsettings.json配置文件连接字符串配置
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Error",
"System": "Error",
"Microsoft": "Error"
}
},
"ConnectionStrings": {
"DefaultConnection": "server=127.0.0.1;user id=mysqltest;password=test;port=3306;database=blog;",
}
}
3、封装MySqlConnection连接类
从配置文件读取ConnectionString
,创建连接对象。
using System;
using MySql.Data.MySqlClient;
namespace MySqlConnector.Conn
{
public class AppDb : IDisposable
{
public MySqlConnection Connection;
public AppDb(string connectionString)
{
Connection = new MySqlConnection(connectionString);
}
public void Dispose()
{
Connection.Close();
}
}
}
在Startup.cs
中注入连接对象:
services.AddTransient<AppDb>(_ => new AppDb(Configuration["ConnectionStrings:DefaultConnection"]));
注意:
- Transient:每次从容器 (
IServiceProvider
)中获取的时候都是一个新的实例 - Singleton:每次从同根容器中(同根
IServiceProvider
)获取的时候都是同一个实例 - Scoped:每次从同一个容器中获取的实例是相同的
4、项目示例代码
1)HomeController.cs文件代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using WebApplication2.Models;
namespace WebApplication2.Controllers
{
public class HomeController : Controller
{
private AppDb db;
public HomeController(AppDb app)
{
db = app;
}
public IActionResult Index()
{
return View();
}
// GET api/async
[HttpGet]
public async Task<IActionResult> GetLatest()
{
using (db)
{
await db.Connection.OpenAsync();
var query = new BlogPostQuery(db);
var result = await query.LatestPostsAsync();
return new OkObjectResult(result);
}
}
// GET api/async/5
[HttpGet("{id}")]
public async Task<IActionResult> GetOne(int id)
{
using (db)
{
await db.Connection.OpenAsync();
var query = new BlogPostQuery(db);
var result = await query.FindOneAsync(id);
if (result == null)
return new NotFoundResult();
return new OkObjectResult(result);
}
}
// POST api/async
[HttpPost]
public async Task<IActionResult> Post([FromBody]BlogPost body)
{
using (db)
{
await db.Connection.OpenAsync();
body.Db = db;
await body.InsertAsync();
return new OkObjectResult(body);
}
}
// PUT api/async/5
[HttpPut("{id}")]
public async Task<IActionResult> PutOne(int id, [FromBody]BlogPost body)
{
using (db)
{
await db.Connection.OpenAsync();
var query = new BlogPostQuery(db);
var result = await query.FindOneAsync(id);
if (result == null)
return new NotFoundResult();
result.Title = body.Title;
result.Content = body.Content;
await result.UpdateAsync();
return new OkObjectResult(result);
}
}
// DELETE api/async/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteOne(int id)
{
using (db)
{
await db.Connection.OpenAsync();
var query = new BlogPostQuery(db);
var result = await query.FindOneAsync(id);
if (result == null)
return new NotFoundResult();
await result.DeleteAsync();
return new OkResult();
}
}
// DELETE api/async
[HttpDelete]
public async Task<IActionResult> DeleteAll()
{
using (db)
{
await db.Connection.OpenAsync();
var query = new BlogPostQuery(db);
await query.DeleteAllAsync();
return new OkResult();
}
}
}
}
2)BlogPost代码
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication2.Models
{
public class BlogPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
[JsonIgnore]
public AppDb Db { get; set; }
public BlogPost(AppDb db = null)
{
Db = db;
}
public async Task InsertAsync()
{
var cmd = Db.Connection.CreateCommand() as MySqlCommand;
cmd.CommandText = @"INSERT INTO `BlogPost` (`Title`, `Content`) VALUES (@title, @content);";
BindParams(cmd);
await cmd.ExecuteNonQueryAsync();
Id = (int)cmd.LastInsertedId;
}
public async Task UpdateAsync()
{
var cmd = Db.Connection.CreateCommand() as MySqlCommand;
cmd.CommandText = @"UPDATE `BlogPost` SET `Title` = @title, `Content` = @content WHERE `Id` = @id;";
BindParams(cmd);
BindId(cmd);
await cmd.ExecuteNonQueryAsync();
}
public async Task DeleteAsync()
{
var cmd = Db.Connection.CreateCommand() as MySqlCommand;
cmd.CommandText = @"DELETE FROM `BlogPost` WHERE `Id` = @id;";
BindId(cmd);
await cmd.ExecuteNonQueryAsync();
}
private void BindId(MySqlCommand cmd)
{
cmd.Parameters.Add(new MySqlParameter
{
ParameterName = "@id",
DbType = DbType.Int32,
Value = Id,
});
}
private void BindParams(MySqlCommand cmd)
{
cmd.Parameters.Add(new MySqlParameter
{
ParameterName = "@title",
DbType = DbType.String,
Value = Title,
});
cmd.Parameters.Add(new MySqlParameter
{
ParameterName = "@content",
DbType = DbType.String,
Value = Content,
});
}
}
}
3)BlogPostQuery代码
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication2.Models
{
public class BlogPostQuery
{
public readonly AppDb Db;
public BlogPostQuery(AppDb db)
{
Db = db;
}
public async Task<BlogPost> FindOneAsync(int id)
{
var cmd = Db.Connection.CreateCommand() as MySqlCommand;
cmd.CommandText = @"SELECT `Id`, `Title`, `Content` FROM `BlogPost` WHERE `Id` = @id";
cmd.Parameters.Add(new MySqlParameter
{
ParameterName = "@id",
DbType = DbType.Int32,
Value = id,
});
var result = await ReadAllAsync(await cmd.ExecuteReaderAsync());
return result.Count > 0 ? result[0] : null;
}
public async Task<List<BlogPost>> LatestPostsAsync()
{
var cmd = Db.Connection.CreateCommand();
cmd.CommandText = @"SELECT `Id`, `Title`, `Content` FROM `BlogPost` ORDER BY `Id` DESC LIMIT 10;";
return await ReadAllAsync(await cmd.ExecuteReaderAsync());
}
public async Task DeleteAllAsync()
{
var txn = await Db.Connection.BeginTransactionAsync();
try
{
var cmd = Db.Connection.CreateCommand();
cmd.CommandText = @"DELETE FROM `BlogPost`";
await cmd.ExecuteNonQueryAsync();
await txn.CommitAsync();
}
catch
{
await txn.RollbackAsync();
throw;
}
}
private async Task<List<BlogPost>> ReadAllAsync(DbDataReader reader)
{
var posts = new List<BlogPost>();
using (reader)
{
while (await reader.ReadAsync())
{
var post = new BlogPost(Db)
{
Id = await reader.GetFieldValueAsync<int>(0),
Title = await reader.GetFieldValueAsync<string>(1),
Content = await reader.GetFieldValueAsync<string>(2)
};
posts.Add(post);
}
}
return posts;
}
}
}