解析数据访问层操作数据库的方式
2011-11-08 18:10 javaspring 阅读(296) 评论(0) 编辑 收藏 举报在数据访问层对数据库进行操作的设计上,主要有这么几种:拼接字符串,带构造参数的基本Sql语句,存储过程,视图等。 因为这次做系统主要是为了促进我们学习,所以在本次机房收费系统中,我分别尝试了这几种方式。
举几个例子:
A、根据条件查询上下机记录时,采用带参数的Sql语句,以上下机记录表,学生信息表,上机卡信息表为基表进行联合查询。
B、在添加结账信息,查询充值记录和卡内余额等时采用的是带输入参数或输出参数的存储过程。在创建存储过程时,还尝试采用了控制语句和内置函数,尤其是添加结账信息时。
C、查询学生基本信息的时候,牵扯到了视图的方式,采用了拼接字符创的形式去查询由上机卡和学生信息表为基表建立的视图。
下面,根据我在采用这几种方式时的体会,比较他们各自的优缺点:
1、采用拼接字符串是肯定不可取的,虽然可以可以根据需要随时在客户端自定义Sql语句,但这样很危险,例如Sql语句注入漏洞问题。
2、采用构造函数基本Sql语句应对简单的查询还可以,也比较安全,如果是比较复杂的查询,会把人逼疯的(例如联合查询7,8张表)
举个例子:
这是我在查询上下机记录时用到的一段带参数的Sql语句,这里牵扯到三张表,采用内连接。
selectoor_CardID,stu_StuName,stu_Department,stu_Grade,oor_OnDate,oor_OnTime,oor_Computer
fromtb_OnOffRecord inner join tb_CardInfo
on oor_CardID=cif_CardID and oor_CardID=@CardID and cif_State=@CardState and oor_OffDate is null and oor_State=@CardState
inner jointb_StudentInfo on cif_StuID=stu_pk_StuID
因为数据库考虑到联合查询,所以字段前加了前缀,如果没有前缀,那么一些字段,例如CardID前还要加上表名,那就更复杂了。(这也体现了字段前缀的好处)
3、视图和基本sql语句的直接区别在于:sql语句多一道网络传输,而视图是直接执行数据库的视图。存储过程也是这样,存储过程为什么快也有这个原因,也就是说视图和存储过程只需要传输一个名称即可,而sql语句可能要传输大量的字符串,视图和存储过程显然会增加服务器数据库负担。
4、存储过程和视图的区别,主要体现在视图是可视化的联合查询,而存储过程不是,只不过视图更直观,而且你可以像查询表一样去查询视图,而不用考虑那些什么左连接右连接之类的语句。对于非常复杂的链接表来说(如果七八个表连在一起,还不是简单的单链),你写SQL语句会把大脑逼疯的,用视图就可以大大减轻工作难度。
用另一种方式来表达,视图和存储过程降低了应用程序和物理表的耦合。存储过程是字符串叙述的,而视图更加直观,要达到的效果有一定相似度。
采用哪种方法要看具体的程序应用场景了,显然直接拼接字符串是不可取的,如果考虑执行效率而不考虑服务器数据库压力,用视图和存储过程的办法返回DataTable很简单,如果项目比较小,客户端的资源随便用.可以直接使用构造参数的基本sql语句,牵扯到几张表时,在客户端获取数据后,从多个返回的DataTable中取出数据,用代码生成一个新DataTablee返回也不错。具体问题还要具体分析,把握平衡。