MySQL学习(7)-C++增删改查记录(CRUD)

2022-10-26 11:26:17

0. 前言

上一篇文章对如何在Qt中配置运行MySQLX 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、valuesinsert指定添加的字段,values填入各字段的值;
insert函数后可以跟多个values添加多行记录;
不可接子句
修改update、setupdate表明要修改记录,无参数;
set指定字段名和对应值
update函数后可以跟多个set函数,修改多个字段
查询select依次填入字段名;
可以接各种子句;
删除remove采用各种子句来定位要删除的记录;

如有错误欢迎指正,共同进步~


今天你学废了吗?

  • 作者:Copperxcx
  • 原文链接:https://blog.csdn.net/Copperxcx/article/details/121807659
    更新时间:2022-10-26 11:26:17