文章目录写一个“特殊”的查询构造器-(前言)写一个“特殊”的查询构造器-(1.程序结构,基本封装)写一个“特殊”的查询builder-(2.第一条语句)Writea"special"querybuilder-(3.Conditionalquery)Writea"special"querybuilder-(4.Conditionalquery:Complicatedconditions)writea"special"queryconstructor-(五,聚合函数,分组,排序,分页)写一个“特殊”查询构造器-(六、关联)写一个“特殊”查询构造器-(7.DML语句,事务)写一个“特殊”查询构造器-(8.单元测试,收尾工作)更新此项目已从WorkerA拆分为一个独立的项目。请检查wazsmwazsm/DB中的完整代码。前言对于后端程序员来说,数据库操作是必备的知识,而数据的增删改查也是业务中最常见、最频繁的操作。对于关系型数据库,比如Mysql、Postgresql等,我们可以使用SQL(结构化查询语言)来操作我们的数据,比如“SELECT*FROMtest;”SQL语句,大多数编程语言如PHP、Python、Go等都提供了相应的数据库扩展,可以方便的连接数据库,执行SQL获取结果。但是直接使用基础的扩展效率并不高。每次都需要创建连接、手动编写SQL、判断执行结果、处理查询得到的数据等,代码的复用性和可维护性都不是很好。多人开发,代码质量无法保证。在项目开发中,我们想要的是一个更加易用和可维护的工具。这时候代码的封装和模块化就显得尤为重要,所以有两种解决方案:查询构造器、对象-关系映射。查询生成器(querybuilder),顾名思义,其目的是以简单的形式构造和执行SQL,为查询数据库服务提供方便易用的接口。一些著名的Web框架,如PHP的Laravel、CodeIgniter、ThinkPHP等,都提供了有用的查询构建器。对象关系映射(ORM)是一种更加面向对象的数据建模操作,它将数据库数据映射到对象模型中。直接操作数据库对开发者是透明的。开发者只需关注对象模型,更符合面向对象的过程化思想。同样,很多框架也提供了ORM方法来操作数据。为什么要编写查询构建器,我需要什么?编写这个查询生成器的原因是workerman,一个用PHP编写的可以常驻内存的Socket框架。当时选择了workerman做一个webAPI项目,针对workerman的环境写了一个简单的http框架WorkerA。一是没有找到合适的(在非典型的web环境下,想要像laravel这样方便的querybuilder),二是想锻炼自己,所以选择了自己写这个queryconstructor。现在querybuilder已经完成,完整的代码在我框架的核心代码中:查看Q&AQ:为什么选择querybuilder而不是ORMA:针对我自己的需求,我需要一个简单易用快速的工具用ORM的性能和复杂度显然是不合适的。问:这个查询构建器“特殊”在哪里?A:不同于典型web中一个HTTP请求的代码运行周期,这个querybuilder不仅可以在普通的web环境中使用,还支持常驻内存环境。断线重连(这个很重要)Q:为什么选择PHPA:因为我用PHP开发最多,重要的是workerman是PHP写的。问:支持哪些数据库?A:目前支持三种数据库:Mysql、Postgresql、Sqlite,并且都通过了单元测试。问:良好的使用习惯?答:我在workerman环境中使用单例模型,每个进程有一个数据库连接单例模型。在典型的Web环境中,只需遵循通用查询构建器即可。同样驻留内存的情况下,可以自己写连接池等功能。当然,这与查询构建器本身无关,一切都取决于您的需要。需求和技术的选择(想好自己想要什么)底层驱动的选择:PHP提供了对mysql、pgsql等常用数据库的扩展,但是每个扩展暴露的接口都不一样,打包不方便。Passphp的PDO提供了统一的各种数据库底层驱动,统一的访问接口。prepare方法可以有效的防止SQL注入,所以选择它Error异常处理:使用PHP的trycatch机制,使用内置异常和PDO异常抛出异常代码结构设计:querybuilder需要支持多数据库。我们需要封装相同的部分(查询等),将不同的部分(不同数据库的连接和设置)分开,所以我们只需要创建一个基类(封装PDO操作),每个数据库创建一个单独的类继承基类类,并重写彼此不同的部分。SQL构造:sql的构造属于字符串的操作,sql的构造就是字符串的构造。PHP有丰富的字符串处理函数,简单易用又考虑了性能的平衡:有些工具好用但性能不一定好(比如正则表达式公式),当然不代表放弃一些方便在语言层面的终极表现。querybuilder的瓶颈一般在于连接数据库的网络消耗和数据库执行SQL。那么我们就以此为平衡点,只要不比平衡点慢,我们就可以选择更方便的方式来写代码。测试:选择phpunit作为单元测试工具,在可测试的前提下将代码拆分成最小的单元,提高代码的可维护性。总体思路在进行了相关的需求分析和技术选型之后,我们得出了一个构建查询构建器的大致思路思路:通过字符串操作,基于PDO构建SQL,将构建好的字符串交给PDO执行,并得到结果。以继承重写的方式搭建一架代码,处理错误异常,编写单元测试,理清思路,开始工作。(本系列文章假设您已经掌握了PHP、PDO、SQL的基础知识)
