Coldfusion 管理跨整个网站使用的数据库查询
随着应用程序的发展,我注意到我正在跨多个网页重用大量数据库查询 目前,我使用的是一个.CFM文件,它有许多Coldfusion 管理跨整个网站使用的数据库查询,coldfusion,coldfusion-10,cfquery,cfstoredproc,Coldfusion,Coldfusion 10,Cfquery,Cfstoredproc,随着应用程序的发展,我注意到我正在跨多个网页重用大量数据库查询 目前,我使用的是一个.CFM文件,它有许多标记,包含在每个需要数据库数据的页面上。我所做的只是将这些存储过程执行包装在一个标记中,该标记测试调用页的名称,然后执行相应的代码块 我在任何方面都不是专家,但我觉得这不对。我只是不知道如何正确管理所有数据库查询,以便在整个网站的任何CFM页面上共享它们。例如,一个页面可能需要“GetUsers”存储过程,而另一个页面可能需要“GetOrders” 我正要着手创建一个CFC,它将每个单独的或
标记,包含在每个需要数据库数据的页面上。我所做的只是将这些存储过程执行包装在一个
标记中,该标记测试调用页的名称,然后执行相应的
代码块
我在任何方面都不是专家,但我觉得这不对。我只是不知道如何正确管理所有数据库查询,以便在整个网站的任何CFM页面上共享它们。例如,一个页面可能需要“GetUsers”存储过程,而另一个页面可能需要“GetOrders”
我正要着手创建一个CFC,它将每个单独的
或
保存在自己的方法/功能中。例如:
<cfcomponent name="DBQueries" hint="Everything for DB retrieval">
<cffunction name="GetUsers" returntype="query">
<cfstoredproc procedure="GetUsers">
<cfprocresult name="rsUsers">
</cfstoredproc>
<cfreturn rsUsers>
</cffunction>
.....
<cffunction name="DBQuery100">
<cfstoredproc procedure="GetSomething" returntype="query">
<cfprocresult name="rsSomething">
</cfstoredproc>
<cfreturn rsSomething>
</cffunction>
</cfcomponent>
.....
然后在main.CFM页面上,我将调用返回数据所需的组件和方法。这是实现数据库查询管理的一种好方法吗?与数据库相关的事实与代码重复的事实没有那么重要。在努力提高代码的可重用性方面,您走在了正确的轨道上 如果你把你的查询放到CFC中,你可能会考虑把这一步做得更远。使用Application.cfc的onApplicationStart方法创建一个应用程序变量,该变量可供所有页面上的所有用户使用,而不是一直调用它 另一种方法是将所有这些数据库标记放入.cfm文件中,并在Application.cfc的onRequestStart方法中放入cfinclude
两种方法都有效。而且,当您比较两件事时,几乎总是这样,每件事都比另一件事有优势。与数据库相关的事实与代码重复的事实没有那么相关。在努力提高代码的可重用性方面,您走在了正确的轨道上 如果你把你的查询放到CFC中,你可能会考虑把这一步做得更远。使用Application.cfc的onApplicationStart方法创建一个应用程序变量,该变量可供所有页面上的所有用户使用,而不是一直调用它 另一种方法是将所有这些数据库标记放入.cfm文件中,并在Application.cfc的onRequestStart方法中放入cfinclude
两种方法都有效。而且,当你比较两件事时,几乎总是这样,每件事都比另一件事有优势。考虑以下两个db表 使用者 用户标识主密钥 名字 姓氏 安全 SecurityID主密钥 用户ID外键 许可 所有数据库表都有创建、读取、更新和删除操作(CRUD) 积垢作业可能存在于多个地方
标记的内部*.cfc
s)比表少得多
好的,现在你有了user.cfc
你用它做什么?它可以以各种不同的方式连接到应用程序的其余部分
- application.User=新用户()李>
- session.User=新用户()李>
- request.User=新用户()李>
<cfcomponent>
<cfset this.userid = ""><!--- This always points to the user I want to interact with --->
<cffunction name="create"></cffunction>
<cffunction name="read"></cffunction>
<cffunction name="update"></cffunction>
<cffunction name="delete"></cffunction>
</cfcomponent>
您的CRUD操作很可能会在其所有操作中与相同的UserID
交互。您可能会发现,更新记录后,您将经常阅读它。您可能只想设置一次,让所有函数只使用同一个函数,而不是总是说明您正在与哪个UserID
进行交互
好的,现在让我们回到您将使用它们的地方
应用程序用户
整个系统中只存在一个用户
对象。它将在请求到达站点时创建。每个请求都将共享此对象。如果将user
对象附加到此处,则表明所有请求都将关注同一用户
会话。用户
对于外部世界中的给定最终用户,将存在一个User
对象。它将与所有其他最终用户分开。这意味着每个最终用户都将关注自己的用户
,即使他们在网站上点击,他们仍然会关注相同的用户
请求。用户
每个请求将存在一个用户
对象。它将只存在于特定的请求中,然后被丢弃。这表明在这个请求中查看特定的用户
是有意义的,但下一步可能会有很大的不同,甚至可能与用户无关
~~~~~~~~~~~~~~~
在一天结束时,您需要决定如何捆绑您的DB交互,以及将这些捆绑的操作保持在一起多长时间 使用者 用户标识主密钥 名字 姓氏 安全 SecurityID主密钥 用户ID外键 许可 所有数据库表都有创建、读取、更新和删除操作(CRUD) 积垢作业可能存在于多个地方
标记的内部*.cfc
s)
<cfcomponent>
<cffunction name="create"></cffunction>
<cffunction name="read" hint="Read will also read security info"></cffunction>
<cffunction name="update" hint="Perhaps this can update security too"></cffunction>
<cffunction name="delete" hint="Delete will also delete security info"></cffunction>
<cffunction name="create_security"></cffunction>
<cffunction name="read_secrity" hint="This may not even be needed"></cffunction>
<cffunction name="update_security"></cffunction>
<cffunction name="delete_security" hint="This may not even be needed"></cffunction>
</cfcomponent>
<cfcomponent>
<cfset this.userid = ""><!--- This always points to the user I want to interact with --->
<cffunction name="create"></cffunction>
<cffunction name="read"></cffunction>
<cffunction name="update"></cffunction>
<cffunction name="delete"></cffunction>
</cfcomponent>
<cfset users = new model.Users().getUsers() />
users = new model.Users().getUsers();