最近终于稍微有点空对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 = 2;string name = "Peter";string city = "zhuhai";blob bl = { city.c_str(), city.length() + 1 };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 = 0; i < 10; i++){writer.StartObject();writer.String("ID");writer.Int(i + 1);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 = 0; i < 10; 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 = 0, len = doc.Size(); i < len; i++){for (size_t j = 0, 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 = 0; i < 1000000; i++){ret = db.ExcecuteArgs(i, i, i, i, i, i + 1.25, "it is a test");if (!ret)break;}if (ret)db.Commit(); //提交事务elsedb.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. stm32封装库官网下载方法 bxl下载

    stm32封装库官网实在难找,以前都下载过,现在居然不知道在哪里下载的了,特此记录下载方法以防止忘记. 2019年2月19日 ST已经在官网发布了全系列MCU的原理图符号库和PCB封装库,使用bxl格 ...

  2. AD使用市面上绝大多数封装库

    刚入门硬件设计的同学,可能也和我一样,画PCB时,经常找不到合适的元件库.那么今天就给大家推荐一种方法,可以获得市面上绝大多数可用的元件库. 以前我们是可以通过立创(就是你花5块钱打PCB的那个嘉立创 ...

  3. Altium Designer系列:PCB元件封装库命名规则简介

    说明: 本文原创作者『Allen5G』 首发于微信公众号『Allen5G』 标签:编程,软件,算法,思维 QQ技术资料群:736386324 个人微信  :  coderAllen (人较多,请备注公 ...

  4. [Altium Designer 2020 硬件设计]原理图封装库创建及多部分组成单个器件原理图库创建

    通用准备工作 1.创建一个工作区,用于保存本教程内的所有工程. 2.创建一个原理图库. 3.绘制原理图库封装. 1.创建一个新的设计工作区 文件->新的->设计工作区 2.右击工作区,选择 ...

  5. maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository. ...

  6. Glide二次封装库的使用

    更多代码可以查询本人GitHub:欢迎阅读,star点起来.  Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支 ...

  7. 如何快速设计元器件原理图库和PCB封装库?

    目录 1.立创商城EDA免费库 2.Altium Library Loader 3.贸泽电子ECAD模型 在设计电路的过程中经常会遇到这样的问题:无法快速找到合适的元器件原理图封装和PCB封装(Foo ...

  8. mqttjar包_GitHub - a-voyager/MqttLib: Mqtt 通信封装库.

    lib.Connector --MQTT 封装库 lib.Connector 是基于 MQTT 协议的客户端/服务端通信库, 主要解决恶劣网络环境通信和数据帧格式的问题, 适用于物联网设备间通信. 特 ...

  9. pom配置之:distributionManagementsnapshot快照库和release发布库

    本文转载自:  铁木箱子的mzone的博客: http://www.mzone.cc/article/277.html http://www.mzone.cc/article/279.html 在使用 ...

最新文章

  1. JSON 基础解释.
  2. getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
  3. datetime 取分钟_datetime-Javascript,时间和日期:获取给定毫秒值的当前分钟,小时,天,周,月,年...
  4. MQ消息队列产品测试
  5. 时间序列研(part8)--ADF检验
  6. Android Sqlite3数据库操作
  7. notice!!!!!!!!!!
  8. 赤菟CH32V307 RISC-V 开发板 rt-thread 的坑 - esp8266的使用
  9. matlab画柱状图
  10. 20分钟让你阅读速度提高3倍
  11. 花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...
  12. Web页面切图和CSS注意事项
  13. 济南连续4年蝉联中国领军智慧城市,这六点是关键
  14. 第三方Banner制作轮播图的具体方法
  15. NIOS软核处理器入门实验
  16. 计算机视觉领域的一些牛人博客,研究机构等的网站链接 机器学习算法中文视频教程
  17. Material Dialogs库的使用
  18. 已拦截跨源请求:同源策略禁止读取位于...的远程资源。(原因:CORS 请求未能成功)。
  19. 软件质量保证与测试实验(实验三.逻辑覆盖测试用例设计)
  20. 知识付费的本质和未来

热门文章

  1. Windows 下的文件被占用问题解决
  2. 解决matplotlib的中文问题
  3. Nginx gzip参数详解及常见问题(已解决)
  4. Trello如何访问用户的剪贴板?
  5. 如何在Node.js中处理POST数据?
  6. JWT的API鉴权,基于拦截器的token与鉴权
  7. mysql json字符串_mysql如何截取一个json字符串?
  8. python3文档字符串_python3基础:字符串、文本文件
  9. 机器人环境感知算法之经典阶段
  10. python的库有哪些餐厅_Python告诉你上海有哪些高性价比的西餐厅