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


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的定义,找到下一段示例:

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

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


今天你学废了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值