最近终于稍微有点空对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封装库请告诉我,如果没有请点一下推荐,谢谢。^_^

SmartDBV1.03

欢迎使用,如果发现有问题请向我反馈。

c++11 boost技术交流群:296561497,欢迎大家来交流技术。

(原创)sqlite封装库SmartDB1.3发布的更多相关文章

  1. QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData

    SQLite数据库: SQLite是轻量级的数据库,适合应用在移动设备和小型设备上,它的优点是轻量,可移植性强.但它的缺点是它的API是用C写的,不是面向对象的.整体来说,操作起来比较麻烦.所以,一般 ...

  2. 【JavaScript 封装库】BETA 5.0 测试版发布!

    JavaScript 前端框架(封装库) BETA 5.0 已于10月10日正式发布,今天开始提供 BETA 5.0 的 API 参考文献.相较于之前 5 个版本的发布都是草草的提供源代码,并没有很多 ...

  3. 【原创】Capture CIS利用Access数据库建立封装库说明

    1.在服务器端建立新空间,方便封装库以及数据库的归档存放 服务器路径:\\192.168.1.234\Share\STG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib ...

  4. 【JavaScript 封装库】BETA 4.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  5. 【JavaScript 封装库】BETA 3.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  6. 【JavaScript 封装库】BETA 2.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  7. 【JavaScript 封装库】BETA 1.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  8. 【JavaScript 封装库】Prototype 原型版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  9. 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件

    看到Andy_2020发的帖子“Altium Designer专题”之后,对Altium Designer的3D功能很感兴趣,着手自己做一个AD的3D封装库.刚开始按照Andy介绍的方法,学了两天So ...

随机推荐

  1. Spring+Quartz实现动态添加定时任务

    发布时间:2018-12-03   技术:spring4.0.2+quartz2.2.1   概述 在最近工作中,由于涉及到定时任务特别多,而这些工作又是由下属去完成的,在生成环境中经常会出现业务逻辑 ...

  2. ELK + kafka 日志方案

    概述 本文介绍使用ELK(elasticsearch.logstash.kibana) + kafka来搭建一个日志系统.主要演示使用spring aop进行日志收集,然后通过kafka将日志发送给l ...

  3. 【TP3.2】模板 select选项采坑

    1.TP3.2 模板 select 下拉框采坑 <div class="form-item"> <label class="item-label&quo ...

  4. 【TP3.2.*】解决session过期不失效 和 设置不成功问题

    // ---------- 更新与 2019/01/23日 -------------// 1.问题:本来我想设置session有效期1800秒即30分钟 失效的,可是实际使用TP3.2.0的时候发现 ...

  5. mysql中日志的配置与分析

    默认情况下,如果日志没有配置,则只记录错误日志,记录到syslog,配置文件 /etc/mysql/conf.d/mysqld_safe_syslog.cnf (ubuntu下) [mysqld_sa ...

  6. 轻量级桌面 openbox + tint2 + conky + stalonetray + pcmanfm + xcompmgr

    openbox+tint2+pnmixer+conky=轻量级archlinux桌面环境设置备忘 缘起 机器上的Ubuntu 12.04有一段时间没有使用了,最近在用的时候发现频繁死机的情况,开始以为 ...

  7. tensorflow没有代码提示的问题

    在tensorflow包下的__init__.py文件中定义了一个contrib变量表示tensorflow.contrib包下的内容,但是tensorflow.contrib这个包是懒加载的,也就是 ...

  8. LPDMvvmKit 系列之 UITableView 的改造

    阅读本文需要对ReactiveCocoa足够了解,也可以参阅图解ReactiveCocoa基本函数(http://www.jianshu.com/p/38d39923ee81) Cocoa Touch ...

  9. HSSFWorkbook 与 XSSFWorkbook

    刚开始使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,对Excel2003以前(包括2003)的版本没有问题,但读取Exce ...

  10. 【Linux】数据流重导向(前篇)

    数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件 ...