最近看园子里 @李林峰的园子 关于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. windows平台,WEB开发,喜欢IE + notepad的同行进来可以看。

    用多个浏览器查看自己的page( 平台是notepad) 借助window的批处理,以及系统环境变量. 首先,  写个bat, 一句start %1 %2即可. %1和%2分别表示第一个和第二个参数. ...

  2. VB.Net 2010中 ./和../的含义

    文件路径 文件路径就是文件在电脑(服务器)中的位置,表示文件路径的方式有两种:相对路径和绝对路径. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作 ...

  3. 文件过滤驱动框架Minispy解析一

    因工作需要,研究minispy文件过滤框架,上图为我整理出的其内核部分代码的逻辑.

  4. tomcat报错java.lang.IllegalArgumentException: Document base XXXXX does not exist or is not a readable directory

    启动tomcat的时候报如下错误: java.lang.IllegalArgumentException: Document base F:\java\tools\tomcat\me-webapps\ ...

  5. Unity学习疑问记录之 动作动画忽略timeScale

    http://www.bubuko.com/infodetail-968864.html

  6. .NET中那些所谓的新语法之四:标准查询运算符与LINQ

    开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运算符是定义在System.Linq.Enumerable类中的50 ...

  7. AngularJS2 + ASP.NET MVC项目

    环境:VS2015, NodeJS:v 6.5, npm: v3.10, AngularJs 2 通过将ASP.NET MVC项目与Angualr 2官网上的quick start整合的过程中遇到些问 ...

  8. Html5 设置菱形链接菜单

    本例是采用html5+css3.0设置的菜单链接.其中主要用到了以下几个方面: 1. CSS3.0中的2D变换,如:旋转transform:rotate(45deg);移动,放大transform:r ...

  9. jsp的 javascript中 嵌套 html 注释

    看到公司的代码,我也是蛋疼了,各种乱. 还发现有很多的jsp的 javascript中 嵌套 html 注释, 这个可行? 我之前可是没用过. 后面查找各种资料发现,这个也是可行的,主要是为了兼容不支 ...

  10. ASP.NET MVC Routing学习笔记(一)

    Routing在ASP.NET MVC中是非常核心的技术,属于ASP.NET MVC几大核心技术之一,在使用Routing之前,得先引入System.Web.Routing,但其实不用这么麻烦,因为在 ...