数据库之DAO
2012-11-16 14:00
525 查看
吐血的事情发生了,写了一半,网页死了,还没草稿。之前翻了一大堆,也不想翻了,都是介绍DAO的一些基本知识。
跳过之前翻的,继续
1.2 执行SQL语句
数据库的连接建立好以后,SQL语句就可以通过CDbCommand来执行。我们可以通过调用CDbConnection::createCommand()来实例化一个CDbCommand:
一个SQL语句,通过调用CDbCommand后,有两种执行方式:
●execute(): 执行一个非查询语句,例如INSERT, UPDATE and DELETE 。
●query(): 执行一个有返回数据集的SQL语句,例如SELECT。如果成功,返回一个CDbDataReader的实例,可以遍历所有的查询返回记录。为了便捷各位代码,Yii也提供了一些诸如queryXXX()的方法,可以直接返回查询的结果。
SQL在执行的过程中如果出错的话,会抛出一些异常错误。
1.3 获取查询结果
在CDbCommand::query() 实例化了CDbDataReader后,我们可以通过CDbDataReader::read()来读取数据,也可以使用PHP来一条一条的读取。
注意,跟query()不一样的地方,queryXXX() 方法所返回的,是数据本书。例如,queryRow()返回符合查询条件的第一个记录的数组。
1.4 事务的使用
当一个应用执行批量的增删查改的时候,很重要的一点,要保证所有操作都完成,而不是某些操作被完成。这个就是事务,具体还不了解数据库事务的另外找资料补习一下。在Yii当中,CDbTransaction就是用来做事务处理的:
●Begin the transaction.
●逐条的执行SQL语句,任何对数据库的更新操作,对外部来说都是不可见的。
●提交事务。如果成功的话,更新的数据对外就可见了。
●如果其中的某个操作失败,则整个事务回滚。
以上的工作流,用代码表现就是:
1.5 参数绑定
为了防止SQL注入,以及优化SQL语句,我们可以用变量的方式来写SQL语句。这个变量占位符可以是命名的(变量),也可以是未命名的(问号)。通过调用CDbCommand::bindParam() 或者是CDbCommand::bindValue()来替换这些占位符。参数不用引号,底层数据库会提供这些。在SQL语句执行之前,参数绑定就必须先完成了。
bindParam() 和bindValue()这两个方法非常的相似,唯一的区别在于:前者绑定的是PHP的变量,后者绑定的是值。当变量的值是一个大的数据块时,前者看起来就好多了。
有关更多的参数绑定,可以参考PHP的相关文档。
1.6 列绑定
当我们要获取查询结果的时候,也可以采用绑定PHP变量的方法。绑定以后,PHP变量会自动的获取到当前的记录集所对应的列值。
1.7 使用表前缀
Yii集成了表前缀的使用。表前缀意思就是在当前的数据库连接中,每个表的其实都是相同的一个字符串,一般是在共享主机的环境中(也就是说一个数据库,有多个应用工程)。例如,一个工程用tbl_作为前缀,而另外的一个工程则用yii_作为前缀。
要启用表前缀,配置CDbConnection::tablePrefix的属性就可以了。然后在SQL语句中,用`TableName`来做表名,这里的TableName就不需要前缀了。例如,数据库中有一个表,名为tbl_user,我们把tbl_作为表前缀,配置好以后,我就可以用以下的代码来查询这个表了。
跳过之前翻的,继续
1.2 执行SQL语句
数据库的连接建立好以后,SQL语句就可以通过CDbCommand来执行。我们可以通过调用CDbConnection::createCommand()来实例化一个CDbCommand:
$connection=Yii::app()->db; // assuming you have configured a "db" connection // If not, you may explicitly create a connection: // $connection=new CDbConnection($dsn,$username,$password); $command=$connection->createCommand($sql); // if needed, the SQL statement may be updated as follows: // $command->text=$newSQL;
一个SQL语句,通过调用CDbCommand后,有两种执行方式:
●execute(): 执行一个非查询语句,例如INSERT, UPDATE and DELETE 。
●query(): 执行一个有返回数据集的SQL语句,例如SELECT。如果成功,返回一个CDbDataReader的实例,可以遍历所有的查询返回记录。为了便捷各位代码,Yii也提供了一些诸如queryXXX()的方法,可以直接返回查询的结果。
SQL在执行的过程中如果出错的话,会抛出一些异常错误。
$rowCount=$command->execute(); // execute the non-query SQL $dataReader=$command->query(); // execute a query SQL $rows=$command->queryAll(); // query and return all rows of result $row=$command->queryRow(); // query and return the first row of result $column=$command->queryColumn(); // query and return the first column of result $value=$command->queryScalar(); // query and return the first field in the first row
1.3 获取查询结果
在CDbCommand::query() 实例化了CDbDataReader后,我们可以通过CDbDataReader::read()来读取数据,也可以使用PHP来一条一条的读取。
$dataReader=$command->query(); // calling read() repeatedly until it returns false while(($row=$dataReader->read())!==false) f ... g // using foreach to traverse through every row of data foreach($dataReader as $row) f ... g // retrieving all rows at once in a single array $rows=$dataReader->readAll();
注意,跟query()不一样的地方,queryXXX() 方法所返回的,是数据本书。例如,queryRow()返回符合查询条件的第一个记录的数组。
1.4 事务的使用
当一个应用执行批量的增删查改的时候,很重要的一点,要保证所有操作都完成,而不是某些操作被完成。这个就是事务,具体还不了解数据库事务的另外找资料补习一下。在Yii当中,CDbTransaction就是用来做事务处理的:
●Begin the transaction.
●逐条的执行SQL语句,任何对数据库的更新操作,对外部来说都是不可见的。
●提交事务。如果成功的话,更新的数据对外就可见了。
●如果其中的某个操作失败,则整个事务回滚。
以上的工作流,用代码表现就是:
$transaction=$connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); //.... other SQL executions $transaction->commit(); } catch(Exception $e) // an exception is raised if a query fails { $transaction->rollBack(); }
1.5 参数绑定
为了防止SQL注入,以及优化SQL语句,我们可以用变量的方式来写SQL语句。这个变量占位符可以是命名的(变量),也可以是未命名的(问号)。通过调用CDbCommand::bindParam() 或者是CDbCommand::bindValue()来替换这些占位符。参数不用引号,底层数据库会提供这些。在SQL语句执行之前,参数绑定就必须先完成了。
// an SQL with two placeholders ":username" and ":email" $sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)"; $command=$connection->createCommand($sql); // replace the placeholder ":username" with the actual username value $command->bindParam(":username",$username,PDO::PARAM_STR); // replace the placeholder ":email" with the actual email value $command->bindParam(":email",$email,PDO::PARAM_STR); $command->execute(); // insert another row with a new set of parameters $command->bindParam(":username",$username2,PDO::PARAM_STR); $command->bindParam(":email",$email2,PDO::PARAM_STR); $command->execute();
bindParam() 和bindValue()这两个方法非常的相似,唯一的区别在于:前者绑定的是PHP的变量,后者绑定的是值。当变量的值是一个大的数据块时,前者看起来就好多了。
有关更多的参数绑定,可以参考PHP的相关文档。
1.6 列绑定
当我们要获取查询结果的时候,也可以采用绑定PHP变量的方法。绑定以后,PHP变量会自动的获取到当前的记录集所对应的列值。
$sql="SELECT username, email FROM tbl user"; $dataReader=$connection->createCommand($sql)->query(); // bind the 1st column (username) with the $username variable $dataReader->bindColumn(1,$username); // bind the 2nd column (email) with the $email variable $dataReader->bindColumn(2,$email); while($dataReader->read()!==false) { // $username and $email contain the username and email in the current row }
1.7 使用表前缀
Yii集成了表前缀的使用。表前缀意思就是在当前的数据库连接中,每个表的其实都是相同的一个字符串,一般是在共享主机的环境中(也就是说一个数据库,有多个应用工程)。例如,一个工程用tbl_作为前缀,而另外的一个工程则用yii_作为前缀。
要启用表前缀,配置CDbConnection::tablePrefix的属性就可以了。然后在SQL语句中,用`TableName`来做表名,这里的TableName就不需要前缀了。例如,数据库中有一个表,名为tbl_user,我们把tbl_作为表前缀,配置好以后,我就可以用以下的代码来查询这个表了。
$sql='SELECT * FROM ffusergg'; $users=$connection->createCommand($sql)->queryAll();
相关文章推荐
- spring+hibernate架设中Dao访问数据库的几种步骤
- YII 数据库操作之DAO
- Android GreenDao数据库操作之增删改查
- Spring使用DAO完成数据库操作
- GreenDao数据库升级解决方案
- ODBC 、DAO 、ADO 、OLEDB 数据库连接方式区别及联系
- 【脚本语言系列】关于Python数据库访问DAO, 你需要知道的事
- 数据库访问层中使用GenericDao和HibernateDaoSupport
- greenDAO 官方替换数据库框架ObjectBox 学习 写记录1
- java Dao层对数据库操作总结
- java项目实战-超市管理系统(七)如何导入数据到数据库?Dao包源码与分析
- 程序中同时使用DAO和ADO连接数据库
- Android数据库greenDAO框架用法和源码分析
- 利用DAO&VB定义和操纵数据库
- 数据库工具类(UserDao)
- GreenDao的数据库存储
- 数据库dao中
- DAO数据库:查询
- Android GreenDao使用详解——(下)数据库升级
- 为防止数据库连接泄漏,对Dao中数据库连接的使用做统一规范