# 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;
}
```