2016/02/07
6,904
Statement
前面我们提到了Statement,但是到目前为止,我们只使用了session,至少从代码上来看是这样的。
而实际上,我们已经在使用statement了,只不过它在代码中隐藏了起来。我们来看看Session类中的<<操作符:
1 2 3 4 5 6 |
template <typename T> Statement operator << (const T& t) /// Creates a Statement with the given data as SQLContent { return _statementCreator << t; } |
这里<<操作符创建了一个statement并将其返回。前面例子中我们使用<<操作符创建了statement,但是这个statement并没有分配到变量,一直到"now"部分executed了这个隐藏的statement,然后将其销毁。
我们将前面的例子拿一个出来修改一下:
1 2 3 4 |
std::string name("zrKing"); Statement stmt = (session << "INSERT INTO tbA VALUES(?)",use(name)); stmt.execute(); poco_assert(stmt.done()); |
当execute执行以后,数据已经插入了。可以使用stmt.done()来确认操作是否已经完全完成。
Prepared Statements
上例中省略的代码now子句创建了一个prepared statement.
prepared statement 的优势在于性能。我们假设有如下的循环:
1 2 3 4 5 6 7 |
std::string name; Statement stmt = (session << "INSERT INTO tbA VALUES(?)", use(name)); for(int i = 0; i<100; i++) { name.append("x"); stmt.execute(); } |
在上例中,如果不使用prepated statement,我们需要创建和解析Statement 100次。而现在我们只需要创建并解析一次Statement,然后使用占位符匹配不同的值,多次执行来将name插入到数据中。
当然,对于如何将一系列值插入到数据库,上例的代码并不是最优解。通过Poco::Data与STL容器协作可以更好的解决这个问题。具体的我们将在"STL容器"这一节来讲。 继续阅读