最近看园子里 @李林峰的园子 关于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. ant的安装及项目的发布

    1.安装ant1) 直接解压apache-ant-1.9.7-bin 2) 在环境变量中配置,ant_home的环境变量在 3) 在命令提示符中测试是否安装成功. 2 项目首次打包1) 写好打包的配置 ...

  2. 使用C#和Excel进行报表开发(三)-生成统计图(Chart)

    有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印.在国内的环境下,相对PDF方式,Excel的安装率应该比pdf阅读器的安装率要高,同时,微软 ...

  3. Weblogic反序列化漏洞补丁更新解决方案

    Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...

  4. cron表达式

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...

  5. GIT的认识

    说实话,在听到小伙伴们都说赶紧做作业的时候很茫然,连一点头绪都没有,根本不知道从何入手,但不能因为不会就不去做,于是还是拿起手机,找到小伙伴商量着做着,虽然等的过程很焦急,但还是注册成功了.而开始写对 ...

  6. EQueue性能测试计划

    1.发送消息吞吐量的测试: 1)单台producer单个进程的发送消息tps2)单台producer多个进程的发送消息tps3)单台broker的接收消息tps,由于单台producer可能压不满,所 ...

  7. 探索c#之递归APS和CPS

    接上篇探索c#之尾递归编译器优化 累加器传递模式(APS) CPS函数 CPS变换 CPS尾递归 总结 累加器传递模式(Accumulator passing style) 尾递归优化在于使堆栈可以不 ...

  8. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  9. 东哥读书小记 之 《MacTalk人生元编程》

         一直以来的自我感觉:自己是个记性偏弱的人.反正从小读书就喜欢做笔记(可自己的字写得巨丑无比,尼玛不科学呀),抄书这事儿真的就常发生俺的身上. 因为那时经常要背诵课文之类,反正为了怕自己忘记, ...

  10. react native 入门实践

    上周末开始接触react native,版本为0.37,边学边看写了个demo,语法使用es6/7和jsx.准备分享一下这个过程.之前没有native开发和react的使用经验,不对之处烦请指出.希望 ...