StupidBeauty
Read times:495Posted at:Fri Mar 29 04:43:54 2013
- no title specified

Wt3.2.3文档翻译:Wt::Dbo::Session类参考,Wt::Dbo::Session Class Reference

成员函数文档

template<class C , typename BindStrategy >

Query< ptr< C >, BindStrategy > Wt::Dbo::Session::find

(

const std::string &

condition = std::string()

)

查找数据库对象。

此方法创建一个查询对象,用于查找类型为 C的数据库对象。

当传入的condition 参数为空字符串时,它会返回所有类型为 C的数据库对象。否则,它会加入查询条件,加入的手段就是生成一个结构化查询语言(SQL)的where 子句。

BindStrategy指定的是,(如果有查询条件的话,)如何将查询条件绑定到妳的查询对象中。

当使用动态绑定( DynamicBinding )(这是默认值)时,绑定过程将是异步的(defer),直到查询对象被运行时才会真正绑定。这会带来一些好处:妳可以使用这个查询对象中提供的辅助函数来构造出查询定义条件;妳可以保留这个查询对象,并且多次运行它,每次可使用不同的参数值,或者在查询结果中遍历。

当使用直接绑定( DirectBinding )时,该查询对象必须整个都使用查询条件condition 构造完成,并且只能运行一次。这种方式的好处是,参数会直接绑定到底层的预准备的语句中去。

当妳只是想从单个表中查询结果的时候,这种方法是狠方便的。要想进行更通用的查询,就参考query()

使用示例:

// Bart不见了,让我们找到他。

Wt::Dbo::ptr<User> bart = session.find<User>().where("name = ?").bind("Bart");

// 查找所有用户,按照名字排序

typedef Wt::Dbo::collection< Wt::Dbo::ptr<User> > Users;

Users users = session.find<User>().orderBy("name");

condition 中,可使用'?'作为占位符来绑定参数:其中出现的每个'?' (作为一个字面(lexical)符号)都会被一个绑定的参数替换。这个过程实际上是由大部分后端自行完成的,它们实现这个功能的手段就是预准备的语句和参数绑定。对于任何针对sql_value_traits 做过模板特化(specialized)的类型,都可以使用参数绑定。

参考:

query()

template<class C >

void Wt::Dbo::Session::mapClass

(

const char *

tableName

)

将一个类映射到一个数据库表上

C 这个类会被映射到一个名为tableName 的表上。妳必须将类映射到表上去

如果底层的数据库支持按模式限制的(schema-qualified)表名的话,妳就可以使用这种形式的表名,例如 "myschema.users"

template<class Result , typename BindStrategy >

Query< Result, BindStrategy > Wt::Dbo::Session::query

(

const std::string &

sql

)

创建一个查询对象。

这里的结构化查询语言(sql)语句应当是一个完整的结构化查询语言语句,以"select "开头。在"select"中列出的那些条目必须与Result 的类型匹配。对应于一个数据库对象(ptr)的条目将会被dbo 中所有字段的选择结果(selection)替换掉。

例如,以下的这个查询对象(User类被映射到数据表'user'):

session.query< ptr<User> >("select u from user u").where("u.name = ?").bind("Bart");

是以下代码的更通用版本:

session.find<User>().where("name = ?").bind("Bart");

注意,这个查询对象中的"u"会被展开为选择user 这个表中的所有字段(u.id、u.version、u.name……)。当妳在Query::groupBy()中使用别名(alias)的时候,也会发生这种展开过程。

相对于find(),query()能够提供的灵活性就在于它能够支持其它的结果类型。

因此,它可能返回基本(plain)值:

session.query<int>("select count(1) from ...");

或者Boost.Tuple,表示一种由任意类型的结果值产生的组合:

session.query< boost::tuple<int, int> >("select A.id, B.id from table_a A, table_b B").where("...");

一个元组(tuple)能将任何可作为结果的类型组合起来,包括数据库对象(参考ptr_tuple):

session.query< boost::tuple<ptr<A>, ptr<B> > >("select A, B from table_a A, table_b B").where("...");

BindStrategy指定的是如何将参数(如果有的话)绑定到妳的查询对象中

如果使用动态绑定 DynamicBinding )(默认值)的话,参数与实际结构化查询语言 (sql)语句之间的绑定是延迟发生的 ,直到查询真正执行的时候才绑定。 这会带来一些好处:妳可以使用这个 查询对象 中提供的辅助函数来构造出查询定义条件;妳可以保留这个查询对象,并且多次运行它,每次可使用不同的参数值,或者在查询结果中遍历。

当使用直接绑定( DirectBinding )时,查询条件必须完整地使用sql 来指定,并且只能被执行一次。这种方式的好处是,参数会直接绑定到底层的预准备的语句中去。

此方法使用query_result_traits 来将查询结果填充(unmarshal)到Result 类型中去。

在这个sql 查询中,参数可以用'?'作为占位符来绑定:其中出现的每个'?'(作为字面符号)都会被替换为一个绑定的参数。这个过程实际上是由大部分后端自行完成的,它们实现这个功能的手段就是预准备的语句和参数绑定。对于任何针对sql_value_traits 做过模板特化(specialized)的类型,都可以使用参数绑定。

注意:

查询语句必须是一个7位美国标准信息交换码(ASCII-7) 字符串:底层的查询语句分析器是不支持UTF-8 的。要想将非英文的字符串加入到查询语句中去的话,就应当使用参数绑定(它同时还能防止结构化查询语言注射攻击),而不是使用字符串拼接。

李颖

富士康

朱丽倩

未知美女

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4