目录
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
的定义,找到下一段示例:
Sessionfrom_uri("mysqlx://user:pwd@host:port/db?ssl-mode=disabled");
Sessionfrom_options("host", port,"user","pwd","db");
Sessionfrom_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;
Clientcli("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
对象即可。
涉及表格定位主要就两个函数:
// 连接到服务器
Sessionsess("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 | 采用各种子句来定位要删除的记录; |
如有错误欢迎指正,共同进步~
今天你学废了吗?