最近看园子里 @李林峰的园子 关于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. tomcat:域名指向项目名

    把项目部署到tomcat目录webapps后,使用域名访问的时候域名后面需要加上项目名称,如果想直接输入域名就可以访问项目呢?看了下tomcat官方文档,我修改了tomcat安装目录下conf/ser ...

  2. Unity3D UGUI之ScrollView弹簧效果

    unity3d版本5.3.2p4 UGUI中ScrollView包含Viewport(Content) ScrollView包含脚本.其Movement Type一共3个选项.Elastic就是弹簧效 ...

  3. 用微信小程序开发的Canvas绘制可配置的转盘抽奖

    使用https://github.com/givebest/GB-canvas-turntable代码移植过而来. 其它 微信小程序感觉是个半成品,代码移植过程比较繁琐麻烦.canvas API 部分 ...

  4. C#3.0扩展方法学习篇

     什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...

  5. Android课程---远程服务器存储

    在使用Volley进行获取数据时,需要事先准备环境:在libs里面导入一个Volley.jar包,在网上都有,可以下载下来导入,或者自己电脑上有DT的,自己合成一个包也行. WebActivity.j ...

  6. 注册GitHub和源程序版本管理软件和项目管理软件的优缺点

    目前市面上主要源程序管理软件主要有:Microsoft TFS(Team Foundation Server).GitHub.Trac.BUGZILLA.Apple XCode.SVN Microso ...

  7. 旺信UWP正式版发布

    下载链接:https://www.microsoft.com/store/apps/9nblggh5lq9x 各位园主好,在旺信Beta版发布后近两个月,我们的新版本1.1.0终于上线了,并且更名为旺 ...

  8. The Similarities and Differences Between C# and Java -- Part 1(译)

    原文地址 目录 介绍(Introduction) 相似点(Similarities) 编译单位(Compiled Units) 命名空间(Namespaces) 顶层成员(类型)(Top Level ...

  9. C#中Finally的一个不太常见的用法

    最近在看.net BCL 传送门 的源码. 在 System.Collections.Concurrent.ConcurrentQueue 中看到一段有意思的代码.注意这段代码是写在Concurren ...

  10. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...