最近看园子里 @李林峰的园子 关于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. 3D布局

    <!DOCTYPE html> <html> <head> <title>3D布局</title> <style type=" ...

  2. StreamingAssets文件夹在不同平台上的引用

    On a desktop computer (Mac OS or Windows) the location of the files can be obtained with the followi ...

  3. norm函数的作用,matlab

    格式:n=norm(A,p)功能:norm函数可计算几种不同类型的返回A中最大一列和,即max(sum(abs(A))) 2 返回A的最大奇异值,和n=norm(A)用法一样 inf 返回A中最大一行 ...

  4. 初试Office 365企业版E3

    Microsoft Office 365 团队给了所有现任的MVP 12个月的微软 Office 365 企业 E3 订阅,今天激活账号并试用了一下,发现非常强大,本文简要介绍下Office 365 ...

  5. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  6. Redhat环境下编译安装Google Bazel

    Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...

  7. MySQL 提高Insert性能

    插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开 ...

  8. “安装项目” Step By Step

    目录 一 基本操作 二 定制安装对话框 三 安装程序类 四 总结 .NET程序集因为包含了元数据,所以程序集具有自描述性.多数程序自身包含了运行所需要的全部信息,这类程序集就是我们常说的“绿色软件”. ...

  9. Visualize The Workshop

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 今天这篇文章是准备瞎扯的.平常工作的时候,我希望尽可能的将一切自动化,让自己尽可能的舒适与懒惰.两个输 ...

  10. 数据库基础,表及SQL语句

    数据库基础及T-SQL语句 字符类型: int 整型 float 小数 double 小数 varchar(20) 字符串 bit 布尔型数据 datetime 日期时间类型 text 长文本 (以下 ...