各种查询生成器

时间:2012-09-04 14:45:28

标签: oop design-patterns activerecord

我正在创建一个框架MVC来构建我的应用程序。在我的应用程序中,我需要使用几个DBMS,我需要为此做好准备。

我正在考虑使用Active Record模式,它有"连接" (摘要)相关联。 Active Record不知道要使用哪个DBMS。因此,我使用Factory Method来获取使用了DBMS的摘要。

我将如何构建各种查询(CRUD)?因为每个DBMS都需要特定的查询。

我认为创建各种类" QueryBuilder"它可以解决(每个DBMS一个类)。

有什么想法?

2 个答案:

答案 0 :(得分:0)

要解决此问题,您可以使用DAO图层模式。此模式隐藏了客户端的数据库特定详细信息。您可以定义DAO将实现的CRUD操作的接口。

通过这种方式,即使您的数据库将来发生变化,DAO层的客户端也不必担心这些变化。

有关此模式的更多详细信息,请参阅以下维基页面。

http://en.wikipedia.org/wiki/Data_access_object

答案 1 :(得分:0)

我假设目的是将各种ActiveRecord对象与DB之间的SQL语法差异隔离开来?

您没有使用查询计划器的设计定义您的确切意图,但我使用AddSelection(colName)AddCriteria(colName, ComparisonEnum, value)等方法完成了一次。如果这是您的方法,那么您的查询很小/很简单,然后查询构建器可以工作。但是只要您需要构建复杂连接或内部子查询的能力,那么您可能会遇到这种方法。

如果您需要处理任意困难的查询,那么另一个选择是创建转换器或转换器。如果要定义规范查询格式,则每个DBMS特定的转换将知道如何从该规范格式转换为特定于DB的语法。你真的需要这个功能才能让它值得付出努力。

最后,您的另一个appraoch是为每个DB子类化ActiveRecord。因此,如果您有EmployeeRecord类,则可以使用OracleEmployeeRecord,MySqlEmployeeRecord,MsSqlServerEmployeeRecord等对其进行子类化。然后使用抽象工厂创建适当的ActiveRecord对象。