上文以SqlHelper为例说明了面向对象中封装的好处,但是上文只是简单封装,考虑下面代码的情况:

  1. public static Activate GetByCode(string code)
  2. {
  3. List<SqlParameter> paraList = new List<SqlParameter>();
  4. paraList.Add(new SqlParameter("@activateCode", code));
  5. using (SqlDataReader reader = SqlHelper.ExecuteReader(Configuration.ConnectionString, CommandType.StoredProcedure, "GetActivateByCode", paraList.ToArray()))
  6. {
  7. while (reader.Read())
  8. {
  9. Activate result = new Activate();
  10. result.Id = Utility.GetDbValue(reader, "Id", -);
  11. result.CollegeId = Utility.GetDbValue(reader, "CollegeId", -);
  12. result.ActivateCode = Utility.GetDbValue(reader, "ActivateCode", "");
  13. result.Activated = Utility.GetDbValue(reader, "Activated", false);
  14. result.StudentId = Utility.GetDbValue(reader, "StudentId", "");
  15. result.StudyCenter = Utility.GetDbValue(reader, "StudyCenter", "");
  16. result.StudentContact = Utility.GetDbValue(reader, "StudentContact", "");
  17. result.Major = Utility.GetDbValue(reader, "Major", "");
  18. result.Grade = Utility.GetDbValue(reader, "Grade", "");
  19. result.CreatedTime = Utility.GetDbValue(reader, "CreatedTime", new DateTime(,,));
  20. result.Disabled = Utility.GetDbValue(reader, "Disable", false);
  21.  
  22. return result;
  23. }
  24. }
  25.  
  26. return null;
  27. }

  如果这个查询语句要返回很多值的情况下,我们还要对查询结构进行一一匹配,map到定义好的数据结构<Activate>。我们希望对这个SqlHelper进行更高层次的封装,使他的返回结果自动map,像下面这样:

  1. public static ACTIVATE GetByStudentId(string studentId)
  2. {
  3. IDbConnection connection = null;
  4. try
  5. {
  6. connection = DAOHelper.GetConnection();
  7. connection.Open();
  8.  
  9. //Query方法不仅执行了查询,并把返回的数据自动map成了ACTIVATE类型的数据,
  10. //即数据库内的Id对应ACTIVATE的Id,数据库内的CollegeId对应ACTIVATE的CollegeId
  11. //这个方法支持泛型的返回结果匹配
  12. var list = connection.Query<ACTIVATE>(@"GetActivateByCode",studentId,CommandType.StoredProcedure)
  13.  
  14. if (list != null && list.Count > )
  15. return list[];
  16.  
  17. }
  18. catch (Exception ex)
  19. {
  20. Trace.Write(ex);
  21. return null;
  22. }
  23. finally
  24. {
  25. connection.Close();
  26. }
  27. return null;
  28. }

  像上面代码这样,这是对ADO.NET更为抽象的封装,他操作数据库的方式更加简单便捷,并支持返回结果的自动map。(这种技术称之为ORM

  值得注意的是,虽然越抽象的封装越方便易用,但也越不灵活,想想看如果以上代码中ACTIVATE的字段变掉怎么应对?所以,凡事都有利弊的两面,到底需要多大程度的封装,还要看我们项目的需求。

以SqlHelper为例论面向对象中封装的使用(续)的更多相关文章

  1. 以SqlHelper为例论面向对象中封装的使用

    引言: 在使用面向对象方法编写的程序中,会有一些工具类,如Utility,xxHelper等. 比如1)操作数据库的过程,一般步骤都是:1.准备数据库地址.表名等信息:2.建立连接:3.准备要执行sq ...

  2. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  3. C++中对C的扩展学习新增内容———面向对象(封装)

    面向对象(封装) 1.对封装的理解: 1.封装就是把变量和函数放在一起统一表示某一个食物. class 2.给类内部的成员增加访问控制权限. 3.封装的语法就是class定义一个类. 2.给对象成员增 ...

  4. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  5. 黑马程序员_Java面向对象1_封装

    3.面向对象_封装 3.1面向对象概念 3.1.1理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为(执行者) 面向对象:将功能封装进对象,强调具备了 ...

  6. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  7. python 面向对象之封装与类与对象

    封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...

  8. python面向对象编程 -- 封装、继承

    面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...

  9. python之路----面向对象中的内置函数

    property属性 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法 ...

随机推荐

  1. <转>c++引用与指针的区别(着重理解)

     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...

  2. MySQL常用增删改查等操作语句

    修改数据库的字符集    mysql>use mydb    mysql>alter database mydb character set utf8;创建数据库指定数据库的字符集    ...

  3. POJ2431-Expedition【优先队列+贪心】

    题目大意:卡车每走一公里就消耗一单位的汽油,初始时给你p单位油,你要到达l距离的终点.其中路上有n个补给点可以加油,并且油箱容量无限大,问你最少可以停车几次. 思路:因为油箱无限大,所以我们可以这么认 ...

  4. autoware安装

    1.Autoware的地址为https://github.com/CPFL/Autoware2.Install dependencies for Ubuntu 16.04 kinetic安装教程ins ...

  5. 解决HTML select控件 设置属性 disabled 后无法向后台传值的方法

    大家都知道有时候修改数据的时候我们希望有一些数据是不可以修改的,通常情况下我们会将input框设置为 readonly , 但是 select 控件没有这个属性,需要使用另一个属性 disabled ...

  6. vue 对图片进行拖拽到另一个位置

    1.拖动元素代码: 使用html5原生拖拽属性,在需要拖拽的图片中添加draggable="true"属性,并使用v-on添加拖动事件 2.被放置的区域事件代码: 使用html5原 ...

  7. AtCoder ABC 070D - Transit Tree Path

    传送门:http://abc070.contest.atcoder.jp/tasks/abc070_d 本题是一个图论问题——树(Tree). 有一棵结点数目为n的无向树.第i条边连接结点ai与bi, ...

  8. spring-cloud-feign 使用@RequetParam报错QueryMap parameter must be a Map: class java.lang.String

    这里使用spring-cloud-start-feign: 1.2.2 REALEASE版本,依赖管理器版本是 Camden.SR2 出错的原因是@RequestParam的value为empty时, ...

  9. ntp服务及时间同步问题

    今有一小型项目,全然自主弄,原来以为非常easy的NTP服务.我给折腾了2个多小时才整撑头(曾经都是运维搞,没太注意,所以这技术的东西.在简单都须要亲尝啊).这里记录为以后别再浪费时间. 目标环境,5 ...

  10. 自己主动化的在程序中显示SVN版本号

    有时候会有这种情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用相应的是那个代码版本号. 为了解决问题.我们希望能在应用上显示出当前应用所相应的代码版本号,即svn版本号. 构想 ...