Unity使用Mysql环境搭配(保姆级)
UnityDemo版本
Unity版本:2020.3.25;
Visual Studio版本: 2019;MySql.Data.dll版本:5.2.3
MySql版本:5.7.35
Mysql下载地址教程
下载完成后解压到任意盘即可(楼主我选择的是D盘)
点击查看
勾选文件扩展名
右键新建文本文档 修改名称My.ini
修改后
打开my.ini 把以下文本复制到里面去 设置basedir(你的安装目录)
和datadir(数据库存放路径 注意:定义路径一定要有data文件夹)
[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
按下Win+R 输入cmd 然后回车
右键点击命令提示符 左键点击以管理员运行
先输入D: 回车
然后输入 cd 解压出来bin文件路径
然后在控制台输入指令
mysqld --install
如上图代表成功
接下来在控制台输入命令
mysqld --initialize --console
记下你随机出来密码 楼主随机出来密码是 VPWuVnRro3:)
输入以下指令启动Mysql服务器
net start mysql
如上图表示成功
登录Mysql服务器输入
mysql -u root -p
上图输入你的随机密码
楼主随机出来密码是 VPWuVnRro3:)
如上图显示就成功了
登录成功可以修改密码为123456
输入指令
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
如上图成功
安装完成在控制台 输入quit和exit 退出
exit
接下来进行环境搭配
此电脑右键->属性->高级系统设置
新建系统变量
变量名为:MYSQL_HOME
变量值为你的MySQL安装路径
点击确定
找到path进行编辑
新建环境变量
变量为:%MYSQL_HOME%\bin
%MYSQL_HOME%\bin
在桌面找到此电脑右键此电脑->管理->服务与应用程序->服务
找到mysql->右键属性
将启动类型改为手动(防止开机速度变慢)
以上操作已经完成Mysql环境搭建
每次开机以管理员方法打开控制台输入命令
net start mysql
如果Mysql安装时出现问题
如果在控制台输入以下指令出现问题
mysqld --install
解决办法 先以管理员打开控制台 输入
sc query mysql
如上图 如果发现有则输入
sc delete mysql
在次输入在控制台输入指令
sc query mysql
则表示删除成功
Navicat可视化窗口下载教程
下载地址
提取码: qy8s
安装教程
使用Navicat可视化窗口
点击连接
在点击mysql 最后弹出以下窗口
然后点击确定
连接成功如下图
打开数据库出现以下界面
最后点击保存 弹出以下图
Mysql.data.dll下载地址
下载地址
提取码: wr2g
本次Demo下载地址
网盘下载地址
提取码: jnc8
下载好后直接把资源包直接放进Assets文件中 运行如下环境配置成功
如果下载地址丢失请看下面
1:导入Unity安装目录下的必要程序集、I18N.CJK、I18N、I18N.West;(因为2020版的Unity默认加载了System.Data.dll,System.Drawing.dll,所以不用再次导入)安装目录路劲为:Editor\Data\MonoBleedingEdge\lib\mono\unityjit
(注意一定是这个目录下的几个程序集,其他的尝试后无效并且报错)
在Unity Assets 新建Plugins文件 把这三个文件夹 放到里面去 最后在把Mysql.data.dll 也放进去图下
本项目脚本 SqlHelper
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using UnityEngine;
/// <summary>
/// Mysql添/删/改/查/框架 切记使用该类方法 除了(Connect方法)其他方法 先调用Open() 使用完后 在Close()掉
/// </summary>
public class SqlHelper
{
string _server, _port, _user, _password, _datename, _format;
string connectStr;
MySqlConnection conn;
public SqlHelper(string host, string port, string user, string passwd, string database, string format = "utf8")
{
Connect(host,port,user,passwd,database,format);
}
/// <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")
{
_server = host;
_port = port; _user = user;
_password = passwd;
_datename = database;
_format = format;
connectStr = string.Format("server={0};port={1};user={2};password={3}; database={4};charset={5}", _server, _port, _user, _password, _datename, _format);//设置连接ip,端口,用户名,密码,以及编码格式
conn = new MySqlConnection(connectStr);//创建连接类
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void Open()
{
conn.Open();//正式打开连接
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
conn.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);
}
/// <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);
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString">查询语句</param>
/// <returns>DataSet</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 更新语句
/// <summary>
/// 当指定字段满足一定条件时,更新指定字段的数据
/// 例如更新在user这个表中字段名为userAccount的值等于10086时,将对应userPwd字段的值改成newMd5SumPassword
/// ("users", new string[] { "userPwd" }, new string[] { newMd5SumPassword }, "userAccount", "10086")
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">字段</param>
/// <param name="colsValues">字段值</param>
/// <param name="selectKey">指定的字段</param>
/// <param name="selectValue">指定字段满足的条件</param>
/// <returns></returns>
public int UpdateInto(string tableName, string[] cols, string[] colsValues, string[] selectKeys, string[] selectValues)
{
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] + " = " + "'" + selectValues[0] + "' ";
for (int i = 1; i < selectKeys.Length; ++i)
{
query += " AND " + selectKeys[i] + " = " + "'" + selectValues[i] + "' ";
}
Debug.LogFormat("query: {0}", query);
return ExecuteNonQuery(query);
}
/// <summary>
/// 当指定字段满足一定条件时,更新指定字段的数据
/// 例如更新在user这个表中字段名为userAccount的值等于10086时,将对应userPwd字段的值改成newMd5SumPassword
/// ("users", new string[] { "userPwd" }, new string[] { newMd5SumPassword }, "userAccount", "10086")
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">字段</param>
/// <param name="colsValues">字段值</param>
/// <param name="selectKey">指定的字段</param>
/// <param name="selectValue">指定字段满足的条件</param>
/// <returns></returns>
public int UpdateInto(string tableName, string[] cols, float[] colsValues, string[] selectKeys, string[] selectValues)
{
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] + " = " + "'" + selectValues[0] + "' ";
for (int i = 1; i < selectKeys.Length; ++i)
{
query += " AND " + selectKeys[i] + " = " + "'" + selectValues[i] + "' ";
}
Debug.LogFormat("query: {0}", query);
return ExecuteNonQuery(query);
}
/// <summary>
/// 当指定字段满足一定条件时,更新指定字段的数据
/// 例如更新在user这个表中字段名为userAccount的值等于10086时,将对应userPwd字段的值改成newMd5SumPassword
/// ("users", new string[] { "userPwd" }, new string[] { newMd5SumPassword }, "userAccount", "10086")
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">字段</param>
/// <param name="colsValues">字段值</param>
/// <param name="selectKey">指定的字段</param>
/// <param name="selectValue">指定字段满足的条件</param>
/// <returns></returns>
public int UpdateInto(string tableName, string[] cols, int[] colsValues, string[] selectKeys, string[] selectValues)
{
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] + " = " + "'" + selectValues[0] + "' ";
for (int i = 1; i < selectKeys.Length; ++i)
{
query += " AND " + selectKeys[i] + " = " + "'" + selectValues[i] + "' ";
}
Debug.LogFormat("query: {0}", query);
return ExecuteNonQuery(query);
}
/// <summary>
/// 当指定字段满足一定条件时,更新指定字段的数据
/// 例如更新在user这个表中字段名为userAccount的值等于10086时,将对应userPwd字段的值改成newMd5SumPassword
/// ("users", new string[] { "userPwd" }, new string[] { newMd5SumPassword }, "userAccount", "10086")
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="cols">字段</param>
/// <param name="colsValues">字段值</param>
/// <param name="selectKey">指定的字段</param>
/// <param name="selectValue">指定字段满足的条件</param>
/// <returns></returns>
public int UpdateInto<T>(string tableName, string[] cols, T[] colsValues, string[] selectKeys, string[] selectValues) where T : struct
{
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] + " = " + "'" + selectValues[0] + "' ";
for (int i = 1; i < selectKeys.Length; ++i)
{
query += " AND " + selectKeys[i] + " = " + "'" + selectValues[i] + "' ";
}
Debug.LogFormat("query: {0}", query);
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] + "'";
}
Debug.LogFormat("query: {0}", query);
return ExecuteNonQuery(query);
}
#endregion
/// <summary>
/// 执行SQL语句,返回影响的记录数。用于Update、Insert和Delete
/// </summary>
/// <param name="SQLString">SQL语句</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();
}
}
}
}
本项目脚本 mysqlTools工具类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Data;
/*
DataSet类使用方法
asp.NET中DataSet对象获取相应列值、行列数、列名、取出特定值这些操作的总结,具体代码如下:
1. DataSet.Table[0].Rows[ i ][ j ]
其中i 代表第 i 行数, j 代表第 j 列数
2. DataSet.Table[0].Rows[ i ].ItemArray[ j ]
其中i 代表第 i 行数, j 代表第 j 列数
3. DataSet.Tables[0].Columns.Count
取得表的总列数
4. DataSet.Tables[0].Rows.Count
取得表的总行数
5. DataSet.Tables[0].Columns[ i ].ToString()
取得表的 i 列名(字段名)
6. ds.Tables.Count - 返回表的数量,一个 select 返回一个 table
*/
/// <summary>
/// mysql工具类
/// </summary>
public class MysqlTools
{
/// <summary>
/// 初始化对象
/// </summary>
public static MysqlTools Instance {
get; }
static MysqlTools()
{
Instance = new MysqlTools();
}
/// <summary>
/// 获取表中数据 字典中第一个键是条数 第二个是字段名 对应字段值
/// 条数从0开始
/// </summary>
/// <param name="ds">数据表类</param>
/// <returns></returns>
public Dictionary<int, Dictionary<string, object>> TableData(DataSet ds)
{
Dictionary<int, Dictionary<string,object>> tableList = new Dictionary<int, Dictionary<string, object>>();
//遍历DataSet表条数
for (int i = 0; i < ds.Tables.Count; i++)
{
//遍历表该条字段数量
for (int j = 0; j < ds.Tables[i].Rows.Count; j++)
{
//根据该条数 并新建一块字典空间存储到该字典中
tableList.Add(j, 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;
}
/// <summary>
/// 获取单个数据
/// </summary>
/// <param name="ds">数据表类</param>
/// <param name="Name">字段名称</param>
/// <returns></returns>
public object GetValue(DataSet ds,string Name)
{
//遍历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)
{
//返回数据
return obj[k];
}
}
}
}
return null;
}
/// <summary>
/// 获取多个数据
/// </summary>
/// <returns></returns>
public object[] GetValues(DataSet ds, string Name)
{
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.Count == 0 ? null : list.ToArray();
}
}
本项目脚本Test
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
//创建数据库类 IP地址 端口 用户名 密码 数据库项目名称
var mySqlTools = new SqlHelper("127.0.0.1", "3306", "root", "123456", "user");
//打开数据库
mySqlTools.Open();
//查询方法
FindMysql(mySqlTools, "userdata", new[] {
"UID", "User", "Password" });
// 插入方法 表名 字段名 插入数据
// mySqlTools.InsertInto("userdata", new[] { "UID", "User", "Password" },new[] {"水神","ddxj1","123456" });
// 更新方法 表名 更新字段名 更新数据 查询条件字段 条件成立字段
// mySqlTools.UpdateInto("userdata",new[] {"Password" },new[] {"456789" },new[] { "User"},new[] { "ddxj1"});
// 删除方法 表名 删除字段 删除数据
// mySqlTools.Delete("userdata", new[] { "User" }, new[] { "ddxj1" });
// 从SqlHelper查询出来数据库 都会返回Dataset DataSet类 字段名
// 返回对象object 获取数据方法
//var GetValues = MysqlTools.Instance.GetValue(mySqlTools.Select("userdata"), "User");
//print(GetValues);
//关闭数据库
mySqlTools.Close();
}
/// <summary>
/// 查询表中数据 记得先调用Open()方法 用完此方法后直接Close()
/// </summary>
/// <param name="mySqlTools">Mysql框架类</param>
/// <param name="tableName">表名</param>
/// <param name="items">字段名称</param>
void FindMysql(SqlHelper mySqlTools,string tableName,string[] items)
{
var ds = mySqlTools.Select(tableName, items);
var pairs = MysqlTools.Instance.TableData(ds);
DebugMysql(pairs);
}
/// <summary>
/// 打印查询数据库
/// </summary>
/// <param name="pairs"></param>
private void DebugMysql(Dictionary<int,Dictionary<string,object>> pairs)
{
foreach (var Line in pairs)
{
foreach (var table in Line.Value)
{
string tableList = string.Format("第{0}行,表字段名对应数据是 {1}", Line.Key + 1, table);
print(tableList);
}
}
}
}