国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

寫一個“特殊”的查詢構造器 - (前言)

GitChat / 2538人閱讀

摘要:而在項目開發中,我們想要的是一個更好用的可維護的工具,此時,對代碼的封裝模塊化就顯得尤為重要,于是出現了兩種方案查詢構造器,對象關系映射。典型環境下按照一般的查詢構造器處理就行。

文章目錄

寫一個“特殊”的查詢構造器 - (前言)

寫一個“特殊”的查詢構造器 - (一、程序結構,基礎封裝)

寫一個“特殊”的查詢構造器 - (二、第一條語句)

寫一個“特殊”的查詢構造器 - (三、條件查詢)

寫一個“特殊”的查詢構造器 - (四、條件查詢:復雜條件)

寫一個“特殊”的查詢構造器 - (五、聚合函數、分組、排序、分頁)

寫一個“特殊”的查詢構造器 - (六、關聯)

寫一個“特殊”的查詢構造器 - (七、DML 語句、事務)

寫一個“特殊”的查詢構造器 - (八、單元測試、收尾工作)

更新

此項目已經從 WorkerA 中拆分為獨立項目,完整代碼請到 wazsmwazsm/DB 中查看。

前言

對于后端程序員來說,數據庫操作是必備知識,對數據的增刪查改也是業務中最普遍、頻繁的操作。

對于關系型數據庫,如 Mysql、Postgresql 等,我們可以使用 SQL (Structured Query Language) 來操作我們的數據,如 “SELECT * FROM test;” 這類的 SQL 語句,大部分的編程語言如 PHP、Python、go 等都提供了相應的數據庫擴展,可以方便的進行數據庫連接、執行 SQL 獲取結果。

但是,直接使用基礎的擴展效率并不高,每次都要創建連接、手動寫 SQL、對執行結果進行判斷、將查詢得到的數據進行處理等,代碼的重用性和維護性并不是很好,在多人開發的時候更是不能保證代碼質量。而在項目開發中,我們想要的是一個更好用的可維護的工具,此時,對代碼的封裝、模塊化就顯得尤為重要,于是出現了兩種方案:查詢構造器對象關系映射

查詢構造器 (query builder),顧名思義,它的目的就是以簡便的形式構造、執行 SQL,為查詢數據庫的業務提供了方便好用的接口,一些知名的 web 框架如 PHP 的 Laravel、CodeIgniter、ThinkPHP 等都提供了好用的查詢構造器。

對象關系映射 (ORM) 是一種更面向對象的數據模型化操作,將數據庫的數據映射成對象模型,數據庫的直接操作對開發者透明,開發者只需關注對象模型即可,更符合面向對象程序思維。同樣,很多框架也提供了 ORM 的方式去操作數據。

為什么要寫查詢構造器,我的需求是什么

寫這個查詢構造器的起因是 workerman,一個由 PHP 編寫的、可以常駐內存的 Socket 框架。

當時選用 workerman 去做一個 webAPI 的項目,針對 workerman 的環境編寫了一個簡單的 http 框架 WorkerA,一是沒有找到合適的 (在一個非典型 web 環境中,想要一個類似 laravel 那樣方便的查詢構造器),二是想要鍛煉自己,于是選擇了自己去寫這個查詢構造器。

如今該查詢構造器已經完工,完整代碼在我的框架核心代碼中: 查看

Q&A

Q:為什么選擇查詢構造器而不是 ORM

A:對于我自己的需求,我需要一個簡單好用又快速的工具,ORM 的性能和復雜性顯然不合適。


Q:該查詢構造器“特殊”在何處

A:區別于典型 web 的一次 HTTP 請求的代碼運行周期,這個查詢構造器除了可以使用在普通的 web 環境中,還支持常駐內存的環境,支持斷線重連 (這個很重要)


Q:為什么選 PHP

A:因為我自己用 PHP 開發最多,重要的是 workerman 是 PHP 編寫的。


Q:支持哪些數據庫

A:目前支持了 Mysql、Postgresql、Sqlite 這三個數據庫,而且全部通過了單元測試


Q:好的使用實踐?

A:我在 workerman 的環境中使用的是單例模式,每個進程一個數據庫連接單例模型。典型 web 環境下按照一般的查詢構造器處理就行。同樣常駐內存的情景可以自己寫鏈接池之類的功能,當然這和查詢構造器本身沒有關系,一切由你的需求來決定。

需求和技術的選擇 (想想自己想要什么)

底層驅動的選擇:

php 提供了 mysql 和 pgsql 這些常用數據庫的擴展,但是每個擴展暴露出的接口都不大一樣,封裝不便,pass

php 的 PDO 提供了多種數據庫的底層驅動,統一了訪問接口,prepare 方法可以有效的防止 SQL 注入,就選它

錯誤異常處理:

使用 PHP 的 try catch 機制,使用內置的異常和 PDO 的異常進行異常拋出

代碼結構的設計:

查詢構造器要支持多個數據庫,我們要把相同的部分 (查詢等) 封裝起來,將不同的部分 (不同數據庫的連接和設置) 獨立開來,那么只需創建一個基類 (封裝 PDO 的操作),每個數據庫多帶帶建立一個類繼承基類,將各自差異的部分重寫即可。

SQL 的構建:

sql 的構建屬于字符串的操作,構建 sql 即是構造字符串,PHP 有豐富的字符串處理函數

好用和性能的均衡考慮:

有些工具好用但是性能不一定好 (比如正則表達式),當然并不是說為了語言層面的極致性能而放棄一些便易性,查詢構造器的瓶頸一般在于連接數據庫的網絡消耗和數據庫對 SQL 的執行上。那么我們就以此作為平衡點,只要不比平衡點慢,我們可以選擇更方便開發的方式寫代碼。

測試:

選擇 phpunit 作為單元測試工具,以可測試為前提拆分代碼為最小單元,提升代碼的可維護性

總體思路

進行相關的需求分析和技術選擇后,我們得出了構建查詢構造器的大概的思路:

基于 PDO

通過字符串操作構建 SQL

將構造好的字符串交給 PDO 執行,獲取結果

以繼承、重寫的模式搭建代碼的架子

錯誤異常處理

編寫單元測試

理清思路,開始干活。

(本系列文章默認您已經掌握 PHP、PDO、SQL 的基礎知識)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28695.html

相關文章

  • 一個特殊查詢造器 - (三、條件查詢)

    摘要:構造條件如果單單是執行這樣的語句,使用原生擴展就好了,使用查詢構造器就是殺雞用牛刀。這一篇,我們來講講如何使用查詢構造器進行條件查詢。 構造 where 條件 如果單單是執行 SELECT * FROM test_table; 這樣的語句,使用原生擴展就好了,使用查詢構造器就是殺雞用牛刀。當然,在實際的業務需求中,大部分的 SQL 都沒這么簡單,有各種條件查詢、分組、排序、連表等操作,...

    why_rookie 評論0 收藏0
  • PHP 開發者如何做代碼審查?

    摘要:我們做代碼審計之前選好工具也是十分必要的。一審計工具介紹代碼審計系統功能介紹是一款基于開發的針對代碼安全審計的軟件。自定義審計規則。黑盒敏感信息泄露一鍵審計。挖掘這種漏洞主要是檢查是否使用了,搜索和。 GitChat 作者:湯青松原文:PHP 開發者如何做代碼審查?關注微信公眾號:「GitChat 技術雜談」 一本正經的講技術 【不要錯過文末彩蛋】 前言 工欲善其事,必先利其器。我們做...

    Achilles 評論0 收藏0
  • 一個特殊查詢造器 - (八、單元測試、收尾工作)

    摘要:單元測試的好處是給開發人員的,并不是給機器的。對于查詢構造器這個項目,我們可以讓其在遠程運行環境安裝相關數據庫軟件,執行數據表建立,數據導入,執行單元測試等操作。查詢構造器的完整代碼查詢構造器的單元測試完整代碼。 debug 模式 對查詢構造器進行調試并不難,從其構造 SQL -> 數據綁定 -> SQL 執行的過程中就能發現,要方便調試,只要可以觀察以下信息: 構造的 SQL 綁定...

    Steve_Wang_ 評論0 收藏0
  • 一個特殊查詢造器 - (六、關聯)

    摘要:雖然現在這樣的情況已經很少,但是對于查詢構造器而言,還是要提供一個方便的方法來對表前綴進行設置,特別是當你沒有權限修改表名的時候。所以我們將表前綴作為一個配置參數傳入查詢構造器,在查詢構造器的底層進行自動前綴添加。 關聯查詢是關系型數據庫典型的查詢語句,根據兩個或多個表中的列之間的關系,從這些表中查詢數據。在 SQL 標準中使用 JOIN 和 ON 關鍵字來實現關聯查詢。 Join 子...

    rainyang 評論0 收藏0
  • 一個特殊查詢造器 - (五、聚合函數、分組、排序、分頁)

    摘要:聚合函數在中,有一些用來統計匯總的函數,被稱作聚合函數,如等。方法其它方法如之類的編寫就不一一展示了,代碼請看聚合函數。如何獲取總數當然是使用上面講到的聚合函數來處理。 where 相關的子句構造完成后,我們繼續構造其它子句。這一篇我們進行聚合函數、分組、排序等子句的構造。 聚合函數 在 SQL 中,有一些用來統計、匯總的函數,被稱作聚合函數,如 SUM、COUNT、AVG 等。 使用...

    iamyoung001 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<