(原创)sqlite封装库SmartDB1.3发布
最近终于稍微有点空对SmartDB进行升级了,SmartDB1.3比之前的版本做了简化,增强了易用性和灵活性。
SmartDB对sqlite做了一层封装,屏蔽了诸多细节,使得我们使用起来很方便。在注重易用性的基础上还兼顾了性能和灵活性。
易用性
接口很简单,基本接口有如下几个:
void Open(const string& fileName);
bool Close(); //数据库操作接口
template <typename... Args>
bool Excecute(const string& sqlStr, Args && ... args); //返回一个值,如执行简单的汇聚函数
template < typename R = sqlite_int64, typename... Args>
R ExecuteScalar(const string& sqlStr, Args&&... args); //查询接口
template <typename... Args>
std::shared_ptr<rapidjson::Document> Query(const string& query, Args&&... args); //事务
bool Begin();
bool RollBack();
bool Commit();
通过这几个接口,你就可以做所有的事情了。看一个简单的例子吧:
void Test()
{
SmartDB db;
db.Open("test.db"); const string sqlcreat = "CREATE TABLE if not exists PersonTable(ID INTEGER NOT NULL, Name Text, Address BLOB);"; if (!db.Excecute(sqlcreat))
return; const string sqlinsert = "INSERT INTO PersonTable(ID, Name, Address) VALUES(?, ?, ?);";
int id = ;
string name = "Peter";
string city = "zhuhai";
blob bl = { city.c_str(), city.length() + }; if (!db.Excecute(sqlinsert, id, "Peter", nullptr))
return;
}
上面的例子创建了数据库和数据表,并插入了一行记录,都是通过Excecute搞定,是不是很简单。
灵活性
对数据库接口做了增强,使我们可以接收tuple和json,因为有时候我们需要将要保存的值先保存起来,在需要的时候再存到数据库,这时就需要一个载体来事先保存这些数据,这里通过json或者tuple是最合适的。来看看tuple和json接口:
template<typename Tuple>
bool ExcecuteTuple(const string& sqlStr, Tuple&& t); bool ExcecuteJson(const string& sqlStr, const char* json);
和上面的Excecute很相似吧。看看他们的用法:
db.ExcecuteTuple(sqlinsert, std::forward_as_tuple(id, "Peter", bl));
json接口稍微复杂一点,这里我们用到了rapidjson。它的用法:
void TestJson(SmartDB& db, const string& sqlinsert)
{
rapidjson::StringBuffer buf;
rapidjson::Writer<rapidjson::StringBuffer> writer(buf);
writer.StartArray();
for (size_t i = ; i < ; i++)
{
writer.StartObject();
writer.String("ID");
writer.Int(i + ); writer.String("Name");
writer.String("Peter"); writer.String("Address");
writer.String("Zhuhai");
writer.EndObject();
}
writer.EndArray(); auto r = db.ExcecuteJson(sqlinsert, buf.GetString());
}
上面写json对象有点繁琐,没关系,可以通过我封装的JsonCpp来简化:
void TestJson(SmartDB& db, const string& sqlinsert)
{
//这里通过jsoncpp封装类来简化json对象的创建
JsonCpp jcp;
jcp.StartArray();
for (size_t i = ; i < ; i++)
{
jcp.StartObject();
jcp.WriteJson("ID", i);
jcp.WriteJson("Name", "Peter");
jcp.WriteJson("Address", "zhuhai");
jcp.EndObject();
}
jcp.EndArray(); auto r = db.ExcecuteJson(sqlinsert, buf.GetString());
}
灵活性
将查询结果直接放到json对象中,避免了物理表需要和业务实体一一对应的问题,底层物理表即使修改了,数据库这层不需要修改,是稳定的,因为查询的结果是json对象,它本身就是一个自描述的结构体,不关心底层数据表的变化。返回json的另外一个好处是,我可以将json串通过网络传输出去,或者直接传给其它的语言,因为json是一个标准的格式,所以,不同的语言都能轻松的识别它,它不仅仅是查询的结果还是一个联系其它语言或者系统的纽带,非常灵活。看看它的基本用法:
auto p = db.Query("select * from TestInfoTable");
返回的是一个json对象,要访问它也很简单:
rapidjson::Document& doc = *p;
for (size_t i = , len = doc.Size(); i < len; i++)
{
for (size_t j = , size = doc[i].GetSize(); j < size; ++j)
{
//doc[i][j];键值对
}
}
const char* json = doc.GetString(); //返回json串
性能
启用事务,插入性能很高,双核笔记本上插入一个七字段的表能达到二十多万行每秒的速度。查询结果的速度也较快,也能达到二十万行每秒的速度。看看性能测试的代码:
void TestPerformance()
{
SmartDB db;
db.Open("test.db");
const string sqlcreat = "CREATE TABLE if not exists TestInfoTable(ID INTEGER NOT NULL, KPIID INTEGER, CODE INTEGER, V1 INTEGER, V2 INTEGER, V3 REAL, V4 TEXT);";
if (!db.Excecute(sqlcreat))
return; boost::timer t;
const string sqlinsert = "INSERT INTO TestInfoTable(ID, KPIID, CODE, V1, V2, V3, V4) VALUES(?, ?, ?, ?, ?, ?, ?);";
bool ret = db.Prepare(sqlinsert);
db.Begin();
for (size_t i = ; i < ; i++)
{
ret = db.ExcecuteArgs(i, i, i, i, i, i + 1.25, "it is a test");
if (!ret)
break;
} if (ret)
db.Commit(); //提交事务
else
db.RollBack(); //回滚 cout << t.elapsed() << endl;
t.restart(); auto p = db.Query("select * from TestInfoTable"); cout << t.elapsed() << endl;
cout << "size: " << p->Size() << endl;
}
双核笔记本上显示:4.6s和5s。这个性能完全满足平时的开发。
如果你发现还有比这更简洁、灵活和高效的sqlite封装库请告诉我,如果没有请点一下推荐,谢谢。^_^
欢迎使用,如果发现有问题请向我反馈。
c++11 boost技术交流群:296561497,欢迎大家来交流技术。
(原创)sqlite封装库SmartDB1.3发布的更多相关文章
- QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData
SQLite数据库: SQLite是轻量级的数据库,适合应用在移动设备和小型设备上,它的优点是轻量,可移植性强.但它的缺点是它的API是用C写的,不是面向对象的.整体来说,操作起来比较麻烦.所以,一般 ...
- 【JavaScript 封装库】BETA 5.0 测试版发布!
JavaScript 前端框架(封装库) BETA 5.0 已于10月10日正式发布,今天开始提供 BETA 5.0 的 API 参考文献.相较于之前 5 个版本的发布都是草草的提供源代码,并没有很多 ...
- 【原创】Capture CIS利用Access数据库建立封装库说明
1.在服务器端建立新空间,方便封装库以及数据库的归档存放 服务器路径:\\192.168.1.234\Share\STG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib ...
- 【JavaScript 封装库】BETA 4.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- 【JavaScript 封装库】BETA 3.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- 【JavaScript 封装库】BETA 2.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- 【JavaScript 封装库】BETA 1.0 测试版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- 【JavaScript 封装库】Prototype 原型版发布!
/* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...
- 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件
看到Andy_2020发的帖子“Altium Designer专题”之后,对Altium Designer的3D功能很感兴趣,着手自己做一个AD的3D封装库.刚开始按照Andy介绍的方法,学了两天So ...
随机推荐
- 转:Ogre源码分析之Root类、Facade模式
Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...
- open()系统调用的实现
open系统调用的服务例程是sys_open()函数,它接受三个参数:要打开文件的路径名filename, 访问模式的表示flags和文件权限掩码mode.在内核中,sys_open实际调用do_sy ...
- 解决编译Apache出现的问题:configure: error: APR not found
今日编译apache时出错: #./configure --prefix……检查编辑环境时出现: checking for APR... noconfigure: error: APR not fou ...
- MapReduce 模式、算法和用例
翻译自:http://highlyscalable.wordpress.com/2012/02/01/mapreduce-patterns/ 在这篇文章里总结了几种网上或者论文中常见的MapReduc ...
- 部署hadoop的开发环境
第一步:安装jdk 由于hadoop是java开发的,所以需要JDK来运行代码.这里安装的是jdk1.6. jdk的安装见http://www.cnblogs.com/tommyli/archive/ ...
- Tensorflow运行程序报错 FailedPreconditionError
1 FailedPreconditionError错误现象 在运行tensorflow时出现报错,报错语句如下: FailedPreconditionError (see above for trac ...
- git detached
git提交的时候,本地已经提交,却怎么也推送不到服务器,也没显示错误,只显示 everything-up-to-date : 原因是git不在master分支,而是处于detached head(匿名 ...
- mysql升级5.5
对付Linux的问题,其实很多都是权限问题,细心想一下即可. centos6.4默认装的是mysql5.1,使用 yum update 也update不了.google了一下,找到个yum安装的方法: ...
- Android Viewpager加Fragment做界面切换时数据消失的解决方式
今天遇到多个Fragment切换,回来后页面空白的情况,找到这个博客方法设置了一下,就可以了 vpAdapter = new VpAdapter(getSupportFragmentManager() ...
- LIGHT OJ 1199 - Partitioning Game
传送门 1199 - Partitioning Game PDF (English) problem=1199" style="color:rgb(79,107,114)&q ...