什么是ORM?就是对象关系映射(Object Relational Mapping,简称ORM)模式,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的一种技术。
我们在开发项目的时候,是不是总要建立实体类(Modlue Class)?例如下面是一张区域表:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
那么,我们在项目中一般都建立个对应的类:
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class AreaData
{
#region 字段变量
private int _areaid; // 区域ID
private int _areaidx; // 区域IDx 为0 表示顶级,否则为子级
private string _areaname = string.Empty; // 区域名称 同一级别下不允许相同
private string _remark = string.Empty; // 备注
#endregion
#region 字段属性
/// <summary>
/// 区域ID
/// </summary>
public int AreaID
{
set { _areaid = value; }
get { return _areaid; }
}
/// <summary>
/// 区域IDx 为0 表示顶级,否则为子级
/// </summary>
public int AreaIDx
{
set { _areaidx = value; }
get { return _areaidx; }
}
/// <summary>
/// 区域名称 同一级别下不允许相同
/// </summary>
public string AreaName
{
set { _areaname = value; }
get { return _areaname; }
}
/// <summary>
/// 备注
/// </summary>
public string Remark
{
set { _remark = value; }
get { return _remark; }
}
#endregion
}
现在的应用系统,一般由展示层、业务逻辑层、数据访问层、数据库层等组成,各层次功能划分非常清晰。但是在编写业务逻辑层(BLL) 程序员必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。相当于软件程序员兼职数据库DBA。一般都有以下几步:
1、建立数据库连接,获得 Connection 对象。
2、组装SQL语句或者用存储过程。
3、用commoand对象执行 SQL语句,获得结果集对象。
5、然后读取结果集对象中的数据。
6、根据读取到的数据,按特定的业务逻辑进行计算。
7、根据计算得到的结果再组装更新 SQL 语句(或者使用存储过程)。
8、再使用command对象执行更新 SQL 语句(或者使用存储过程),以更新数据库中的数据。
7、最后释放对象。
这样的话,业务逻辑和数据逻辑就是聚合在一起,万一有需求更改代码,对于负责的逻辑处理,那么将是很头大的事情。关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。简单地说,以上贴的代码其实是业务实体的不同显示形式(一个是在关系数据库中,一个是在我们程序运行的内存中),那么,一个类一般不可能是孤零零的一个类,它会和周围的其他类存在关联或者继承被继承的关系,那么用这种面向对象的思想(封装、耦合、聚合)去看待关系数据库中关系数据,就不够看了,很难在数据库中变现关系数据之间的这种关系。那么ORM就是中间组件,起桥梁作用,实现程序对象到关系数据库之间的映射。程序员只要关注业务逻辑而不需要关注数据逻辑,调用对象的get 和 set ,完全面向对象编程。
ORM? O (object)对象 –> R(relational)关系 = M(mapper)映射。既然是orm,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段,那么一个持久化类就和一个表对应 ,所有的泪就组合成一个持久层。持久层的概念,我摘录了一段:
1. 什么是持久层?
狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。
● 保存:把域对象永久保存到数据库。
● 更新:更新数据库中域对象的状态。
● 删除:从数据库中删除一个域对象。
● 加载:根据特定的OID,把一个域对象从数据库加载到内存。
● 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。
2.为什么要持久化?
持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。
● 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
● 代码重用性高,能够完成大部分数据库操作;
● 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
ORM 和 存储过程?
在上一段,在BLL层 有 业务逻辑和数据逻辑之分,但是,我们也可以把所有的逻辑都在数据库上用存储过程表现,而BLL层只是调用SP,其实也没有什么不好,ORM 志在降低耦合度,减少对数据库的依赖,使开发聚集在对象化周围,不用过多关注持久化这些对象。而使用SP(存储过程),更多的是围绕数据库来,程序要过多的依赖数据库的实现,如果业务对象重构或者改变,改动就相当的大了,一个面向对象,一个面向过程,看具体情况,智者见智,仁者见仁!