首先给大家看一下这个小项目的结构(一个 WebAPI 的小项目):
上面红框里的文件是这篇文章所涉及的主要文件。
首先在你的项目中添加 MySQL 的支持,在 NuGet 上搜索 MySql 并安装第三方库(不要选错了哟~),如下图:
创建一个MySQL数据库连接信息实体类,这个类会替代我们常用的连接字符串,而且可以实现对各个参数的配置、热修改。
/// <summary> MySQL数据库连接信息实体类
/// </summary>
public class MySqlDBConnectInfo
{
/// <summary> 唯一别名(用来区分是哪个链接,推荐策略:服务地址-数据库名)
/// </summary>
public string UniqueAlias { get; set; }
/// <summary> 数据库服务连接地址,例:"127.0.0.1"
/// </summary>
public string Server { get; set; }
/// <summary> 数据库服务连接端口号
/// </summary>
public uint Port { get; set; }
/// <summary> 连接的数据库
/// </summary>
public string Database { get; set; }
/// <summary> 连接数据库的用户名
/// </summary>
public string UserID { get; set; }
/// <summary> 用户密码
/// </summary>
public string Password { get; set; }
/// <summary> 设置字符编码,例:"utf8"
/// </summary>
public string CharacterSet { get; set; }
/// <summary> 连接超时时间,单位秒
/// </summary>
public uint ConnectionTimeout { get; set; }
/// <summary> 数据库执行超时时间,单位秒
/// </summary>
public uint DefaultCommandTimeout { get; set; }
/// <summary> 是否开启连接池,true
/// </summary>
public bool Pooling { get; set; }
/// <summary> 连接池中最小连接数
/// </summary>
public uint MinimumPoolSize { get; set; }
/// <summary> 连接池中最大连接数
/// </summary>
public uint MaximumPoolSize { get; set; }
/// <summary> 连接池中连接对象存活时间,单位秒
/// </summary>
public uint ConnectionLifeTime { get; set; }
/// <summary> 连接是否使用压缩,true
/// </summary>
public bool UseCompression { get; set; }
/// <summary> 表示连接池程序是否会自动登记创建线程的当前事务语境中的连接,ture
/// </summary>
public bool AutoEnlist { get; set; }
}
新建一个类 StartupInitMySqlConfig,用来控制程序启动时初始化MySQL数据库配置信息
/// <summary> 启动时初始化MySQL数据库配置信息
/// </summary>
public static class StartupInitMySqlConfig
{
/// <summary> 数据库连接信息配置文件 的 文件名 (MySqlConnectionConfig.xml)
/// </summary>
private const string MySqlDBConnectConfigFilename = "MySqlConnectionConfig.xml";
/// <summary> 唯一别名 的 存储值
/// </summary>
private static string UniqueAliasSV = string.Empty;
/// <summary>
/// 唯一别名 锁;避免同时被修改
/// </summary>
private static readonly object _uniqueAliasLock = new object();
/// <summary> 唯一别名(用来区分是哪个链接,推荐策略:服务地址_数据库名)
/// </summary>
private static string uniqueAlias = string.Empty;
/// <summary> 唯一别名(用来区分是哪个链接,推荐策略:服务地址_数据库名)
/// </summary>
public static string UniqueAlias
{
get { return uniqueAlias; }
set
{
uniqueAlias = value == null ? string.Empty : value;
}
}
/// <summary> 声明一个[MySqlDBConnectInfo]数据库连接信息对象
/// </summary>
private static MySqlDBConnectInfo dbConnectInfo;
/// <summary> 获取[MySqlDBConnectInfo]数据库连接信息对象(默认取配置文件中的第一个连接对象)
/// </summary>
public static MySqlDBConnectInfo DbConnectInfo
{
get
{
try
{
lock (_uniqueAliasLock)
{
try
{
if (dbConnectInfo == null || UniqueAlias != UniqueAliasSV)
{
UniqueAliasSV = UniqueAlias;
string path = AppDomain.CurrentDomain.BaseDirectory + MySqlDBConnectConfigFilename;
if (!File.Exists(path))
{
dbConnectInfo = null;
throw new Exception("系统找不到数据库连接信息配置文件。");
}
else
{
List<MySqlDBConnectInfo> dbConnectInfoList = XmlTool.XmlFlieToTObject<List<MySqlDBConnectInfo>>(path, Encoding.UTF8);
if (string.IsNullOrWhiteSpace(UniqueAliasSV))
{
dbConnectInfo = dbConnectInfoList[0];
}
else
{
foreach (MySqlDBConnectInfo item in dbConnectInfoList)
{
if (item.UniqueAlias == UniqueAliasSV)
{
dbConnectInfo = item;
break;
}
}
}
}
}
}
catch (Exception ex)
{
dbConnectInfo = null;
throw new Exception("数据库连接信息配置文件[MySqlConfig.xml]转数据库连接信息对象[MySqlDBConnectInfo]时失败。\r\n" + ex.ToString());
}
}
}
catch (Exception ex)
{
dbConnectInfo = null;
throw new Exception("数据库连接信息配置文件[MySqlConfig.xml]转数据库连接信息对象[MySqlDBConnectInfo]时失败。\r\n" + ex.ToString());
}
return dbConnectInfo;
}
set { dbConnectInfo = value; }
}
}
下面是一个 MySQL数据库操作工具类【核心功能都在这】
/// <summary> MySQL数据库操作工具类
/// </summary>
public class MySqlTool
{
/// <summary> 声明一个[MySqlDBConnectInfo]数据库连接信息对象
/// </summary>
private MySqlDBConnectInfo mysqlDbConnectInfo;
/// <summary> 无参构造函数(获取 MySqlConfig.xml 配置文件中的第一个连接对象)
/// </summary>
public MySqlTool()
{
StartupInitMySqlConfig.UniqueAlias = string.Empty;
mysqlDbConnectInfo = StartupInitMySqlConfig.DbConnectInfo;
}
/// <summary> 有参构造函数(获取 MySqlConfig.xml 配置文件中 UniqueAlias 参数所匹配的唯一别名的连接对象)
/// </summary>
/// <param name="uniqueAlias">连接对象的唯一别名,用来区分是哪个链接对象</param>
public MySqlTool(string uniqueAlias)
{
StartupInitMySqlConfig.UniqueAlias = uniqueAlias;
mysqlDbConnectInfo = StartupInitMySqlConfig.DbConnectInfo;
}
/// <summary> 声明一个[MySqlConnection]连接对象
/// </summary>
private MySqlConnection mysqlConnection;
/// <summary> 获取[MySqlConnection]连接对象
/// </summary>
private MySqlConnection MysqlConnection
{
get
{
if (mysqlDbConnectInfo == null)
{
mysqlDbConnectInfo = StartupInitMySqlConfig.DbConnectInfo;
}
if (mysqlConnection == null)
{
try
{
MySqlConnectionStringBuilder connectStr = new MySqlConnectionStringBuilder();
connectStr.Server = mysqlDbConnectInfo.Server;
connectStr.Port = mysqlDbConnectInfo.Port;
connectStr.Database = mysqlDbConnectInfo.Database;
connectStr.UserID = mysqlDbConnectInfo.UserID;
connectStr.Password = mysqlDbConnectInfo.Password;
connectStr.CharacterSet = mysqlDbConnectInfo.CharacterSet;
connectStr.ConnectionTimeout = mysqlDbConnectInfo.ConnectionTimeout;
connectStr.DefaultCommandTimeout = mysqlDbConnectInfo.DefaultCommandTimeout;
connectStr.Pooling = mysqlDbConnectInfo.Pooling;
connectStr.MinimumPoolSize = mysqlDbConnectInfo.MinimumPoolSize;
connectStr.MaximumPoolSize = mysqlDbConnectInfo.MaximumPoolSize;
connectStr.ConnectionLifeTime = mysqlDbConnectInfo.ConnectionLifeTime;
connectStr.UseCompression = mysqlDbConnectInfo.UseCompression;
connectStr.AutoEnlist = mysqlDbConnectInfo.AutoEnlist;
mysqlConnection = new MySqlConnection(connectStr.GetConnectionString(true));
}
catch (Exception ex)
{
mysqlConnection = null;
throw new Exception("创建数据库连接时发生异常。\r\n" + ex.ToString());
}
}
return mysqlConnection;
}
}
/// <summary> 获取当前对象已存在的连接信息[MySqlDBConnectInfo]
/// </summary>
/// <returns></returns>
public MySqlDBConnectInfo GetMySqlConnectInfo()
{
return mysqlDbConnectInfo;
}
/// <summary> 打开数据库连接
/// </summary>
public void OpenConnect()
{
if (MysqlConnection.State == ConnectionState.Closed)
{
try
{
MysqlConnection.Open();
}
catch (Exception ex)
{
StartupInitMySqlConfig.DbConnectInfo = null;
throw new Exception("打开数据库连接时发生异常。\r\n" + ex.ToString());
}
}
else if (MysqlConnection.State == ConnectionState.Broken)
{
try
{
MysqlConnection.Close();
MysqlConnection.Open();
}
catch (Exception ex)
{
StartupInitMySqlConfig.DbConnectInfo = n