Unity_安装部署本地MySQL数据库(Navicat可视化)
这里拿一个本地部署的MySQL来通信,后面可以把服务器端的数据库来进行通讯,内容大同小异
对于海量的数据且还要随时能够进行增删改查,这时候使用Excel或者Json/XML都不是一个明智的选择,使用数据库可以清晰明了的看到我们数据结构,随时对数据进行更改。
话不多说,上步骤
一、安装MySQL
Unity版本:2021.3.15
VS:2019
MySQL版本:5.7.35
下载地址:MySQL
1:下载SQL到本地后,在此目录F:\MySQL\mysql-5.7.35-winx64下新建一个记事本,内容如下:
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录 ----------是你的文件路径-------------
basedir=D:\mysql-5.7.35-winx64
# 设置mysql数据库的数据的存放目录 ---------是你的文件路径data文件夹自行创建
datadir=D:\MysqlData\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
2:注意上述内容,你需要修改你的文件路径和存放路径,可以自定义
比如:
basedir=F:\MySQL\mysql-5.7.35-winx64
datadir=F:\MysqlData\data
3:保存该记事本,把后缀改成ini即可
至此,安装配置工作就完成了!
二、本地部署
1:Win+R输入cmd,出现cmd窗口

2:右键应用图标,我们可以看到命令提示符,然后再右键命令提示符,选择以管理员身份运行

3:输入D:然后回车
4:然后输入cd + F:\MySQL\mysql-5.7.35-winx64\bin(你的Bin文件夹路径)
5:然后输入mysqld --install(在管理员的身份下安装MySQL)

6:出现上述的命令后,再输入mysqld --initialize --console,代表第一次使用SQL,他会随机出来一个密码,一定要记住这个密码,后续也可以更改
7:然后输入net start mysql,启动MySQL服务器
8:输入mysql -u root -p,代表登录MySQl服务器,然后输入你刚才初始化出来的密码
9:登陆成功!然后输入ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
后续' '内的内容就是你要修改的密码,这里可以根据自己心情
10:然后在控制台输入quit和exit,退出控制台!
11:开始环境配置,此电脑右键->属性->高级系统设置->高级->环境变量->新建环境变量
12:变量名为MYSQL_HOME,变量值为你的MySQL安装路径,然后点击确定

13:找到系统变量里的Path,然后点击编辑->新建,输入%MYSQL_HOME%\bin,确定
14:此电脑右键->管理->服务与应用程序->服务
15:找到MySQL,右键属性,将启动类型改为手动
16:最后,在每次运行MySQL的时候,只需要在管理员身份的控制台中输入net start mysql
三、可视化窗口下载和使用
可视化窗口应用有很多种,这里拿Navicat for MySQL举例
下载地址如下:Navicat
1:下载完成后,打开Navicat,点击连接->MySQL,出现如下窗口

2:点击高级->自定义一下设置的位置,放到你的安装位置,然后点击确定,就会在主页出现你的创建

3:右键你的用户名然后连接,连接成功后,右键,然后新建数据库,打开数据库后会出现

4:然后右键你新建的数据库

5:点击表->新建表,然后就给他添加字段,添加完成后保存,输入下表名,

至此,你的配置工作就完成了!
四、编写SQL语句
1:想在Unity中读取到该数据库,先要导入dll文件,下载地址如下:
下载好了导入到Unity即可!

2:核心访问类SQLHelper代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Data;
using MySql.Data.MySqlClient;
using System;
namespace Lei.Mysql
{
/// <summary>
/// 使用SqlHelper所有方法除了Connent方法外 其他方法一定要先Open(),使用完后在Close() 掉
/// </summary>
public class LeiSqlHelper : IDisposable
{
//
string
_serve,
_port,
_user,
_password,
_dataname,
_format;
string connectStr;
//连接类对象
MySqlConnection conn;
/// <summary>
/// 连接数据库构造方法
/// </summary>
/// <param name="host">IP地址</param>
/// <param name="port">端口</param>
/// <param name="user">用户名</param>
/// <param name="passwd">密码</param>
/// <param name="database">数据库名称</param>
/// <param name="format">字体默认UTF8</param>
public LeiSqlHelper(string host, string port, string user, string passwd, string database, string format)
{
Connect(host, port, user, passwd, database, format);
}
/// <summary>
/// 连接数据库构造方法
/// </summary>
/// <param name="host"></param>
/// <param name="port"></param>
/// <param name="user"></param>
/// <param name="passwd"></param>
/// <param name="database"></param>
public LeiSqlHelper(string host, string port, string user, string passwd, string database)
{
Connect(host, port, user, passwd, database);
}
/// <summary>
/// 连接数据库
/// </summary>
/// <param name="host">IP地址</param>
/// <param name="port">端口</param>
/// <param name="user">用户名</param>
/// <param name="passwd">密码</param>
/// <param name="database">数据库名称</param>
/// <param name="format">字体默认UTF8</param>
public void Connect(string host, string port, string user, string passwd, string database, string format = "utf8")
{
_serve = host;
_port = port;
_user = user;
_password = passwd;
_dataname = database;
_format = format;
connectStr = string.Format("server={0};port = {1}; user = {2} ; password = {3}; database = {4}; charset = {5}", _serve, _port, _user, _password, _dataname, _format);
conn = new MySqlConnection(connectStr);
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void Open()
{
conn.Open();
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
conn.Close();
}
/// <summary>
/// using块回收资源执行
/// </summary>
public void Dispose()
{
Close();
}
#region 查询语句
/// <summary>
/// 查询指定语句
/// </summary>
/// <param name="tableName"></param>
/// <param name="items"></param>
/// <returns></returns>
public DataSet Select(string tableName, string[] items)
{
string query = "SELECT" + items[0];
for (int i = 1; i < items.Length; i++)
{
query += " , " + items[i];
}
query += "FROM" + tableName;
Debug.LogFormat("query : {0}", query);
return ExecuteQuery(query);
}
/// <summary>
/// 查询所有语句
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
public DataSet Select(string tableName)
{
string query = "SELECT * FROM " + tableName;
return ExecuteQuery(query);
}
#region 根据条件查询指定字段
/// <summary>
/// 查询指定字段数据中满足条件的
/// DataSet内存中的数据库,DataSet是不依赖于数据库的独立数据集合,是一种不包含表头的纯数据文件
/// 有条件的查询,查询在users这个表当中,只需要字段名为userAccount,userPwd,userName,ID这几个字段对应的数据,
/// 满足条件为 userAccount对应的value=account, userPwd对应的value=md5Password;
/// ("users", new string[] { "userAccount", "userPwd", "userName", "ID" }, new string[] { "userAccount", "userPwd" }, new string[] { "=", "=" }, new string[] { account, md5Password });
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="items">查询字段名</param>
/// <param name="cols">判断字段名</param>
/// <param name="operations">条件运算符</param>
/// <param name="values">满足的条件值</param>
/// <returns></returns>
public DataSet SelectWhere(string tableName, string[] items, string[] cols, string[] operations, string[] values)
{
if (cols.Length != operations.Length || operations.Length != values.Length)
{
throw new Exception("col.Length != operation.Length != values.Length");
}
string query = "SELECT " + items[0];
for (int i = 1; i < items.Length; ++i)
{
query += ", " + items[i];
}
query += " FROM " + tableName + " WHERE " + cols[0] + operations[0] + "'" + values[0] + "' ";
for (int i = 1; i < cols.Length; ++i)
{
query += " AND " + cols[i] + operations[i] + "'" + values[i] + "' ";
}
Debug.LogFormat("query: {0}", query);
return ExecuteQuery(query);
}
#endregion
#region 根据条件查询全部字段
/// <summary>
/// 根据条件查询全部字段
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">判断字段</param>
/// <param name="operations">判断字符</param>
/// <param name="values">条件成立数据</param>
/// <returns></returns>
public DataSet SelectWhere(string tableName, string[] cols, string[] operations, string[] values)
{
if (cols.Length != operations.Length || operations.Length != values.Length)
{
throw new Exception("col.Length != operation.Length != values.Length");
}
string query = "SELECT *";
query += " FROM " + tableName + " WHERE " + cols[0] + operations[0] + "'" + values[0] + "' ";
for (int i = 1; i < cols.Length; ++i)
{
query += " AND " + cols[i] + operations[i] + "'" + values[i] + "' ";
}
Debug.LogFormat("query: {0}", query);
return ExecuteQuery(query);
}
#endregion
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString"></param>
/// <returns></returns>
public DataSet ExecuteQuery(string SQLString)
{
DataSet ds = new DataSet();
try
{
MySqlDataAdapter da = new MySqlDataAdapter(SQLString, conn);
da.Fill(ds);
}
catch (MySqlException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
#endregion
#region
public int UpdateIntoSpecific(string tableName, string[] selectKeys, string[] operation, string[] selectValues, string[] cols, string[] colsValues)
{
string query = "UPDATE" + tableName + "SET" + cols[0] + " = " + " ' " + colsValues[0] + " ' ";
for (int i = 1; i < colsValues.Length; i++)
{
query += "," + cols[i] + " = " + " ' " + colsValues[i] + " ' ";
}
query += " WHERE " + selectKeys[0] + " " + operation[0] + " " + "'" + selectValues[0] + "' ";
for (int i = 1; i < selectKeys.Length; ++i)
{
query += " AND " + selectKeys[i] + " " + operation[i] + " " + "'" + selectValues[i] + "' ";
}
return ExecuteNonQuery(query);
}
#endregion
#region 插入语句
/// <summary>
/// 插入部分ID
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">字段名</param>
/// <param name="values">具体数值</param>
/// <returns></returns>
public int InsertInto(string tableName, string[] cols, string[] values)
{
if (cols.Length != values.Length)
{
throw new Exception("columns.Length != colType.Length");
}
string query = "INSERT INTO " + tableName + " (" + cols[0];
for (int i = 1; i < cols.Length; ++i)
{
query += " , " + cols[i];
}
query += ") VALUES (" + " ' " + values[0] + " ' ";
for (int i = 1; i < values.Length; ++i)
{
query += ", " + " ' " + values[i] + " ' ";
}
query += " ) ";
Debug.LogFormat("query: {0}", query);
return ExecuteNonQuery(query);
}
#endregion
#region 根据条件删除
/// <summary>
/// 删除
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">字段</param>
/// <param name="colsValues">字段值</param>
/// <returns></returns>
public int Delete(string tableName, string[] cols, string[] colsValues)
{
string query = "DELETE FROM" + tableName + "WHERE" + cols[0] + " = " + " ' " + colsValues[0] + " ' ";
for (int i = 1; i < colsValues.Length; i++)
{
query += "and" + cols[i] + " = " + " ' " + colsValues[i] + " ' ";
}
return ExecuteNonQuery(query);
}
/// <summary>
/// 删除表
/// </summary>
/// <param name="tableName"></param>
/// <param name="cols"></param>
/// <param name="operation"></param>
/// <param name="colsValues"></param>
/// <returns></returns>
public int Delete(string tableName , string[] cols,string[] operation , string[] colsValues)
{
string query = "DELETE FROM" + tableName + "WHERE" + cols[0] + " " + operation[0] + " " + " ' " + colsValues[0] + " ' ";
for (int i = 1 ; i < colsValues.Length; i++)
{
query += "and " + cols[i] + " " + operation[i] + " " + " ' " + colsValues[i] + " ' ";
}
return ExecuteNonQuery(query);
}
#endregion
/// <summary>
/// 删除表中全部内容
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
public int DeleContents(string tableName)
{
string query = "DELETE FROM " + tableName;
return ExecuteNonQuery(query);
}
#region
/// <summary>
/// 创建表
/// </summary>
/// <param name="name">表名</param>
/// <param name="col">字段</param>
/// <param name="colType">字段类型</param>
/// <returns></returns>
public int CreateTable(string name, string[] col, string[] colType)
{
if(col.Length != colType.Length)
{
throw new Exception("columns.Length != colType.Length");
}
string query = "CREATE TABLE" + name + " ( " + col[0] + " " + colType[0];
for (int i = 1; i < col.Length; ++i)
{
query += " , " + col[i] + " " + colType[i];
}
query += " ) ";
return ExecuteNonQuery(query);
}
#endregion
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <param name="SQLString"></param>
/// <returns></returns>
//public int ExecuteNonQuery(string SQLString)
//{
// using(MySqlCommand cmd = new MySqlCommand(SQLString,conn))
// {
// try
// {
// int rows = cmd.ExecuteNonQuery();
// return rows;
// }
// catch (MySqlException E)
// {
// throw new Exception(E.Message);
// }
// finally
// {
// cmd.Dispose();
// }
// }
//}
public int ExecuteNonQuery(string SQLString)
{
using (MySqlCommand cmd = new MySqlCommand(SQLString, conn))
{
try
{
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (MySqlException E)
{
throw new Exception(E.Message);
}
finally
{
//cmd.Dispose();
}
}
}
}
}
所有的方法都已经注释了,注意的是在每次进行数据库连接的时候都要执行Open(),在关闭数据库的时候执行Close(),剩下的就是一些查询方法,在进行查询的时候调用SQLHelper即可
3:核心工具类sqlTools代码
using System.Collections.Generic;
using System.Data;
namespace Lei.Mysql
{
public class LeiSqlTools
{
/// <summary>
/// 获取表中数据,字典中第一键是字段名,第二是对应字段值,返回字典数组
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
public static Dictionary<string,object>[] TableData(DataSet ds)
{
if(ds.Tables.Count == 0)
{
return null;
}
List<Dictionary<string, object>> tableList = new List<Dictionary<string, object>>();
for (int i = 0; i < ds.Tables.Count; i++)
{
for (int j = 0; j < ds.Tables[i].Rows.Count; i++)
{
tableList.Add(new Dictionary<string, object>());
var temp = ds.Tables[i];
var obj = temp.Rows[j].ItemArray;
for (int k = 0; k < obj.Length; k++)
{
string tableName = temp.Columns[k].ToString();
tableList[j].Add(tableName, obj[k]);
}
}
}
return tableList.ToArray();
}
/// <summary>
/// 获取单个数据
/// </summary>
/// <param name="ds"></param>
/// <param name="Name"></param>
/// <returns></returns>
public static object GetValue(DataSet ds , string Name)
{
if(ds.Tables.Count == 0)
{
return null;
}
for (int i = 0; i < ds.Tables.Count; i++)
{
for (int j = 0; j < ds.Tables[i].Rows.Count; j++)
{
var temp = ds.Tables[i];
var obj = temp.Rows[j].ItemArray;
for (int k = 0; k < obj.Length; k++)
{
string tableName = temp.Columns[k].ToString();
if(tableName == Name)
{
return obj[k];
}
}
}
}
return null;
}
/// <summary>
/// 获取多个数据
/// </summary>
/// <param name="ds"></param>
/// <param name="Name"></param>
/// <returns></returns>
public static object[] GetValues(DataSet ds , string Name)
{
if(ds.Tables.Count == 0)
{
return null;
}
List<object> list = new List<object>();
//遍历DataSet表条数
for (int i = 0; i < ds.Tables.Count; i++)
{
//遍历表该条字段数量
for (int j = 0; j < ds.Tables[i].Rows.Count; j++)
{
//存储该条数类对象
var temp = ds.Tables[i];
//获取该条所有字段值
var obj = temp.Rows[j].ItemArray;
//遍历所有字段数组
for (int k = 0; k < obj.Length; k++)
{
//获取该字段名称
string tableName = temp.Columns[k].ToString();
//判断该字段名称是否等于Name
if (tableName == Name)
{
//存储到集合中
list.Add(obj[k]);
}
}
}
}
//返回数组
return list.ToArray();
}
}
}
可以通过该类获取单个或者多个数据!
4:测试类Test
(在进行数据库的操作的时候一定要先Open,最后Close,这是基本逻辑!)
using System.Collections.Generic;
using UnityEngine;
using Lei.Mysql;
public class LeiTestSql : MonoBehaviour
{
void Start()
{
// IP地址 端口 用户名 密码 数据库项目名称
var mySqlTools = new LeiSqlHelper("127.0.0.1", "3306", "root", "123456", "SqlTest");
//先打开数据库
mySqlTools.Open();
//创建表方法 表名 字段名称 字段类型
//mySqlTools.CreateTable("FirstData", new[] { "UID", "User", "Password" }, new[] { "tinytest", "tinytext", "tinytest" });
//插入数据 表名 字段名称 插入的数据
//mySqlTools.InsertInto("FirstData", new[] { "UID", "User", "Password" }, new[] { "雷康", "leikang", "123456" });
//查询方法
FindMysql(mySqlTools, "firstdata", new[] { "UID", "User", "Password" });
// 插入方法 表名 字段名 插入数据
//mySqlTools.InsertInto("firstdata", new[] { "UID", "User", "Password" },new[] {"52022","ddxj1","123456" });
// 更新方法 表名 更新字段名 判断符号 更新数据 查询条件字段 条件成立字段
//mySqlTools.UpdateIntoSpecific("firstdata", new[] { "User" }, new[] { "=" }, new[] { "ddxj1" }, new[] { "Password" }, new[] { "456789" });
// 删除方法 表名 删除字段 判断条件 条件成立数据
//mySqlTools.Delete("firstdata", new[] { "User" }, new[] { "=" }, new[] { "ddxj1" });
//查询方法 表名 查询字段名 判断字段名 判断符号 条件成立数据
// var ds = mySqlTools.SelectWhere("firstdata", new[] { "UID" }, new[] { "User" }, new[] { "=" }, new[] { "ddxj1" });
//查询方法 表名 判断字段名 判断符号 条件成立数据
// var ds = mySqlTools.SelectWhere("firstdata", new[] { "User" }, new[] { "=" }, new[] { "ddxj1" });
mySqlTools.Close();
}
/// <summary>
/// 查询表中数据 记得先调用Open()方法 用完此方法后直接Close()
/// </summary>
/// <param name="mySqlTools">Mysql框架类</param>
/// <param name="tableName">表名</param>
/// <param name="items">字段名称</param>
void FindMysql(LeiSqlHelper mySqlTools, string tableName, string[] items)
{
var ds = mySqlTools.Select(tableName, items);
//调取获取数据的方法
var pairs = LeiSqlTools.TableData(ds);
DebugMysql(pairs);
}
/// <summary>
/// 打印查询数据库
/// </summary>
/// <param name="pairs"></param>
private void DebugMysql(Dictionary<string, object>[] pairs)
{
for (int i = 0; i < pairs.Length; i++)
{
foreach (var table in pairs[i])
{
string tableList = string.Format("第{0}行,表字段名对应数据是 {1}", i + 1, table);
print(tableList);
}
}
}
}
①实例化工具类
var mySqlTools = new LeiSqlHelper("127.0.0.1", "3306", "root", "123456", "SqlTest");
②打开数据库
mySqlTools.Open();
③然后执行你的数据库操作
比如创建一个表、插入数据、查询数据、插入数据、更新数据、删除数据等
④最后关闭数据库
mySqlTools.Close();
5:具体所有的增删改查方法,可以自己进行测试!运行后在Navicat 15 for MySQL进行实时查看!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)