yii源码三 -- db
《AR》
CActiveRecord:
path:/framework/db/ar/CActiveRecord.php
overview:is the base class for classes representing relational data.It implements the active record design pattern, a popular Object-Relational Mapping (ORM) technique.
实现原理:首先一套__sleep(),__get(),__set(),__isset(),__unset(),__call()魔术方法,来处理model和model属性。
public function getRelated($name,$refresh=false,$params=array()){}
对该方法,有一段很重要的介绍如下:
* Returns the related record(s).
* This method will return the related record(s) of the current record.
* If the relation is HAS_ONE or BELONGS_TO, it will return a single object
* or null if the object does not exist.
* If the relation is HAS_MANY or MANY_MANY, it will return an array of objects
* or an empty array.
public function primaryKey(){}
如何表设置了主键,则返回null,不需要覆盖该方法;否则返回array(),且需要覆盖该方法。
《schema》
CDbConnection:
path:/framework/db/CDbConnection.php
overview:CDbConnection represents a connection to a database.
工作原理:CDbConnection works together with CDbCommand, CDbDataReader and CDbTransaction to provide data access to various DBMS。且基于PDO扩展。
首先用$connection = new CDbConnection($dsn,$username,$password)创建一个连接实例,然后调用$connection->active=true启动连接。
用法:
1.创建DB实例并建立连接:
- $connection=new CDbConnection($dsn,$username,$password);
- $connection->active=true; //建立连接
2.执行sql语句:
- $command=$connection->createCommand($sqlStatement);
- $command->execute(); //执行非查询语句(insert,delete,update)
- $reader=$command->query();//执行查询语句(select)
备注:预处理和绑定参数用法:
- $command=$connection->createCommand($sqlStatement);
- $command->bindParam($name1,$value1);
- $command->bindParam($name2,$value2);
- $command->execute();
3.获取结果:
- foreach($reader as $row){
- ......
- }
4.事务:
- $transaction=$connection->beginTransaction();
- try{
- $connection->createCommand($sql1)->execute();
- $connection->createCommand($sql2)->execute();
- //.... other SQL executions
- $transaction->commit();
- }catch(Exception $e){
- $transaction->rollback();
- }
5.由于CDbConnection实现了IApplicationComponent接口,所以它可以当作一个application component并且在application配置文件(main.php)里配置数据库连接信息:
- array(
- 'components'=>array(
- 'db'=>array(
- 'class'=>'CDbConnection',
- 'connectionString'=>'sqlite:path/to/dbfile',
- ),
- ),
- )
CDbCommandBuilder:
path:/framework/db/schema/CDbCommandBuilder.php
overview:provides basic methods to create query commands for tables.
CDbDataReader:
path:/framework/db/schema/CDbDataReader.php
overview:represents a forward-only stream of rows from a query result set.
CDbTransaction:
path:/framework/db/schema/CDbTransaction.php
overview:a DB transaction.
- $transaction=$connection->beginTransaction();
- try{
- $connection->createCommand($sql1)->execute();
- $connection->createCommand($sql2)->execute();
- //.... other SQL executions
- $transaction->commit();
- }
- catch(Exception $e){
- $transaction->rollback();
- }
...
yii源码三 -- db的更多相关文章
- JFinal 源码分析 [DB+ActiveRecord]
我记得以前有人跟我说,“面试的时候要看spring的源码,要看ioc.aop的源码"那为什么要看这些开源框架的源码呢,其实很多人都是"应急式"的去读,就像读一篇文章一下, ...
- AQS源码三视-JUC系列
AQS源码三视-JUC系列 前两篇文章介绍了AQS的核心同步机制,使用CHL同步队列实现线程等待和唤醒,一个int值记录资源量.为上层各式各样的同步器实现画好了模版,像已经介绍到的ReentrantL ...
- Yii源码阅读笔记(三十三)
ServiceLocator,服务定位类,用于yii2中的依赖注入,通过以ID为索引的方式缓存服务或则组件的实例来定位服务或者组件: namespace yii\di; use Yii; use Cl ...
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- JDK1.8源码(三)——java.lang.String 类
String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...
- JDK1.8源码(三)——java.lang.String类
一.概述 1.介绍 String是一个final类,不可被继承,代表不可变的字符序列,是一个类类型的变量.Java程序中的所有字符串字面量(如"abc")都作为此类的实例实现,&q ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- spring事务源码分析结合mybatis源码(三)
下面将结合mybatis源码来分析下,这种持久化框架是如何对connection使用,来达到spring事务的控制. 想要在把mybatis跟spring整合都需要这样一个jar包:mybatis-s ...
- yii源码一 -- CComponent
CComponent: path:framework/base/CComponent.php overview:This file contains the foundation classes fo ...
随机推荐
- XE5 修复 安卓 输入法隐藏 后 无法退出的问题 3.1
(****************************************************)(* *)(* 编写:爱吃猪头肉 & Flying Wang *)(* 上面的版权声 ...
- 【JVM】linux上tomcat中部署的web服务,时好时坏,莫名其妙宕机,报错:There is insufficient memory for the Java Runtime Environment to continue.
=========================================================================================== 环境: linu ...
- cocos2d-x getVisibleOrigin
getVisibleSize:表示获得视口(可视区域)的大小,如果DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize等于getWinSize.getVisible ...
- WebApp分析建模的工具
最近Web工程课在学习分析建模工具的内容.这周作业就写我对WebApp建模工具的认识.Web建模工具有很多,但是专门为分析开发的却相对很少.下面介绍在进行分析时可以用的四类工具. UML工具.使用统一 ...
- Lua调用C++时打印堆栈信息
公司的手游项目,使用的是基于cocos2d-x绑lua的解决方案(参数quick-x的绑定),虽然使用了lua进行开发,更新很爽了,但是崩溃依然较为严重,从后台查看崩溃日志时,基本上只能靠" ...
- url空格转码的问题
上知乎在搜索框里输入"1-n 随机数"(中间有空格,然后会看到了这个界面) 最开始我使用的是chrome,发现有脚本报错了,以为是服务器维护了,但再一想,不对啊,刚刚明明是好的 ...
- 用layer-list实现图片旋转叠加、错位叠加、阴影、按钮指示灯
先来看看一个简单的文件: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:a ...
- WorkerThread与MainThread之间通过Handler进行最简单的消息传递
一.从自己开启的线程中给主线程发送信息,更新UI 这个实例的效果是,在线程中通过handler发送一条信息给handler,然后通过handler更改UI线程中,textview的文字. 主要方法是( ...
- python 多线程日志切割+日志分析
python 多线程日志切割+日志分析 05/27. 2014 楼主最近刚刚接触python,还是个小菜鸟,没有学习python之前可以说楼主的shell已经算是可以了,但用shell很多东西实现起来 ...
- Asp.Net Core 文件上传处理
本文主要介绍后台接收处理 1.在使用控制器接收 : [HttpPost] : public IActionResult UploadFiles(IList<IFormFile> files ...