(原创)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 ...
随机推荐
- 【TP3.2+Oracle】数据进行分页
1.写在前面:mysql的分页 通过limit 关键字进行处理, oracle却没有limit,而是用ROWNUM 字段来进行分页 2.参考示例,TP3.2 代码,其实原理看懂了 其他框架和原生都可以 ...
- 使用Servlet发布WebService
首先感谢熔岩的文章: http://lavasoft.blog.51cto.com/62575/227988 1.Eclipse安装上tomcat插件,http://www.eclipsetotale ...
- java mongodb 基础系列---查询,排序,limit,$in,$or,输出为list,创建索引,$ne 非操作
官方api教程:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#getting-started ...
- 倒计时实现两种方法-NSTimer/GCD
#import "ViewController.h" @interface ViewController () @property (nonatomic ,strong)UIBut ...
- 使用btrace来找出执行慢的方法
转载于:https://shaojun.name/2016/07/260 btrace script import static com.sun.btrace.BTraceUtils.name; im ...
- permission denied (publickey)问题的解决 和 向github添加ssh key
使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...
- apktool 在mac下的使用 -反编译安卓apk文件
1.下载apktool 点击这里下载 ,里面有两个文件,一个是.jar,一个是自己写的脚本.sh 注:最新的apktool.jar 文件可以点击这里下载 .sh脚本是自写脚本可不用更新最新,下载的ja ...
- 站在.NET的角度学安卓的草民笔记1
Java -> .NET 安卓 -> winform/WPF 类继承Activity -> 类继承 For ...
- 【转】Braid - 一个发人深思的游戏
Braid - 一个发人深思的游戏 我已经很久很久没有打游戏了(如果不算 Angry Birds 之类用来打发时间的游戏的话).我的最后一个真正意义上的游戏机,是 PlayStation 1.在那上面 ...
- SharePoint 2013 启用 以其他用户身份登陆(Sign in as different user)
习惯于SharePoint 2010的用户会发现,SharePoint 2013默认把 以其他用户身份登陆(Sign in as different user)的选项去掉了,这对于开发人员来说很麻烦 ...