目录
0. 前言
上一篇文章对如何在Qt
中配置运行MySQL
的X DevAPI
工程做了比较详细的讲解,然后对X DevAPI
做了初步介绍,以及甩出一份热身代码。核心其实就是明白Session、Schema、Table
的角色。
在实际应用程序中,我们更关注的当然是表格记录的增删改查,本文就介绍一下X DevAPI
中的这一部分。
另外,在数据库的有关习惯性描述中,CRUD
被用来指代“增删改查”,分别对应Create、Read、Update、Delete
四个单词。今后本系列文章将遵循这一习惯。
系列文章回顾:
MySQL学习(1)-Windows环境安装和配置
MySQL学习(2)-基本概念、数据类型和简单语句
MySQL学习(3)-表格的“改”和“查”
MySQL学习(4)-批量执行SQL语句及导入记录文件
MySQL学习(5)-C++中使用MySQL(1)
MySQL学习(6)-C++中使用MySQL(2)
1. 获取表格Table对象
1.1 连接服务器的多种方式
上一篇文章提到了,创建好Session
对象以后,如果参数正确就能够直接连上服务器了,但只提到了一种连接方法。在Qt
中我们可以Ctrl+左键
点开Session
的定义,找到下一段示例:
Session from_uri("mysqlx://user:pwd@host:port/db?ssl-mode=disabled");
Session from_options("host", port, "user", "pwd", "db");
Session from_option_list(
SessionOption::USER, "user",
SessionOption::PWD, "pwd",
SessionOption::HOST, "host",
SessionOption::PORT, port,
SessionOption::DB, "db",
SessionOption::SSL_MODE, SSLMode::DISABLED
);
另外,在官方文档中,其实还提到了采用连接池的连接方式:
using namespace mysqlx;
Client cli("user:password@host_name/db_name", ClientOption::POOL_MAX_SIZE, 7);
Session sess = cli.getSession();
// use Session sess as usual
cli.close(); // close all Sessions
官方介绍道:这种方式被使用在 需要建立多个连接并且减小开销 的场合。
应该说大部分情况,我们都不太需要这种连接池的操作,知道有这么回事即可,等到确实需要再翻出来看吧~
这里的
Client
概念容易让笔者混淆Session
与客户端的对应关系😭
1.2 定位到对应表格Table
在控制台定位到Table
时,一般需要先USE db_name;
来指定数据库,再执行INSERT UPDATE DELETE SELECT
语句。
在C++
中,由于是面向对象,直接获取到数据库Schema
对象后,调用其getTable(name)
属性获取Table
对象即可。
涉及表格定位主要就两个函数:
// 连接到服务器
Session sess("localhost", 33060, "root", "root");
// 创建一个叫 test 的数据库,如果已经存在,则获取该数据库
Schema db = sess.createSchema("test", true);
// 获取表格,第二个参数表示确认存在,当表格不存在时抛出错误
// 源码:
// if (check_exists && !tbl.existsInDatabase())
// throw_error("Table does not exist");
Table tbl = db.getTable("students", false);
// 可以采用existInDatabase()来判断表格是否存在
if(!tbl.existsInDatabase())
{
cout<<endl<<"表格不存在!"<<endl;
}
2. 记录的CRUD操作
2.1 创建Create
创建记录调用的函数是insert()
,注意可以一次添加多条记录。
tbl.insert("id", "name")
.values(1, "Imani")
.values(2, "Adam")
.execute();
执行的流程图:
2.2 查询Read
调用select()
函数,结合各种子句,可以进行筛选、排序、截取等,与控制台区别不大:
auto res = tbl.select("age", "score") // 选择 age 和 score 字段
.where("name=='Bob'") // 选择 name 字段内容为 Bob
.orderBy("age") // 按 age 字段排序
.limit(10) // 截取10条记录
.offset(1) // 从截取的10条记录中偏移1条开始,则第1条被舍弃
.execute(); // 执行语句
执行的流程图:
2.3 修改Update
修改函数为update()
,需要配合set()
函数一起使用,指定要设置的值。
tbl.update() // 更新记录
.set("name", "Copper") // name字段改为Copper
.set("score", 100) // score字段改为100
.where("name='Bob'") // 选择name为Bob的条目
.limit(10) // 只改10条
.execute();
学废了学废了,看来期末成绩有救了👻👻👻
执行的流程图如下:
2.4 删除Delete
删除函数是remove()
(哈哈哈没想到吧并不是delete👻),同样地可以搭配where、orderBy、limit
子句:
tbl.remove()
.where("name='Bob'") // 删除name字段为Bob的记录
.orderBy("score") // 按score字段排序
.limit(10) // 截取10个
.execute(); // 执行
执行的流程图如下:
3. 小结
本文采用表格来小结:
操作 | 函数 | 说明 |
---|---|---|
添加 | insert、values | insert 指定添加的字段,values 填入各字段的值;insert 函数后可以跟多个values 以添加多行记录;不可接子句; |
修改 | update、set | update 表明要修改记录,无参数;set 指定字段名和对应值;update 函数后可以跟多个set 函数,修改多个字段; |
查询 | select | 依次填入字段名; 可以接各种子句; |
删除 | remove | 采用各种子句来定位要删除的记录; |
如有错误欢迎指正,共同进步~
今天你学废了吗?