Lge的数据库操作

Lge的数据库组件是框架的核心组件之一,该数据库组件的特点有:

1、底层基于PDO扩展,支持所有主流的数据库管理系统,并通过MySQL、PostgreSQL、Oracle、SQLServer及SQLite的测试使用;

2、数据库底层天然支持主从读写分离,只需通过配置文件简单配置项即可支持对主从数据库集群的操作;

3、数据库单例对象管理,在同一请求处理进程中,多次数据库操作只会保留同一份数据库链接;

4、数据库底层统一采用SQL预处理操作,防止SQL注入,增强数据库安全性;

5、方便灵活的CURD操作方法,单表封装对象;

6、支持数据库超时重连机制及数据表前缀;

一、数据库的配置

1、通用数据库配置

配置项 default 表示默认的数据库配置。

 2、主从集群数据库配置

通过应用层实现最小成本的数据库负载均衡访问,配置项中的 priority 参数可指定数据库的使用优先级,配置项名称 master_slave 是示例名称,可自定义。

二、数据库操作API

数据库的API有很多,包括配置API以及操作API,具体请查看底层数据库封装类数据表封装类(Model)

三、数据表封装类操作(Model)

使用以下方法即可获取一个表的model类对象:

数据库封装类对象的常用操作方法如下:

三、数据表封装类操作示例

1、添加数据

insert方法有多个参数,例如可以决定是否返回自增ID,是否执行检查更新等。

默认返回值将会返回写入的自增ID值,如果没有自增ID那么将会返回空字符串,写入失败返回false。

批量添加数据:

2、修改数据

或者

或者

3、删除数据

或者

或者

 4、保存数据

保存操作是insert操作的一个封装,主要的逻辑是当需要写入的数据中存在主键或者唯一索引的时候则更新相对应的记录,否则写入一条新纪录。

保存数据也支持批量操作:

 5、查询数据

查询操作是项目中使用得比较频繁的操作,查询数据总共有四个封装方法:

1)、getAll 用于查询记录列表(数组),默认索引值从0开始,列表中的每一项是数据表中的一条记录,并且可以在最后一个参数中指定通过某个字段构造成关联数组返回;
2)、getOne 用于查询单条记录,返回记录的关联数组;
3)、getValue 用于查询一个字段,返回的是对应的字段值;
4)、getCount 用于查询符合条件的记录总数,一般用于分页;

以下以 getAll 方法为例展示查询数据的方式:

 更完整的查询示例如下:

这个查询基本演示了所有的查询参数:

(1)、查询可指定返回的结果集字段;

(2)、使用了预处理语句(由于查询条件是通过客户端传递的,所以通过预处理能提高SQL执行的安全性);

(3)、展示了无法使用预处理的 inlike 操作,因此只能使用字符串作为输入;

(4)、分页操作使用$start和$limit进行控制,如果$limit不传递或者传递为0(默认为0),那么获取全部结果集返回;

(5)、通过最后一个字段指定关联数组的键名字段,这里返回的结果中,索引将不在从0开始,而是以用户uid作为索引的关联数组;

6、联表查询

数据表封装类操作也支持联表操作,示例如下:

 7、预处理查询

上面我们演示了基本的预处理操作,在查询条件中使用占位符?表示条件参数,并在数组的第二个参数开始按照顺序写入传递的参数值。这种预处理查询条件是比较常见的方式,当然Lge也支持带名称的预处理,例如:

这种带名称的预处理参数传递和预处理参数的传入顺序便没有任何关系,只需要预处理参数的名称对应即可。

8、关于查询条件

查询条件($condition参数)支持多种方式,在上面的示例代码中也展示了,这里总结一下:

1)、(不推荐) 查询支持直接使用字符串的形式,这种情况下字符串条件容易产生SQL拼接的情况,如果查询条件包含客户端提交的参数且对提交参数处理不严谨的时候,存在一定的安全隐患,但从灵活性折衷考虑,保留了这一查询形式;

2)、(推荐) 查询支持两种预处理传递查询条件的形式,一种是使用占位符?,一种是使用预处理参数名称占位,但无论使用哪种形式,预处理查询都将比直接使用字符串更加安全;

3)、in 和 like 查询不支持预处理,因此这两种查询只能使用字符串参数形式,这个时候请严格处理用于查询的参数值(转义处理,addslashes);

四、底层数据库封装类操作

由于Model类的存在,底层数据库封装类很少会直接使用到,除非是一些非常复杂的SQL操作,或者事务处理,这个时候我们可以直接通过db对象来进行操作。

因此,我们首先需要获取一个db对象:

参数是我们的数据库配置项名称,默认为default。

获取到db对象之后,我们便可以执行原始的SQL语句,如下:

或者也可以使用db对象的数据查询封装方法:

另外很重要的一点是,有了db对象我们可以在db连接的数据库上使用事务操作:

五、其他

1、全局表前缀

通过Model类操作数据库的话支持全局表前缀处理,在配置文件中的 prefix_ 字段处配置好表前缀,在访问的时候可以直接忽略表前缀使用下划线开头的表名来进行操作。

例如:

lge_user 表可以直接通过lge_user完整表名进行访问,也可以通过 _user 缩略表名进行访问;

lge_user_address 表可以直接通过lge_user_address完整表名访问,也可以通过 _user_address 缩略表名进行访问;

 

2、查看已执行的SQL语句

在请求流程末尾查看当前请求流程中执行的所有SQL语句以及执行时间,可以这样来查看:

打印出的结果示例如下:

 其中打印出的SQL中带有?符号的表示是预处理语句,其参数在params字段中。 

 

 

 

 

 

Leave a Reply

Your email address will not be published.