这里拿一个本地部署的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进行实时查看!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐