基于c++11 标准的orm
- 使用简单
- stmt全面支持,防止注入
- head only,方便用于其他项目
- 支持mysql,sqlite3
- 增加postgre等数据库支持
在使用之前需要进行数据库配置,通过init_database_config方法注册配置,配置参数如下:
- host 用来指定连接的地址
- user 数据库用户名
- password 数据库密码
- dbname 数据库名
- conn_number 连接池数量
- character_encoding 数据库编码方式
- port 数据库端口号
- reconnect_number 尝试重连次数
- timeout 超时时间
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
int main(){
dataBaseConfig config;
config.character_encoding = "utf8";
config.conn_number = 2;
config.dbname = "xorm";
config.host = "127.0.0.1";
config.password = "root";
config.user = "root";
init_database_config(config); //全局初始化配置
}
通过dao_t::insert 进行数据的添加
- 参数: 通过REFLECTION注册过的表结构对象
- 返回数据: success: SQL语句无错误返回true , affect_rows: 影响行数, unique_id: 唯一ID, error: 是否有错误(error.message取出错误详情)
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
struct test {
mysql::Integer id;
mysql::Integer a;
std::string b;
mysql::MysqlDateTime time;
mysql::MysqlDate date;
mysql::MysqlTime tm;
mysql::Double money;
};
REFLECTION(test, id, a, b, time, date, tm, money)
int main(){
dao_t<mysql> dao;
test data;
data.id = 0;
data.a = i;
data.b = "t0 你好" + std::to_string(i);
data.time.format_timestamp(std::time(nullptr));
data.date = "2019-10-09";
data.tm.format_timestamp(std::time(nullptr));
data.money = 12.03;
auto pr = dao.insert(data);
if (pr.success == true && pr.affect_rows > 0)
{
std::cout << "insert row " << pr.affect_rows << " insert id " << pr.unique_id << std::endl;
}
else {
std::cout << "error " << pr.error << " message " << pr.error.message() << std::endl;
}
}
通过dao_t::del 进行数据的删减
- 参数1: 删除条件,可以为空字符串
"where id=?"
- 后续参数: 条件中的值
mysql::Integer{10}
- 返回数据: success: SQL语句无错误返回true , affect_rows: 影响行数, unique_id: 唯一ID, error: 是否有错误(error.message取出错误详情)
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
struct test {
mysql::Integer id;
mysql::Integer a;
std::string b;
mysql::MysqlDateTime time;
mysql::MysqlDate date;
mysql::MysqlTime tm;
mysql::Double money;
};
REFLECTION(test, id, a, b, time, date, tm, money)
int main(){
dao_t<mysql> dao;
bool r = dao.del<test>("where id = ?",mysql::Integer{10});
}
支持两种方式
- 参数: 数据表结构对象
- 返回数据: success: SQL语句无错误返回true , affect_rows: 影响行数, unique_id: 唯一ID, error: 是否有错误(error.message取出错误详情)
- 参数: update语句
"update test set a=? where id=?"
- 后续参数: 条件中的值
如 mysql::Integer{10}
- 返回数据: success: SQL语句无错误返回true , affect_rows: 影响行数, unique_id: 唯一ID, error: 是否有错误(error.message取出错误详情)
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
struct test {
mysql::Integer id;
mysql::Integer a;
std::string b;
mysql::MysqlDateTime time;
mysql::MysqlDate date;
mysql::MysqlTime tm;
mysql::Double money;
};
REFLECTION(test, id, a, b, time, date, tm, money)
int main(){
test data;
data.id = 1;
data.a = 1024;
dao_t<mysql> dao;
bool r = t.update(data);
bool r1 = t.update("update test set a=? where id=?",mysql::Integer{10},mysql::Integer{1});
}
- 模板参数: 数据表结构类型
- 参数: 查询条件 (可以为空字符串)
"where id=?"
- 后续参数: 条件中的值
如 mysql::Integer{1}
- 返回数据: success: SQL语句无错误返回true , results: 返回数据结果vector , error: 是否有错误(error.message取出错误详情)
- 模板参数: 自定义std::tuple<T...> 如 std::tuple<mysql::Integer,std::string> 代表查询的数据集的field类型
- 参数: 完整的查询语句
"where id=?"
- 后续参数: 条件中的值
如 mysql::Integer{1}
- 返回数据: success: SQL语句无错误返回true , results: 返回数据结果vector , error: 是否有错误(error.message取出错误详情)
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
struct test {
mysql::Integer id;
mysql::Integer a;
std::string b;
mysql::MysqlDateTime time;
mysql::MysqlDate date;
mysql::MysqlTime tm;
mysql::Double money;
};
REFLECTION(test, id, a, b, time, date, tm, money)
int main(){
dao_t<mysql> dao;
auto r = dao.query<test>("where id=?",mysql::Integer{1});
auto r0 = dao.query<std::tuple<mysql::Integer,std::string>>("select a,b from test where id=?",mysql::Integer{1});
}
支持原生数据库的命令执行
- 参数: 完整的sql语句
- 返回数据: success: SQL语句无错误返回true , affect_rows: 影响行数, unique_id: 唯一ID, error: 是否有错误(error.message取出错误详情)
- 参数: 完整的sql语句
如果执行的sql语句可以返回结果集合
- 参数2: 执行结果集的回调方法,回调参数为数据结果集的指针(可能是nullptr)
- 返回数据: success: SQL语句无错误返回true , affect_rows: 影响行数, unique_id: 唯一ID, error: 是否有错误(error.message取出错误详情)
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
int main(){
dao_t<mysql> dao;
auto r = dao.execute("commit");
std::function<void(MYSQL_RES*)> get_reuslt = [](MYSQL_RES*){}
auto r1 = dao.execute("select * from test",get_reuslt);
}
提供了两种开启事务的方式
- 自动事务开启
在声明的dao_t对象声明周期结束后会自动提交当前事务
- 手动事务开启
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
int main(){
{
dao_t<mysql> dao;
dao.start_transaction();
//////
}
dao_t<mysql> dao;
dao.begin();
///balabala
if(///balabala){
dao.rollback();
}
dao.commit();
}
如语句执行错误等
#include <iostream>
#include "mysql.hpp"
#include "dao.hpp"
using namespace xorm;
int main(){
dao_message::get().set_error_callback([](std::string const& msg) {
std::cout << msg << "\n";
});
}