1.创建C++项目Test_SQL
2.建立空插件TestMySQL
3.插件目录下新建C++的Object类MyConnectionObject
4.新建蓝图函数库的C++类SqlBlueprintFunctionLibrary
5.引入第三方库,先找到Plugins/TestMySQL/Source文件夹,创建ThirdParty文件夹
重要 重要 重要 目录层级关系
F:\UE4\4.27\Test_SQL\Plugins\TestMySQL\Source\ThirdParty
下载地址
6.添加自定义模块"ConnectorLibs",//添加自定义模块
7.选择VC++目录,配置项目所需的第三方库包含目录和库目录
8.指定插件运行的平台为Win64/32。在VS工程中找到TestMySQL.uplugin文件,设置"WhitelistPlatforms": [ "Win64"]
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0.0",
"FriendlyName": "TestMySQL",
"Description": "SQL",
"Category": "Other",
"CreatedBy": "likai",
"CreatedByURL": "6@qq.com",
"DocsURL": "1",
"MarketplaceURL": "",
"SupportURL": "1",
"CanContainContent": false,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false,
"Modules": [
{
"Name": "TestMySQL",
"Type": "Runtime",
"LoadingPhase": "Default",
"WhitelistPlatforms": [
"Win64"
]
}
]
}
9.编写代码
MyConnectionObject.h文件
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
//引入mysql头文件
#include "mysql.h"
#include "MyConnectionObject.generated.h"
/**
*数据库连接对象类
*/
UCLASS(BlueprintType)//声明为蓝图类型的类
class TESTMYSQL_API UMyConnectionObject : public UObject
{
GENERATED_BODY()
private:
//声明私有构造函数
UMyConnectionObject();
public:
//声明MySQL连接对象
MYSQL* Conn;
};
MyConnectionObject.cpp文件
#include "MyConnectionObject.h"
UMyConnectionObject::UMyConnectionObject()
{
//初始化连接对象
Conn = nullptr;
}
SqlBlueprintFunctionLibrary.h文件
// Copyright 2020 NanGongTianYi. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
//引入mysql头文件
#include "mysql.h"
//引入数据库连接对象头文件
#include "MyConnectionObject.h"
#include "SqlBlueprintFunctionLibrary.generated.h"
/** 一行所含数据 */
USTRUCT(BlueprintType)
struct FQueryResultRow
{
GENERATED_BODY()
/** 一行的数据 */
UPROPERTY(BlueprintReadWrite, Category = "Reult Row Value")
TArray<FString> RowValue;
};
/** 所有行所数据 */
USTRUCT(BlueprintType)
struct FQueryResultRows
{
GENERATED_BODY()
/** 所有行数据 */
UPROPERTY(BlueprintReadWrite, Category = "Reult Rows Value")
TArray<FQueryResultRow> RowsValue;
};
/**
* 数据库连接类
*/
UCLASS(BlueprintType)//声明为蓝图类型
class TESTMYSQL_API USqlBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* 连接MySQL数据库
* @param Host 数据库IP地址
* @param UserName 数据库用户名
* @param Password 数据库密码
* @param DbName 数据库名
* @param Port 端口号
* @param Msg 提示消息
* @return UMyConnectionObject* 数据库连接对象
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static UMyConnectionObject* ConnectToMySQL(FString Host, FString UserName, FString Password, FString DbName, int32 Port, FString& Msg);
/**
* 获取数据库连接状态
* @param ConnObj 数据库连接对象
* @return bool 数据库是否连接,true为已连接
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool GetConnectionState(UMyConnectionObject* ConnObj);
/**
* 关闭数据库连接
* @param ConnObj 数据库连接对象
* @return bool 是否关闭成功,true为关闭成功
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool CloseConnection(UMyConnectionObject* ConnObj);
/**
* 向数据库中添加记录
* @param ConnObj 数据库连接对象
* @param SqlQuery 数据库注入语句
* @return bool 注入状态
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool InsertData(UMyConnectionObject* ConnObj, FString SqlQuery);
/**
* 修改数据库中的记录
* @param ConnObj 数据库连接对象
* @param SqlQuery 数据库注入语句
* @return bool 修改状态
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool UpdateData(UMyConnectionObject* ConnObj, FString SqlQuery);
/**
* 删除数据库中的记录
* @param ConnObj 数据库连接对象
* @param SqlQuery 数据库注入语句
* @return bool 删除状态
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool DeleteData(UMyConnectionObject* ConnObj, FString SqlQuery);
/**
* 删除数据库中符合条件的记录
* @param ConnObj 数据库连接对象
* @param TableName 表名
* @param Condition 条件
* @return bool 删除状态
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool DropData(UMyConnectionObject* ConnObj, FString TableName, FString Condition);
/**
* 从数据库中查询数据
* @param ConnObj 数据库连接对象
* @param TableName 要查询的表名
* @param Condition 条件映射
* @param bIsAnd 条件之间的关系,默认为or
* @return bool 查询状态
*/
UFUNCTION(BlueprintCallable, Category = "SQL Utilities")
static bool SelectData(UMyConnectionObject* ConnObj, FString TableName, TMap<FString, FString> Condition, bool bIsAnd, FQueryResultRows& Results);
};
SqlBlueprintFunctionLibrary.cpp文件
// Copyright 2020 NanGongTianYi. All Rights Reserved.
#include "SqlBlueprintFunctionLibrary.h"
#include "Engine.h"
#include <string>
UMyConnectionObject* USqlBlueprintFunctionLibrary::ConnectToMySQL(FString Host, FString UserName, FString Password, FString DbName, int32 Port, FString& Msg)
{
//字符编码格式转换
std::string tHost(TCHAR_TO_UTF8(*Host));
std::string tUserName(TCHAR_TO_UTF8(*UserName));
std::string tPassword(TCHAR_TO_UTF8(*Password));
std::string tDbName(TCHAR_TO_UTF8(*DbName));
//数据库连接对象创建
UMyConnectionObject* ConnObj = NewObject<UMyConnectionObject>();
//初始化MYSQL连接对象
ConnObj->Conn = mysql_init(nullptr);
//判断连接状态,并返回相应信息
if (!mysql_real_connect(ConnObj->Conn, tHost.c_str(), tUserName.c_str(), tPassword.c_str(), tDbName.c_str(), (uint32)Port, nullptr, 0))
{
Msg = TEXT("连接失败!");
}
else
{
Msg = TEXT("连接成功!");
}
//返回数据库连接对象
return ConnObj;
}
bool USqlBlueprintFunctionLibrary::GetConnectionState(UMyConnectionObject* ConnObj)
{
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
return false;
}
else
{
//判断MYSQL连接对象是否为空
if (ConnObj->Conn != nullptr)
{
return true;
}
}
return false;
}
bool USqlBlueprintFunctionLibrary::CloseConnection(UMyConnectionObject* ConnObj)
{
if (GetConnectionState(ConnObj))
{
mysql_close(ConnObj->Conn);
//指针归位,否则会变成悬挂指针
ConnObj->Conn = nullptr;
ConnObj = nullptr;
return true;
}
return false;
}
bool USqlBlueprintFunctionLibrary::InsertData(UMyConnectionObject* ConnObj, FString SqlQuery)
{
std::string tSqlQuery(TCHAR_TO_UTF8(*SqlQuery));
//判断连接对象是否为空
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
return false;
}
//判断语句是否执行成功
if (mysql_query(ConnObj->Conn, tSqlQuery.c_str()))
{
GEngine->AddOnScreenDebugMessage(-1, 8.0f, FColor::Blue, TEXT("添加失败!"));
return false;
}
return true;
}
bool USqlBlueprintFunctionLibrary::UpdateData(UMyConnectionObject* ConnObj, FString SqlQuery)
{
std::string tSqlQuery(TCHAR_TO_UTF8(*SqlQuery));
//判断连接对象是否为空
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
return false;
}
//判断语句是否执行成功
if (mysql_query(ConnObj->Conn, tSqlQuery.c_str()))
{
GEngine->AddOnScreenDebugMessage(-1, 8.0f, FColor::Blue, TEXT("修改失败!"));
return false;
}
return true;
}
bool USqlBlueprintFunctionLibrary::DeleteData(UMyConnectionObject* ConnObj, FString SqlQuery)
{
std::string tSqlQuery(TCHAR_TO_UTF8(*SqlQuery));
//判断连接对象是否为空
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
return false;
}
//判断语句是否执行成功
if (mysql_query(ConnObj->Conn, tSqlQuery.c_str()))
{
GEngine->AddOnScreenDebugMessage(-1, 8.0f, FColor::Blue, TEXT("删除失败!"));
return false;
}
return true;
}
bool USqlBlueprintFunctionLibrary::DropData(UMyConnectionObject* ConnObj, FString TableName, FString CondItion)
{
FString tSqlStr = "delete from " + TableName + " where " + CondItion;
std::string tSqlQuery(TCHAR_TO_UTF8(*tSqlStr));
//判断连接对象是否为空
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
return false;
}
//判断语句是否执行成功
if (mysql_query(ConnObj->Conn, tSqlQuery.c_str()))
{
GEngine->AddOnScreenDebugMessage(-1, 8.0f, FColor::Blue, TEXT("删除失败!"));
return false;
}
return true;
}
//禁用4706警告,问题在159行
#pragma warning(push)
#pragma warning( disable : 4706 )
bool USqlBlueprintFunctionLibrary::SelectData(UMyConnectionObject* ConnObj, FString TableName, TMap<FString, FString> CondItion, bool bIsAnd, FQueryResultRows& Results)
{
FString tSqlStr = "select * from " + TableName;
//判断连接对象是否为空
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
return false;
}
//Map 含有一个条件时
if (CondItion.Num() == 1)
{
FString TempStr;
for (TMap<FString, FString>::TIterator It = CondItion.CreateIterator(); It; ++It)
{
TempStr = It->Key + "=" + It->Value;
}
tSqlStr = tSqlStr + " where " + TempStr;
}
//Map 含有多个条件时
else
{
FString CondItionStr = bIsAnd ? " and " : " or ";
FString SqlStr;
for (TMap<FString, FString>::TIterator It = CondItion.CreateIterator(); It; ++It)
{
FString TempStr;
TempStr = It->Key + "=" + It->Value + CondItionStr;
SqlStr += TempStr;
}
tSqlStr = tSqlStr + " where " + SqlStr;
tSqlStr = tSqlStr.Left(tSqlStr.Len() - 4);
GEngine->AddOnScreenDebugMessage(-1, 8.0f, FColor::Red, tSqlStr);
}
std::string tQueryStr(TCHAR_TO_UTF8(*tSqlStr));
if (mysql_query(ConnObj->Conn, tQueryStr.c_str()))
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("查询失败!"));
return false;
}
//查询结果处理
MYSQL_RES* res;
MYSQL_ROW column;
TArray<FString> tColumsName;
//判断连接对象是否为空
if (!ConnObj)
{
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, TEXT("对象为空!"));
}
res = mysql_store_result(ConnObj->Conn);
int colums = mysql_num_fields(res);
//处理读取出来的数据
FQueryResultRows rRows;
while (column = mysql_fetch_row(res))
{
FQueryResultRow rRow;
for (int i = 0; i < colums; i++)
{
//将单行数据添加到存放单行数据的数组中
rRow.RowValue.Add(UTF8_TO_TCHAR(column[i]));
}
//将多行数据添加到存放多行数据的数组中
Results.RowsValue.Add(rRow);
}
//释放结果集
mysql_free_result(res);
return true;
}
10.打包(总结自用)
生成有错误 a.先检查文件命名是否一致
b.路径是否一致,尤其第三方库