【牛腩新闻发布系统】DAL & BLL
2016-05-13 17:34
246 查看
引言:牛腩新闻发布系统对我们有很多技术上的知识可以学习,同时,在很多方面对我们也有指导意义。在这里,总结一下DAL和BLL搭建过程中的心得。
1.添加引用和using的区别?
引用是一个程序集对另一个程序集的引用,表示可以使用另一个程序集;using是我们引用的某个程序集,作用就是可以方便的使用这个程序集,而不必写全称。
所以,在编写程序的时候,通常是先添加引用,然后可以用using。另外,把引用设置成自动更新比较好。
2.DAL中的构造函数
构造函数用来创建对象时初始化对象,我们建立一个类,它是一个抽象的概念。通过构造函数使之成为具体的对象,分配给其具体的内存空间。(下面是具体的示例)
3.Sqlhelper的不断优化
Sqlhelper用来简化我们重复写那些数据库连接,SqlCommand,SqlDataReader等。它封装好之后就是只需给方法传入参数就可以对数据库进行具体的操作。所以,它是一个我们提高代码的复用性,大大提高了我们效率的工具。(下面是具体的代码)
GetConn方法也是把其它代码中的重复部分抽取出来,提高了代码的复用性。
整个代码分为两大块,执行查询和执行增删改,其中具体再分为有参和无参各两种,这里是通过重载来实现的。
4.CommandBehavior.CloseConnection的作用
Sq保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。如果我们用try-catch-finally语句的话,最后在返回sqldatareader和关闭连接的时候会有所问题,而这个方法就可以很好的解决这个问题。
5.Web.config
Web.config文件是一个XML文本文件,它用来储存ASP.NETWeb 应用程序的配置信息。在这里我们使用Web.config来实现对数据库的连接。具体就是将用户账号密码写到这个配置文件中去。这样在具体的部署中就可以灵活的配置,而不必要对源码进行修改。从某种程度上说,这也是一种反射技术的应用,反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。这里,连接字符串的改变,使程序可以动态的适应。
6.参数化查询 VS 拼接字符串查询
拼接字符串查询可能会造成SQL注入攻击,因为拼接字符串会被程序视为SQL语句的一部分,而一些不怀好意的利用注释等手段,就会修改这个SQL语句,从而对系统造成破坏。
参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,程序已经将SQL语句编译完成,这个只是一个具体的参数,所以这个方法是一种有效可预防SQL注入攻击的攻击手法的防御方式。
BLL层主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。
在这个项目中我们将要实现的业务一一在BLL层封装成类,共Web层调用,是一个很好的三层架构。
由于这个项目中的BLL层并没有太多的逻辑判断,相对于我们之前的机房收费系统来说是比较简单,都是对DAL层调用,所以开始感觉没有那么重要,有些多余。
但是在后期的分析总结中,发现其作用性还是很大的。因为整个架构的意义一直存在,不能仅从目前的情况下定论。对于后期的维护拓展来说,还是很有重要意义的。因为软件维护要占整个软件生命周期的大部分比例,其中完善性维护要占到维护工作的60%左右,这个就是在扩充功能和改善性能。如果没有前期的整个架构,后期的工作是很难开展。
本次项目开发,DAL层和BLL层和是较为容易的,因为和之前的知识联系很多,Web层的开发是一个新的领域,需要不断学习。从中发现旧的知识还是需要不断完善扩充,每一个小小的技术都是我们不断提升的空间。而那些新的领域也是在我们现有的这个知识底座下不断成长起来的。所以,在时间的维度下,学习是一个知识积累的过程。
当然还有方法上的反思,在这个过程中,如何在简单重复的内容前面不会觉得烦,在第一次接触较难的内容面前不会想逃避,有方法上的问题,也有心态上的问题。所以,不断调整自己的心态和方法,才会有更加高效的学习。具体就是:去做,去反思,去优化。
一、DAL
1.添加引用和using的区别?
引用是一个程序集对另一个程序集的引用,表示可以使用另一个程序集;using是我们引用的某个程序集,作用就是可以方便的使用这个程序集,而不必写全称。
所以,在编写程序的时候,通常是先添加引用,然后可以用using。另外,把引用设置成自动更新比较好。
2.DAL中的构造函数
构造函数用来创建对象时初始化对象,我们建立一个类,它是一个抽象的概念。通过构造函数使之成为具体的对象,分配给其具体的内存空间。(下面是具体的示例)
public class CategoryDAO { private SQLHelper sqlhelper = null; public CategoryDAO() { sqlhelper = new SQLHelper(); } }
3.Sqlhelper的不断优化
Sqlhelper用来简化我们重复写那些数据库连接,SqlCommand,SqlDataReader等。它封装好之后就是只需给方法传入参数就可以对数据库进行具体的操作。所以,它是一个我们提高代码的复用性,大大提高了我们效率的工具。(下面是具体的代码)
public class SQLHelper { private SqlConnection conn = null; private SqlCommand cmd = null; private SqlDataReader sdr = null; public SQLHelper() { string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; conn = new SqlConnection(connStr); } private SqlConnection GetConn() { if (conn.State == ConnectionState.Closed) { conn.Open(); } return conn; } /// <summary> /// 执行无参数的增删改SQL语句或存储过程 /// </summary> /// <param name="cmdText">增删改SQL语句或存储过程</param> /// <param name="ct">命令类型</param> /// <returns></returns> public int ExecuteNonQuery(string cmdText, CommandType ct) { int res; try { cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } return res; } /// <summary> /// 执行带参数的增删改SQL语句或存储过程 /// </summary> /// <param name="cmdText">增删改SQL语句或存储过程</param> /// <param name="paras">参数集合</param> /// <param name="ct">命令类型</param> /// <returns></returns> public int ExecuteNonQuery(string cmdText,SqlParameter[]paras,CommandType ct ) { int res; using (cmd=new SqlCommand (cmdText ,GetConn ())) { cmd.CommandType =ct; cmd.Parameters .AddRange (paras); res=cmd.ExecuteNonQuery (); } return res; } /// <summary> /// 执行无参数的查询SQL语句或存储过程 /// </summary> /// <param name="cmdText">查询SQL语句或存储过程</param> /// <param name="ct">命令类型</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText, CommandType ct) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText ,GetConn ()); cmd.CommandType = ct; using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; } /// <summary> /// 执行带参数的查询SQL语句或存储过程 /// </summary> /// <param name="cmdText">查询SQL语句或存储过程</param> /// <param name="paras">参数集合</param> /// <param name="ct">命令类型</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText,SqlParameter [] paras,CommandType ct) { DataTable dt=new DataTable (); cmd=new SqlCommand (cmdText ,GetConn ()); //paras = new SqlParameter[] {new SqlParameter("@caid", "1")}; cmd.Parameters.AddRange(paras); using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; } }当然其中也有构造函数,具体好处不再赘述。
GetConn方法也是把其它代码中的重复部分抽取出来,提高了代码的复用性。
整个代码分为两大块,执行查询和执行增删改,其中具体再分为有参和无参各两种,这里是通过重载来实现的。
4.CommandBehavior.CloseConnection的作用
Sq保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。如果我们用try-catch-finally语句的话,最后在返回sqldatareader和关闭连接的时候会有所问题,而这个方法就可以很好的解决这个问题。
5.Web.config
Web.config文件是一个XML文本文件,它用来储存ASP.NETWeb 应用程序的配置信息。在这里我们使用Web.config来实现对数据库的连接。具体就是将用户账号密码写到这个配置文件中去。这样在具体的部署中就可以灵活的配置,而不必要对源码进行修改。从某种程度上说,这也是一种反射技术的应用,反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。这里,连接字符串的改变,使程序可以动态的适应。
6.参数化查询 VS 拼接字符串查询
拼接字符串查询可能会造成SQL注入攻击,因为拼接字符串会被程序视为SQL语句的一部分,而一些不怀好意的利用注释等手段,就会修改这个SQL语句,从而对系统造成破坏。
参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,程序已经将SQL语句编译完成,这个只是一个具体的参数,所以这个方法是一种有效可预防SQL注入攻击的攻击手法的防御方式。
二、BLL
BLL层主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。
在这个项目中我们将要实现的业务一一在BLL层封装成类,共Web层调用,是一个很好的三层架构。
由于这个项目中的BLL层并没有太多的逻辑判断,相对于我们之前的机房收费系统来说是比较简单,都是对DAL层调用,所以开始感觉没有那么重要,有些多余。
但是在后期的分析总结中,发现其作用性还是很大的。因为整个架构的意义一直存在,不能仅从目前的情况下定论。对于后期的维护拓展来说,还是很有重要意义的。因为软件维护要占整个软件生命周期的大部分比例,其中完善性维护要占到维护工作的60%左右,这个就是在扩充功能和改善性能。如果没有前期的整个架构,后期的工作是很难开展。
三、总结
本次项目开发,DAL层和BLL层和是较为容易的,因为和之前的知识联系很多,Web层的开发是一个新的领域,需要不断学习。从中发现旧的知识还是需要不断完善扩充,每一个小小的技术都是我们不断提升的空间。而那些新的领域也是在我们现有的这个知识底座下不断成长起来的。所以,在时间的维度下,学习是一个知识积累的过程。
当然还有方法上的反思,在这个过程中,如何在简单重复的内容前面不会觉得烦,在第一次接触较难的内容面前不会想逃避,有方法上的问题,也有心态上的问题。所以,不断调整自己的心态和方法,才会有更加高效的学习。具体就是:去做,去反思,去优化。
相关文章推荐
- android国际化(多语言)
- 再战 SSH -- 一步一配置
- Programming Clojure笔记之九——snake游戏源码解析
- HDU--2031进制转换
- Python常见问题(4):Python库与扩展 Library and Extension FAQ
- erlang 常用数据结构
- 算法12 之希尔排序
- CSS——(CSS样式规则,CSS样式表单,选择器,常用的CSS属性)
- Zabbix 添加主机,获取模板templateID
- spark history server内存不足服务自动挂掉
- 数据仓库中的 SQL 性能优化(Hive篇)
- 移动端H5页面之iphone6的适配
- Flash游戏开发实例①打砖块-3-部署砖块(2)
- 【C++】:C++的境界1
- iOS应用程序间共享数据
- 极大似然估计和贝叶斯估计
- Python常见问题(3):设计与历史 Design and History FAQ
- 开源框架Pushlet入门
- 算法11 之基础排序
- #学习笔记#(62)处理时间及时间格式的js代码片段