摘要:而在項目開發(fā)中,我們想要的是一個更好用的可維護的工具,此時,對代碼的封裝模塊化就顯得尤為重要,于是出現(xiàn)了兩種方案查詢構(gòu)造器,對象關(guān)系映射。典型環(huán)境下按照一般的查詢構(gòu)造器處理就行。
文章目錄
寫一個“特殊”的查詢構(gòu)造器 - (前言)
寫一個“特殊”的查詢構(gòu)造器 - (一、程序結(jié)構(gòu),基礎(chǔ)封裝)
寫一個“特殊”的查詢構(gòu)造器 - (二、第一條語句)
寫一個“特殊”的查詢構(gòu)造器 - (三、條件查詢)
寫一個“特殊”的查詢構(gòu)造器 - (四、條件查詢:復(fù)雜條件)
寫一個“特殊”的查詢構(gòu)造器 - (五、聚合函數(shù)、分組、排序、分頁)
寫一個“特殊”的查詢構(gòu)造器 - (六、關(guān)聯(lián))
寫一個“特殊”的查詢構(gòu)造器 - (七、DML 語句、事務(wù))
寫一個“特殊”的查詢構(gòu)造器 - (八、單元測試、收尾工作)
更新此項目已經(jīng)從 WorkerA 中拆分為獨立項目,完整代碼請到 wazsmwazsm/DB 中查看。
前言對于后端程序員來說,數(shù)據(jù)庫操作是必備知識,對數(shù)據(jù)的增刪查改也是業(yè)務(wù)中最普遍、頻繁的操作。
對于關(guān)系型數(shù)據(jù)庫,如 Mysql、Postgresql 等,我們可以使用 SQL (Structured Query Language) 來操作我們的數(shù)據(jù),如 “SELECT * FROM test;” 這類的 SQL 語句,大部分的編程語言如 PHP、Python、go 等都提供了相應(yīng)的數(shù)據(jù)庫擴展,可以方便的進行數(shù)據(jù)庫連接、執(zhí)行 SQL 獲取結(jié)果。
但是,直接使用基礎(chǔ)的擴展效率并不高,每次都要創(chuàng)建連接、手動寫 SQL、對執(zhí)行結(jié)果進行判斷、將查詢得到的數(shù)據(jù)進行處理等,代碼的重用性和維護性并不是很好,在多人開發(fā)的時候更是不能保證代碼質(zhì)量。而在項目開發(fā)中,我們想要的是一個更好用的可維護的工具,此時,對代碼的封裝、模塊化就顯得尤為重要,于是出現(xiàn)了兩種方案:查詢構(gòu)造器,對象關(guān)系映射。
查詢構(gòu)造器 (query builder),顧名思義,它的目的就是以簡便的形式構(gòu)造、執(zhí)行 SQL,為查詢數(shù)據(jù)庫的業(yè)務(wù)提供了方便好用的接口,一些知名的 web 框架如 PHP 的 Laravel、CodeIgniter、ThinkPHP 等都提供了好用的查詢構(gòu)造器。
對象關(guān)系映射 (ORM) 是一種更面向?qū)ο蟮臄?shù)據(jù)模型化操作,將數(shù)據(jù)庫的數(shù)據(jù)映射成對象模型,數(shù)據(jù)庫的直接操作對開發(fā)者透明,開發(fā)者只需關(guān)注對象模型即可,更符合面向?qū)ο蟪绦蛩季S。同樣,很多框架也提供了 ORM 的方式去操作數(shù)據(jù)。
為什么要寫查詢構(gòu)造器,我的需求是什么寫這個查詢構(gòu)造器的起因是 workerman,一個由 PHP 編寫的、可以常駐內(nèi)存的 Socket 框架。
當(dāng)時選用 workerman 去做一個 webAPI 的項目,針對 workerman 的環(huán)境編寫了一個簡單的 http 框架 WorkerA,一是沒有找到合適的 (在一個非典型 web 環(huán)境中,想要一個類似 laravel 那樣方便的查詢構(gòu)造器),二是想要鍛煉自己,于是選擇了自己去寫這個查詢構(gòu)造器。
如今該查詢構(gòu)造器已經(jīng)完工,完整代碼在我的框架核心代碼中: 查看
Q&AQ:為什么選擇查詢構(gòu)造器而不是 ORM
A:對于我自己的需求,我需要一個簡單好用又快速的工具,ORM 的性能和復(fù)雜性顯然不合適。
Q:該查詢構(gòu)造器“特殊”在何處
A:區(qū)別于典型 web 的一次 HTTP 請求的代碼運行周期,這個查詢構(gòu)造器除了可以使用在普通的 web 環(huán)境中,還支持常駐內(nèi)存的環(huán)境,支持斷線重連 (這個很重要)
Q:為什么選 PHP
A:因為我自己用 PHP 開發(fā)最多,重要的是 workerman 是 PHP 編寫的。
Q:支持哪些數(shù)據(jù)庫
A:目前支持了 Mysql、Postgresql、Sqlite 這三個數(shù)據(jù)庫,而且全部通過了單元測試
Q:好的使用實踐?
A:我在 workerman 的環(huán)境中使用的是單例模式,每個進程一個數(shù)據(jù)庫連接單例模型。典型 web 環(huán)境下按照一般的查詢構(gòu)造器處理就行。同樣常駐內(nèi)存的情景可以自己寫鏈接池之類的功能,當(dāng)然這和查詢構(gòu)造器本身沒有關(guān)系,一切由你的需求來決定。
需求和技術(shù)的選擇 (想想自己想要什么)底層驅(qū)動的選擇:
php 提供了 mysql 和 pgsql 這些常用數(shù)據(jù)庫的擴展,但是每個擴展暴露出的接口都不大一樣,封裝不便,pass
php 的 PDO 提供了多種數(shù)據(jù)庫的底層驅(qū)動,統(tǒng)一了訪問接口,prepare 方法可以有效的防止 SQL 注入,就選它
錯誤異常處理:
使用 PHP 的 try catch 機制,使用內(nèi)置的異常和 PDO 的異常進行異常拋出
代碼結(jié)構(gòu)的設(shè)計:
查詢構(gòu)造器要支持多個數(shù)據(jù)庫,我們要把相同的部分 (查詢等) 封裝起來,將不同的部分 (不同數(shù)據(jù)庫的連接和設(shè)置) 獨立開來,那么只需創(chuàng)建一個基類 (封裝 PDO 的操作),每個數(shù)據(jù)庫多帶帶建立一個類繼承基類,將各自差異的部分重寫即可。
SQL 的構(gòu)建:
sql 的構(gòu)建屬于字符串的操作,構(gòu)建 sql 即是構(gòu)造字符串,PHP 有豐富的字符串處理函數(shù)
好用和性能的均衡考慮:
有些工具好用但是性能不一定好 (比如正則表達式),當(dāng)然并不是說為了語言層面的極致性能而放棄一些便易性,查詢構(gòu)造器的瓶頸一般在于連接數(shù)據(jù)庫的網(wǎng)絡(luò)消耗和數(shù)據(jù)庫對 SQL 的執(zhí)行上。那么我們就以此作為平衡點,只要不比平衡點慢,我們可以選擇更方便開發(fā)的方式寫代碼。
測試:
選擇 phpunit 作為單元測試工具,以可測試為前提拆分代碼為最小單元,提升代碼的可維護性
總體思路進行相關(guān)的需求分析和技術(shù)選擇后,我們得出了構(gòu)建查詢構(gòu)造器的大概的思路:
基于 PDO
通過字符串操作構(gòu)建 SQL
將構(gòu)造好的字符串交給 PDO 執(zhí)行,獲取結(jié)果
以繼承、重寫的模式搭建代碼的架子
錯誤異常處理
編寫單元測試
理清思路,開始干活。
(本系列文章默認您已經(jīng)掌握 PHP、PDO、SQL 的基礎(chǔ)知識)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28695.html
摘要:構(gòu)造條件如果單單是執(zhí)行這樣的語句,使用原生擴展就好了,使用查詢構(gòu)造器就是殺雞用牛刀。這一篇,我們來講講如何使用查詢構(gòu)造器進行條件查詢。 構(gòu)造 where 條件 如果單單是執(zhí)行 SELECT * FROM test_table; 這樣的語句,使用原生擴展就好了,使用查詢構(gòu)造器就是殺雞用牛刀。當(dāng)然,在實際的業(yè)務(wù)需求中,大部分的 SQL 都沒這么簡單,有各種條件查詢、分組、排序、連表等操作,...
摘要:我們做代碼審計之前選好工具也是十分必要的。一審計工具介紹代碼審計系統(tǒng)功能介紹是一款基于開發(fā)的針對代碼安全審計的軟件。自定義審計規(guī)則。黑盒敏感信息泄露一鍵審計。挖掘這種漏洞主要是檢查是否使用了,搜索和。 GitChat 作者:湯青松原文:PHP 開發(fā)者如何做代碼審查?關(guān)注微信公眾號:「GitChat 技術(shù)雜談」 一本正經(jīng)的講技術(shù) 【不要錯過文末彩蛋】 前言 工欲善其事,必先利其器。我們做...
摘要:單元測試的好處是給開發(fā)人員的,并不是給機器的。對于查詢構(gòu)造器這個項目,我們可以讓其在遠程運行環(huán)境安裝相關(guān)數(shù)據(jù)庫軟件,執(zhí)行數(shù)據(jù)表建立,數(shù)據(jù)導(dǎo)入,執(zhí)行單元測試等操作。查詢構(gòu)造器的完整代碼查詢構(gòu)造器的單元測試完整代碼。 debug 模式 對查詢構(gòu)造器進行調(diào)試并不難,從其構(gòu)造 SQL -> 數(shù)據(jù)綁定 -> SQL 執(zhí)行的過程中就能發(fā)現(xiàn),要方便調(diào)試,只要可以觀察以下信息: 構(gòu)造的 SQL 綁定...
摘要:雖然現(xiàn)在這樣的情況已經(jīng)很少,但是對于查詢構(gòu)造器而言,還是要提供一個方便的方法來對表前綴進行設(shè)置,特別是當(dāng)你沒有權(quán)限修改表名的時候。所以我們將表前綴作為一個配置參數(shù)傳入查詢構(gòu)造器,在查詢構(gòu)造器的底層進行自動前綴添加。 關(guān)聯(lián)查詢是關(guān)系型數(shù)據(jù)庫典型的查詢語句,根據(jù)兩個或多個表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)。在 SQL 標準中使用 JOIN 和 ON 關(guān)鍵字來實現(xiàn)關(guān)聯(lián)查詢。 Join 子...
摘要:聚合函數(shù)在中,有一些用來統(tǒng)計匯總的函數(shù),被稱作聚合函數(shù),如等。方法其它方法如之類的編寫就不一一展示了,代碼請看聚合函數(shù)。如何獲取總數(shù)當(dāng)然是使用上面講到的聚合函數(shù)來處理。 where 相關(guān)的子句構(gòu)造完成后,我們繼續(xù)構(gòu)造其它子句。這一篇我們進行聚合函數(shù)、分組、排序等子句的構(gòu)造。 聚合函數(shù) 在 SQL 中,有一些用來統(tǒng)計、匯總的函數(shù),被稱作聚合函數(shù),如 SUM、COUNT、AVG 等。 使用...
閱讀 2702·2023-04-25 14:59
閱讀 889·2021-11-22 11:59
閱讀 635·2021-11-17 09:33
閱讀 2468·2021-09-27 13:34
閱讀 3898·2021-09-09 11:55
閱讀 2321·2019-08-30 15:44
閱讀 1123·2019-08-30 14:06
閱讀 1925·2019-08-29 16:55