mysql template sql_【原创】12. MYSQL++之Template Query

本文介绍了MYSQL++库中的Template Query功能,它允许在运行时动态构建SQL查询。文章详细讲解了Template Query的概念、使用方法,包括通过参数传入实际值、使用`mysqlpp::SQLQueryParms`对象以及设置默认参数等。此外,还探讨了占位符的规范和使用,以及Template Query的实现原理,涉及`SQLQueryParms`和`mysqlpp::Query`的内部结构和成员函数。
摘要由CSDN通过智能技术生成

1. 什么是Template Query

在我们实际的编程过程中,我们很容易碰到printf这类需要在运行时来决定到底打印出什么的函数,例如

printf(“hello %s”, sth);

在这个例子中,那个%s占位符表明了我们以后希望打印的内容格式和位置。同样,在我们书写SQL语句的时候,也会出现这样的情况,例如

SELECT * from tbl1 WHERE id = ???

我们很有可能在代码中会根据用户的输入来决定如何写入这个???。一种解决办法是,我们在程序中自己记录除了???直往外的内容,然后每次拼接出这句SQL。另一种办法就是使用MYSQL++的Template Query功能。

说到底,Template Query就是让我们省去每次去做“拼接”的过程。MYSQL++引擎会为我们做这一切事情。

2. 如何使用Template Query

基本用法

通过作者为我们准备的manual以及tquery*.cpp这几个示例,我们可以总结出以下两种普遍的用法。

方法一:利用参数传入实际值

mysqlpp::Query query = con.query("select * from stock where item = %0q");

query.parse();

mysqlpp::StoreQueryResult res1 = query.store("Nürnberger Brats");

这个用法总结起来就是先设置template,然后调用Query:: store, Query:: exec, Query:: storein等等用于执行SQL语句的方法,然后把template中的占位符的内容“依次”(这个“依次”有玄机,见下文)写入这些方法的入参。

需要注意的是,上文中的%0,%1等表示输入的参数的顺序(但是在template中,%0,%1等数字可以任意排放),这个必须和Query:: store等传入的参数的顺序匹配。

方法二:利用mysqlpp:: SQLQueryParms传入参数

mysqlpp::Query query = con.query("select * from stock where item = %0q");

query.parse();

mysqlpp::SQLQueryParms sqp;

sqp << "hello";

mysqlpp::StoreQueryResult res1 = query.store(sqp);

大体上和普通用法一致,主要的区别在于对于Query:: store, Query:: exec等执行函数的参数上,不再使用逐个输入,而是类似于流式输入一般,先将所有的内容写入到mysqlpp:: SQLQueryParms中,然后一同当做入参。我认为此法换汤不换药。但是作者认为,提供这个机制的原因在于This is useful when the calling code doesn't know in advance how many parameters there will be. This is most likely because the templates are coming from somewhere else, or being generated.

方法三:默认参数

query << "select (%2:field1, %3:field2) from stock where %1:wheref = %0q:what";

query.parse();

query.template_defaults[1] = "item";

query.template_defaults["wheref"] = "item";

上面的两个query.template_defaults是一个效果,其中,第一个是使用了位置,第二个是使用了名字。有了这个默认参数之后,在后续的store等调用中,就不需要给这些参数进行设置了。

值得注意的是,MYSQL++的默认参数和C++的默参机制一样,都是只支持默认参数放在最后。这也就解释了为什么要为参数设置编号了(比如上面的%2:field1等)。

方法四:重置template query

当我们在一句template query之后,想要重新利用这个Query变量,应该如何通知MYSQL++来重用?query.reset() !

占位符

在作者的manual中专门有一个章节提到了占位符。我这里只是传达一下意思,

query << "select (%2:field1, %3:field2) from stock where %1:wheref = %0q:what";

上文中的%0q:what就是一个占位符。他的规范模式是这样的

%###(modifier)(:name)(:)

我觉得最后一个冒号(colon)可以先行忽略,它的作用就是为了防止你的name当中出现了冒号。根据作者的解释,###是数字,modifier主要有以下几个

符号

含义

%

需要打印出%

“”

告诉MYSQL++引擎不要quote和escape

q

告诉MYSQL++引擎根据需要quote和escape

Q

告诉MYSQL++引擎根据需要quote而无论如何不要es

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值