最近看园子里 @李林峰的园子 关于ORM的介绍,真的很好。自己看了也有一点点小心的,记录一下。

ORM即为一种数据模型和数据库中关系映射的一种方式。

学过“三层架构”,知道怎么把表 示层(UI)-->业务逻辑层(BLL)-->数据操作层(DAL)分离开。如下

//
//表现层
//
protected void submitadd_Click(object sender, EventArgs e)
{
Model.User user = new Model.User(); user.uid = this.txt_uid.Text.Trim();
user.uname = this.txt_uname.Text.Trim();
user.pwd = this.pwd.Text.Trim();
user.registerDate = DateTime.Now;
user.ugender = Int32.Parse(this.ddl_gender.SelectedValue);
user.signature = this.signature.Text.Trim();
user.headPic = _imgName.Value; bool result = ulc.InsertNewUser(user);
if (result)
{
this.finishedTips.Visible = true;
this.finishedTips.Text = "添加成功";
}
else
{
this.finishedTips.Visible = true;
this.finishedTips.Text = "添加失败";
}
} //
//逻辑层
//
public class UserBusinessOpation
{
/// <summary>
/// 更新一条记录
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public bool UpdateUser(User user)
{
string sql = "update User_T set uname='" + user.uname + "',pwd='" + user.pwd + "',ugender=" + user.ugender + ",registerDate='" + user.registerDate + "',signature='" + user.signature + "',headPic='" + user.headPic + "' where uid='"+user.uid+"'";
return db.ExecuteInsertOrUpdateSql(sql);
}
/// <summary>
/// 获取某个用户的详细信息
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public DataTable GetUserDetail(string uid)
{
string sql = "select * from User_T where uid='" + uid + "'";
return db.GetTable(sql);
} /// <summary>
/// 删除某个用户
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public bool DeleteUser(string uid)
{
string sql = "delete from User_T where uid='"+uid+"'";
return db.ExecuteInsertOrUpdateSql(sql);
}
} //
//数据访问层
//
pubilc clas DB
{
private static string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["SqlServerConn"].ToString(); /*****************************************************************************/
//直接使用sql语句,适用于无参数的调用
#region 执行SQL语句,返回一个DataTable对象
/// <summary>
/// 返回一个DataTable对象
/// </summary>
/// <param name="strSql">需要执行 的SQL语句</param>
/// <returns>DataTable对象</returns>
public DataTable GetTable(string strSql)
{
SqlConnection conn = new SqlConnection(ConnString);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
DataTable dt = new System.Data.DataTable();
try
{
da.Fill(dt);
return dt;
}
catch (Exception e)
{
throw new Exception("执行任务失败:" + e.Message + " " + strSql);
}
finally
{
conn.Close();
}
}
#endregion
#region 执行添加,修改,删除的时候进行验证的方法
/// <summary>
/// 执行添加的时候进行验证的方法,返回结果的sql更新语句
/// </summary>
/// <param name="strSql">需要执行的sql语句</param>
/// 返回一个boolean型的值
public Boolean ExecuteInsertOrUpdateSql(string strSql)
{
SqlConnection conn = new SqlConnection(ConnString);
conn.Open();
SqlCommand cmd = new SqlCommand(strSql, conn);
try
{
int count = cmd.ExecuteNonQuery();
if (count > )
{
return true;
}
else
{
return false;
}
}
catch (Exception e)
{
throw new Exception("执行任务失败:" + e.Message + " " + strSql); }
finally
{
conn.Close();
cmd.Dispose();
}
}
#endregion
}

当我第一次遇到这样的“三层代码”模式的时候,我觉得简直酷爆了。整个业务逻辑层被划分的 很清晰。想要什么样的业务逻辑,只需要在业务逻辑层定义数据模型和对模型需要的操作就行。数据访问层的代码完全不用改动。

但是,慢慢我发现,当整个系统的业务比较多的时候,往往在业务逻辑层要写很多的类似的代码。诸如,增删改查,把一个数据模型Model参数传进去之后,对数据模型的进行增删改查极为类似,除了传进去的数据模型Model不一样而已。所以,在多业务时,整个项目的工作量就集中在【重复】业务逻辑层的哪些增删改查的业务。

在阅读了 @李林峰的园子 关于ORM的讲解之后,可以把关注于模型和数据的映射关系,大大滴减少重复的代码工作量。

其中 @李林峰的园子 中使用的ORM使我们可以像如下来写代码。

//
//用户表现层
//
public void AddMyTest()
{
News news = new News();
news.newsContent = "习大大发表新年贺词~";
news.newsValue = 200;
NewsORM.add(news);
} //
//业务逻辑层
//
public class NewsORM
{
...
public static void add(Model.News news)
{
ORM.add(news);
}
...
} //
//数据访问层
//
public class ORM
{
/// <summary>
/// 添加一个实体
/// </summary>
/// <param name="classObject"></param>
/// <returns></returns>
public static bool Add(object classObject, string AssemblyName, string ConnString)
{
int intMaxID = 0, intFlag = 0;
return Add(classObject, out intMaxID, intFlag, AssemblyName, ConnString);
} /// <summary>
/// 添加一个实体并且返回其ID标识
/// </summary>
/// <param name="classObject"></param>
/// <param name="intMaxID"></param>
/// <returns></returns>
public static bool Add(object classObject, out int intMaxID, string AssemblyName, string ConnString)
{
intMaxID = 0;
int intFlag = 1;
return Add(classObject, out intMaxID, intFlag, AssemblyName, ConnString);
} /// <summary>
/// 添加实体并判断是否返回最大的编号
/// </summary>
/// <param name="classObject"></param>
/// <param name="intMaxID"></param>
/// <param name="intFlag">当intFlag=0时,则不去取intMaxID,等于1则相反</param>
/// <returns></returns>
private static bool Add(object classObject, out int intMaxID, int intFlag, string AssemblyName, string ConnString)
{
//声名输出参数
intMaxID = 0; //获取表名称
string strTableName = Mapping.GetTableName(classObject, AssemblyName);
//获取主键字典
Dictionary<string, string> IdentityMapping = Mapping.GetIdentityMapping(classObject, AssemblyName);
//获取除主键以外的字段字典
Dictionary<string, string> BaseFieldMapping = Mapping.GetBaseFieldMapping(classObject, AssemblyName);
//获取 "属性--值" 字典
Dictionary<string, string> FieldValueMapping = Model.GetValueMapping(classObject, BaseFieldMapping); //创建SQL语句
string strSQL = SQL.CreateInsert(classObject, strTableName, IdentityMapping, BaseFieldMapping, FieldValueMapping, intFlag); //执行SQL
return SQL.ExecInsert(strSQL, out intMaxID, intFlag, ConnString);
}
}

其中,Mapping类是根据模型的类名来获取到其映射的数据库中的映射对应关系。其中每个模型类以及每个模型类的映射关系都需要用户来定义。

如下:

namespace HZYT.Model
{
//模型类
public class News
{
public int newsID { set; get; }
public string newsContent { set; get; }
public int newsValue { set; get; }
}
} namespace HZYT.Model
{
//映射类
public class NewsMapping
{
public static string GetTableName()
{
return "News_T";
}
public static Dictionary<string,string> GetIdentityMapping()
{
Dictionary<string, string> Identity = new Dictionary<string, string>();
Identity.Add("newID", "id");
return Identity;
}
public static Dictionary<string,string> GetBaseFieldMapping()
{
Dictionary<string, string> BaseField = new Dictionary<string, string>();
BaseField.Add("newsContent", "content");
BaseField.Add("newsValue", "value");
return BaseField;
}
}
}

改进后的效果显而易见,我们彻底摆脱了书写那些业务逻辑层的 重复性的 增删改查操作,而这些操作都被ORM抽象地去实现(具体实现肯定要根据 那些映射关系)。而现在我们在写逻辑业务的时候,只需要定义业务逻辑层的数据模型以及其与数据库中的字段映射关系即可。ORM通过反射实现了从业务逻辑层到具体的数据库sql语句的转化,以及到最后的sql语句的执行。

最后 po上我自己画的一个图,图可能不准确,大致反应 了ORM结构图。

ORM小结的更多相关文章

  1. orm 小结

     1. 销售注册,登录系统  - 用户表  2.销售添加客户信息,成为销售的私户  - 客户表    3. 销售固定时间跟进客户  - 跟进记录表 4. 客户报名  - 报名记录表  - 班级表(必须 ...

  2. 关于Django ORM filter方法小结

    django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...

  3. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  4. ORM查询语言(OQL)简介--高级篇(续):庐山真貌

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  5. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

    [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志"    2 1,PDF.NET诞生历程    2 2,Linq2 ...

  6. WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务

    在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主要说明在.NET的环境下,如何使用 WCF Data Se ...

  7. IbatisNet开发使用小结

    一.   介绍 平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题.所以很多人会使用一些ORM框架来增强项目的可维护性.可扩展性.IBatis.Net就是一个比较易用的ORM ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(28)-系统小结

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(28)-系统小结 我们从第一节搭建框架开始直到二十七节,权限管理已经告一段落,相信很多有跟上来的园友,已经 ...

  9. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

随机推荐

  1. 仿JQ基础架构,可扩展。

    (function(win,doc,fn){     var events = [];//拷贝核心方法    var publicEvent = ["extend","f ...

  2. Zend Studio XDebug调试配置

    最近在配置zend studio时找了些资料,发现了这个,说的比较详细 搭建Zend Studio 10.5 和XDebug 环境,试图进行 Drupal的调试, 经历了一些困难,但是最终解决了问题, ...

  3. poj1200-Crazy Search(hash入门经典)

    Hash:一般是一个整数.就是说通过某种算法,可以把一个字符串"压缩" 成一个整数.一,题意: 给出两个数n,nc,并给出一个由nc种字符组成的字符串.求这个字符串中长度为n的不同 ...

  4. CSS 基础语法

    注:CSS对大小写不敏感,但是如果涉及到与HTML文档一起工作的时候,class和id名称对大小写是敏感的 一.color color:#ff0000; color:#f00; //缩写 color: ...

  5. 微软开源.NET Core的执行引擎CoreCLR{转载}

    继去年12月宣布.NET Core开源之后,微软拥抱开源的决心又向前迈了一步,Microsoft于昨日在 .NET Framework Blog上 宣布开源.NET Core 的执行引擎 CoreCL ...

  6. [Voice communications] 看得到的音频流

    上文介绍了 Web Audio API 的相关知识,以及如何在你的 web 程序中引入 音频流,内容都是介绍性的,所以没有写太多 DEMO.本文重点讲解如何利用 Web Audio API 中的中间节 ...

  7. Qcon会议之所见所想

    作为普通码农一枚,Qcon是俺参与过的最高级的技术大会了.大会共历时三天,因为俺第二天就得赶火车休个五一大长假,所以只参加了第一天4/25号的会议(其他俩天自然有其他同事会去观摩),不过第一天的会议有 ...

  8. xamarin uwp数字证书公钥私钥

    对于数字证书存储导入到电脑中,采用如下方式: /// <summary> /// 导入证书 /// </summary> /// <param name="ra ...

  9. react + iscroll5 实现完美 下拉刷新,上拉加载

    经过几天的反复折腾,总算做出一个体验还不错的列表页了,主要支持了下拉刷新,上拉加载两个功能. 一开始直接采用了react-iscroll插件,它是基于iscroll插件开发的组件.但是开发过程中,发现 ...

  10. Enterprise Solution 虚拟测试环境

    在不联网的情况下,一台物理电脑安装数据库服务,VMware创建多个虚拟机,虚拟机中多个客户端并发连接到物理主机.可共用同一个物理主机的数据库,也可以测试多用户并发等问题. 1  安装微软虚拟网卡.在控 ...