C++之Sqlite3小白入门

一.sqlite3简介

1.个人浅见

sqlite3(官方文档)是一种轻量级且应用广泛的关系型数据库的一种。sqlite3数据库可运行在类Unix和window系统之上,其中,大部分的类Unix系统(如Linux)都默认安装了sqlite3数据库,个人使用的系统为Ubuntu 16.04,默认情况下系统已经安装了sqlite3数据库,检测方法为:在Terminal中执行sqlite3,即可进入sqlite3的命令编辑模式,若失败请手动编译安装sqlite3数据库。

首先明白几个概念:

1.DML(Data Manipulattion Language),顾名思义--数据操作语言。所谓数据操作,是指对数据的插入(insert),删除(delete),更新(update)等。
2.DQL(Data Query Language)--数据查询语言。DQL的基本结构是由SELECT等查询语句及其子语句组成。
3.DDL(Data Definition Language)--数据定义语言。DDL是对数据库进行创建的语言。比如创建数据库(create database),创建数据表(create table),删除数据表(drop table)等。

2.sqlite3语法

sqlite有其独特的语法规则。

1.大小写的敏感性.在sqlite中,是不区分大小写的,例如创建表语句`CREATE TABLE tablename;`;和`create table tablename;`效果是完全一样的,再比如查询语句'select * from tablename'和'SELECT * FROM tablename'也是完全一样的。
2.所有的sqlite语句可以以任何关键字开始,`select`,`insert`,`create`等,以距离最近的 **“;”** 作为本条语句的结束标志。

3.sqlite的命令

sqlite数据库中有一些特殊的命令,这些特殊的命令都以 .(点)开头,命令结尾不需要“;” 结尾,这些特殊的命令被称为sqlite的点命令。有一个特殊的点命令.help,它可以列出所有sqlite的点命令及其使用说明,如图所示:C++之Sqlite3小白入门_第1张图片

sqlite点命令的详细介绍

二.sqlite3之C++接口

sqlite提供原生态的C/C++接口,从其C/C++接口文档可以查看所有的接口及使用方法。简单介绍几个常用的对象和接口:

1.`sqliet3`.数据库对象,类似于数据库的入口。
2.`sqlite3_stmt`.状态存储对象,按照官网解释 “ An instance of this object represents a single SQL statement that has been compiled into binary form and is ready to be evaluated.” 通俗来说,就是它是一个对象实体,该实体所存储的东西是已经**预编译**好的单条SQL语句,这个实体对象可以被后续的sqlite3语句执行。`sqlite3_stmt`对象类似于C/C++语言中**预编译**的结果(在C++编程中,预编译的结果存储在二进制文件中,我们一般看不到)。
3.`sqlite3_open(const char *filename,sqlite3 **ppDb)`接口。该函数用于打开或创建(若`filename`不存在)一个数据库对象,创建的结果保存在`ppDd`所指定的`sqlite3`对象中.
4.`sqlite3_prepare_v2(sqlite3 *db,const char *zSql,int nByte,sqlite3_stmt **ppStmt,const char **pzTail);`接口,该函数主要是对SQL语句进行预编译,并将结果存在参数4指定的对象中。其中参数2`zSal`是代指一条SQL语句的字符串,参数3代指该`zSql`字符串的最大占用字节长度,参数4 `双重指针参数ppStmt`即存储经过sqlite3编译后的SQL语句的结果,最后一个参数指代参数`zSql`字符串的没有使用的地址偏移量,一般置`nullptr`即可。该函数执行成功,返回`int`类型的`SQLITE_OK`,失败返回错误代码。
5.`sqlite3_step(sqlite3_stmt *);`接口,该函数主要是用于执行`sqlite3_prepare()`函数所编译好的`sqlite3_stmt`对象。对与DDL和DML而言,该函数执行成功返回`SQLITE_DONE`,对于DQL而言,若执行成功,则返回`SQLITE_ROW`。
6.`sqlite3_finalize(sqlite3_stmt *pStmt);`接口,主要用于释放`sqlite3_stmt`对象所占用的资源,执行成功过返回`SQLITE_OK;`。
7.`sqlite3_close(sqlite3 *);`接口,该函数主要用于关闭`sqlite3`数据库对象,成功返回`SQLITE_OK`。

以上两个对象(1 和 2)以及5个接口函数(3-7)应该算是SQLite c/c++编程中最重要也是最基础的,几乎每个SQLite C编程都离不开。当然还有一些其他重要的函数,比如sqlite3_bind()族类,sqlite3_column()族类,以及sqlite3_exec()等,这些函数的存在极大方便了sqlite3编程。

三.sqlite3编程示例

在这里创建了一个sqlite操作的类Data,所有对sqlite数据库的操作都作为该类的方法,该程序文件如下:

#include 
#include 
#include 
#include 
using namespace std;
//创建操作数据库的类

class Data
{
public:
    Data(){
        cout<<"执行构造函数"<createData();
    base->insertBatch();
    //打印从第一条记录开始的一条记录(记录索引从0开始)
    base->selectData(1,1);
    base->updateData(1,2);

    base->drop();
    delete base;
    base = nullptr;
    return 0;    
}

从以上简单示例可以看出,sqlite3c++编程基本都要经过三个步骤(在不使用sqlite3_exec()):

1.声明`SQL`语句和`sqlite3_stmt` 对象;
2.调用`sqlite3_prepare()`函数 “预编译”;
3.调用`sqlite3_step()`函数执行`SQL`操作.

在上面几个类方法中,唯一有点特别的是void insertBatch()函数,与其他功能函数的主要区别就是:在该函数中,显示的开启了一个事务,所有的插入操作均在该事务内完成,直到该事务被显示的提交
所谓事务,其实就是一块执行单元,一块代码段,在该执行单元内的sqlite操作,都不会自动的提交到数据库中,直到显示的执行 SQL commit。在sqlite中,所有的操作本质都是“事务性”的,只不过被sqlite隐式的创建并提交,默认情况下,每一个sqlite3函数的调用都伴随着事务的发生。
一般情况下,数据插入类似下面的代码:

void insert(){
    const char *insertSQL= " ..... ";
    sqlite3_stmt 对象;
    for(int i=0;i < count;++i){
        执行预编译 sqlite3_prepare();
        执行插入 sqlite3_step();
        ....
        ....
    }
}

在方法void insertBatch()中,如要插入大批量数据,只需要执行一次 “预编译” 即可,然后基于数据绑定的方式在事务内部执行SQL插入语句,极大节省了sqlite3_prepare_v2()函数的调用次数(通常 函数sqlite3_prepare_v2()比函数sqlite3_step()执行时占用时间更多)。

可以看出,在执行大批量操作时,显示的创建并提交事务,能够优化编码,并提高代码执行效率,并且各个事务之间是隔离状态--不同事务之间相互独立和透明的。

注意:在结束数据库操作的时候,一定记得执行sqlite3_close()函数关闭该库,在执行关闭操作之前,也要确保每一个sqlite3_stmt对象的资源被释放(调用sqlite3_finalize()),否则容易造成内存泄露。

你可能感兴趣的:(c++,linux,sqlite,vim)