首先,请大家先下载一份CMS。
使用DW、UE、记事本等编辑器打开/CMS/Gen/UserClass/Class_News.asp文件。
今天的讲座,讲围绕这个文件展开,请大家准备。
这里下载CMS
http://info.codepub.com/2007/03/info-11696.html
下载我开始讲讲什么是ORM
简单的理解,ORM就是对象和关系的映射,对ASP程序员来说,可以理解成 对象和关系数据库的映射。
比如Class_News.asp文件中的字段
id, NClassID, NL_NClass_NClassName, Title, NewsKey, ComeFrom, PostTime, Author, Assessor, Hits, Remark, IsPicNews, PicPath, IsTop, Content
这里的每一个字段,均对应着数据表NL_News中的一个字段,一一对应。这里的对应,就是简单的ORM。
我所要讲的ASP中的ORM,就是用ASP实现数据库到类对象的映射。文件Class_News.asp就是一个例子,这个文件只有一个类NewLife_Class_News,这个类的大部分功能,就是实现了把数据表中的数据读取到由该类声明的对象中,使得使用该类的业务代码,能够抛开数据库底层,直接实现OO编程。
ORM的概念,就讲到这里,大家可以自由提问。
休息十分钟,下一部分,讲NewLife_Class_News类是如何实现ORM的。
卫新建(305274486) 13:21:02
你的ORM文件 是自动生成的吗?
Class_News.asp是由Gen中的一个工具asp文件生成的,因为VBS类只能实现简单的功能,不能实现继承和多态等。
对ASP来说,类,就是一大堆变量、函数和方法的集合体
为了便于管理,把它们凑在一起的
下面要讲的是:如何在ASP中实现ORM
绝大部分人使用VBS来写ASP,众所周知,VBS所能实现的类,功能是非常有限的,简直就是一大堆变量、函数、方法的集合体。
也许正因为简单,才有这么多人支持ASP吧
下面我们就看看怎么在简单的ASP的类中,实现ORM
请大家打开CMS中的/CMS/Gen/UserClass/Class_News.asp
这里下载CMS:
http://info.codepub.com/2007/03/info-11696.html
我们先看看Class_News.asp中有什么
整个文件,就是一个NewLife_Class_News类
大家请看15到17行
| 以下是代码片段: Rem Public id, NClassID, NL_NClass_NClassName, Title, NewsKey, ComeFrom, PostTime, Author, Assessor, Hits, Remark, IsPicNews, PicPath, IsTop, Content Rem |
这里定义的每一个类全局变量,分别对应着数据库/CMS/Data/News.asa中的NL_News数据表的各个字段
这些全局变量的数据,对应数据表NL_News中的一行记录。
我们的ORM,要实现的功能有:添删改查 四大功能。
添加:在数据表NL_News中新增一条记录,把这些变量所保存的数据存入该记录对应的字段中。
删除:删除数据表中和这些变量对应的行。
修改:以id作为关键字,修改数据表NL_News中对应ID字段为id值的行,也就是保存关键字id以外所有变量的值到数据表中id所定位的行。
查询:从数据表中取出一个符合条件的记录行,并把各字段的数据赋值到同名的变量中;或者从数据表中取出符合条件的一批输出,进行模版运算后,直接输出。
TableName变量指明该类对应当数据表是NL_News
请大家看GetInfo方法。该方法实现了取一行记录到类的各字段变量的功能。
|
以下是代码片段: Public Sub GetInfo() If Con.DbType = DTOracle Then |
E.State = "取 文章"
E.开头的代码,都是为了方便调试用的,不影响程序功能,大家可以略过
在调用GetInfo前,需要先对该对象的id变量复制,GetInfo才能取到由id定位的记录到各变量中
If Con.DbType = DTOracle Then
这个判断是为了兼容Oracle数据库
CMS是同时支持AC、MSSQL、Oracle等多种数据库的
Set rs = Con.GetRs(sql,0)
这是调用 Gen 的连接类的GetRs方法来获取记录集,sql参数就不说了,参数0表示尽是取数据,而不用修改数据,下面的Edit中将会看到1
再下面的赋值,大家都懂,就不多说了
类中,使用Add实现把变量中的数据写入数据表,原理与上面的GetInfo差不多一致,只是数据的方向不同而已
id行被注释了,没有使用,因为这是数据库的自增字段
Edit实现了修改数据的功能,同样是由id来定位记录。
Del实现了删除数据的功能,也是由id来定位要删除的记录,特别的是,Del支持批量删除记录,使用的是in语法。
Con是NewLife_Class_Conn类的对象,DBType是它的一个属性(变量成员),位于文件/CMS/Gen/Class/Class_Conn.asp中
Main方法,是类中最复杂的一个方法,因为它实现了批量获取数据,同时还要支持分页(分页还要兼容AC、MSSQL、Oracle等多种数据库),已经模块循环替换等多种功能
ORM的实现,到这里就完成了,大家获取发现,类中,还有不少函数和方法,是的,它们是扩展功能,包括和表单的映射。
也就是说,这个类,不仅实现了对象到数据库的映射,还实现了对象到表单单元的映射,使用编辑功能的时候,能够把各变量的数据自动赋值到对应当表单单元中,保存表单的时候,能自动把表单单元的数据接收到对应的变量中,再调用一次Edit方法,对象变量中的数据就进入数据库了。添加也是这个原理。这样大大方便了开发。
GetFromRequest负责接收表单单元的数据到对应的变量中
F.R是GetFromRequest的封装,用于强类型处理,在底层上解决SQL注入以及别的非法输入的问题。
比如:id = F.R("id", fNumber)第二个参数指明,现在要接收到是数字类型数据,如果是别的数据,一概返回空,这样,SQL注入就没有什么机会了。对于字符串型SQL注入,有个专门的类型fForSQL,它会过滤所有的危害性字符。欣慰的是,Gen中,不会使用接收来的字符串构造SQL,所以,可以说,Gen对SQL注入是绝对安全的,当然,如果外部跨越UserClass中的类来操作数据,那就另当别论了。
好了,今天的讲座就到此结束,谢谢大家
欢迎继续读下一文章,Ajax讲座。
NewLife_Class_News类的实际使用,请看web/index.asp
