# cpp_easy_sql **Repository Path**: minibrother/cpp_easy_sql ## Basic Information - **Project Name**: cpp_easy_sql - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-20 - **Last Updated**: 2025-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## cpp easy sql简介 * 将sql语句与代码分离解耦,存放于xml配置文件中 * 用逻辑标签控制SQL的拼接 * 查询的结果集与C++对象自动映射 ## 实现 * cpp_xml.py 将xml定义的sql语句转成c++代码 * sql_handler.h 定义了两组执行sql、获取结果的接口。分别是ColumnIndexSqlHandler通过index获取结果、ColumnLabelSqlHandler通过字段名获取结果。 * cpp_sql.h 利用mysql-connection-c++实现了ColumnLabelSqlHandler接口 * c_sql.h 利用mysql-connection-c 实现了ColumnIndexSqlHandler接口 ## 安装依赖 #### 安装mysql ```shell yum install -y mariadb-server mariadb ``` #### 安装mysql-connector-c++ ```shell wget https://dev.mysql.com/get/Downloads/Connector-C++/mysql-connector-c++-1.1.9-linux-el7-x86-64bit.rpm rpm -Uvh mysql-connector-c++-1.1.9-linux-el7-x86-64bit.rpm ``` ## 支持的标签 ### 操作标签 ``` ``` ### 条件标签 ``` // #{} 形式的变量将会替换 and `passwd` = #{passwd} ``` ### 循环标签foreach foreach标签支持4个属性 ``` ``` 例: ``` ``` ## 使用 以查询下面这个user_info表为例: ```sql CREATE TABLE `user_info` ( `user_id` int(11) AUTO_INCREMENT PRIMARY KEY, `name` varchar(50) NOT NULL, `passwd` varchar(50) NOT NULL, `state_id` int(4) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 1. 定义xml ```xml ``` 将其保存为```get_user.xml``` 2. 转cpp代码 ```shell python cpp_xml.py get_user.xml #生成相应cpp代码 ``` 生成的相应cpp代码中包含以下内容: * 作为查询条件出入的参数类 ```cpp struct GetUserInfoParam { std::string name; std::string passwd; int32_t state_id; }; ``` * 获取一行结果的类 ```cpp struct GetUserInfoEntity { uint64_t user_id; std::string name; std::string passwd; int32_t state_id; }; ``` * 根据查询条件类拼sql的函数 ```cpp std::string GetUserInfoSql (CommonSqlHandler *sql_handler, const GetUserInfoParam ¶m) { ostringstream ss; ss << " select `user_id`,`name`,`passwd`,`state_id`"; ss << " from `user_info`"; ss << " where 1 = 1"; if (!param.name.empty()) { ss << " and `name` = '" + sql_handler->EscapeString(param.name) + "'"; } if (!param.passwd.empty()) { ss << " and `passwd` = '" + sql_handler->EscapeString(param.passwd) + "'"; } if (param.state_id > 0) { ss << " and `state_id` = '" + to_string(param.state_id) + "'"; } return ss.str(); } ``` * 执行sql并获取结果集 ```cpp std::vector GetUserInfo (ColumnLabelSqlHandler *sql_handler, const GetUserInfoParam ¶m) { std::vector ret; auto sql = GetUserInfoSql(sql_handler, param); sql_handler->ExecuteQuery(sql); while(sql_handler->Next()) { ret.emplace_back(); ret.back().user_id = sql_handler->GetUInt64("user_id"); ret.back().name = sql_handler->GetString("name"); ret.back().passwd = sql_handler->GetString("passwd"); ret.back().state_id = sql_handler->GetInt("state_id"); } return ret; } ```