OracleORM查询语言(OQL)简介–概念篇

 相关文章内容搜索引:

ORM查询语言(OQL)简介–概念篇

ORM查询语言(OQL)简介–实例篇

ORM查询语言(OQL)简介–高级篇:脱胎换骨

ORM查询语言(OQL)简介–高级篇(续):庐山真貌

 

一、SQL与ORM

   关系数据库(RDBMS)的询问有SQL(Structured Query Language)结构化查询语言,相比高级程序语言(命令式语言)而言,SQL主要描述想使开呀,而休是命令式语言的现实性如何做,因此,SQL也受称之为第四代表语言(4GL),它吧当代大部分底关系数据库系统所支持。SQL的中心是对准“关系”的操作,数据库理论研究说明,SQL是涉达到全的,但是当代大部分高级语言都是面向对象的,高级语言程序一旦跟关系数据库进行互动,SQL就改成了必须的桥,由于SQL基于的“关系”和程序语言的“对象”是殊的体系,它们中如果就好好之相互,就得生一个“映射”过程,实现者历程的次,就是ORM(Object/Relation Mapping)。

  应用程序调用ORM的法门,ORM自动生成相应的SQL语句到数据库进行查询,然后ORM将接至之关系数据映射成实体对象。如果无采用ORM,那么普通应用程序会拆分有一个数量访问层(DAL)来生成SQL语句并推行相应的查询。所以,ORM出现后,在必水平上,它可以替代DAL,这让你丢了一个重合的工作量,对于增长工作效率是蛮重要之。

  下图是应用程序使用ORM和采取传统的DAL的一个示意图。

Oracle 1

 

 

(图1:两种多少访问架构)

 二、ORM带来的题材

 

 

  使用ORM后,再为未用失去形容那些枯燥的DAL代码了,不用拼接那些或在安全题材要么敲错字段名的SQL语句,但是咱发现,仅仅使用ORM它反而丧失了SQL的八面玲珑,这为是成百上千人拒绝用ORM的说辞。我们看众口之ORM是怎定义数据操作接口的,他们时将这些接口方法由实体类去实现,从而打造一个个充血的实业类:

public interface IEntity<T> where T:class
{
void Add();
void Update();
void Delete();
List<T> GetAll();
T GetOne(int id);
}

 

  使用充血实体类,在用及或比较好的,但是Insert
\Update\Delete 都不得不操作一漫漫数据,GetAll 方法不仅将全体数目以出来了,而且还可能拿未需的许段值也拿了下,那个GetOne方法,也许实际上表的主键并无是int
类型的,那么这些概念就是见面来问题。。。

  所以,我们看到众多使了ORM的型,不管多少是否尽需要,先将出去再说,不管主键是不是int
类型,先得一个术以那边,大不了凡独空方法,不管当前实体是否要Delete功能(比如一些系统用户数据是休能够去的),都基类给直接实现了。。。。。。

其三、ORM查询语言

 1,分离关注点

  那么,这些题目ORM能够缓解呢?ORM本来是好“对象-关系映射”的,但此间大部分之ORM都富含了“生成SQL”的力量,而而促成SQL那样的油滑,那么我们要分别出ORM这个关注点,将“生成SQL”的成效于ORM中抽取出来,这样咱们尽管能够起再多的生命力从为发明一个面向对象的,用于ORM查询的语言,(ORM Query
Language) ,这就是OQL。

 

  ORM查询语言,其实已经来矣,从初期的Hibernate的HQL,到MS的Linq(Linq2SQL,EF其实内部还是运用Linq生成的SQL),它们还好转复杂的SQL语句,它们都是直作用于ORM框架的。几乎在和Linq同一时代,PDF.NET否说明了好之ORM查询语言,称为OQL。下面提到的OQL,都是凭的PDF的OQL。

 

2,PDF.NET的ORM框架

  PDF.NET的ORM框架包括4个组成部分:

  1. Entity Object :PDF.NET实体类,它延续给基类
    EntityBase,使得各个一个实体类都变成一个“数据容器”;
  2. OQL:ORM查询语言,以实体类对象为操作对象,生成查询表达式,供实体查询对象下。
  3. AdoHelper:数据看提供次抽象类,封装了针对性ADO.NET的各种访问,包括事物操作;框架默认提供了OledbProvider、OdbcProvider、AccessProvider、SqlServerProvider、OracleProvider等,要支持再次多之数据库,只需要继续AdoHelper即可。
  4. EntityQuery<T> :实体查询对象,它是一个O/R
    Mapping对象,它操作涉及的靶子类型是一个实体类(类型T);在对象中,它会拿OQL转换成SQL,然后调用AdoHelper完成查询。

 

Oracle 2 

 (图2:PDF.NET OQL 架构)

 

  如果单纯于询问调用端来考察,我们发现OQL,跟SQL逻辑上是相当价格的,一个凡“对象化”的查询,一个是“结构化”的询问:

 

 

对象化查询:OQL->ORM-> Entity Objects

等于

结构化查询:SQL ->DB-> DataSet

 

  如果最终效果Entity
Object==DataSet,那么OQL==SQL。

  所以,OQL的统筹目标,就是若她生成的SQL语句效果基本达手写的SQL语句一样。由于SQL的实际实现又发多两样的版本,所以广大时候SqlServer用的SQL语句以Oracle 上不必然能够用,只有那些完全标准的SQL语句才是通用的,因此,OQL的宏图,也非得是如此标准的SQL规范,目前,实现之是SQL92标准规范。

3,OQL查询范式

  下面是OQL支持之询问范式举例,注意下面的定义里面用了“BNF”范式,为了避免大家误会,这里补充下BFN的情,详细内容请参考这链接:http://baike.baidu.com/view/1137652.htm

 

巴科斯范式的内容

  在双引号中之配(“word”)代表在这些字符本身。而double_quote用来表示对引号。

 

  于双引号外之字(有或有下划线)代表在语法有。

 

  尖括号( < > )内含有的为必择项。

 

  方括号( [ ] )内富含的也罢而卜项。

 

  大括哀号( { } )内含的吧可更复0至广大不成的项。

 

  竖线( | )表示于那左右星星止任选同起,相当给”OR”的意。

 

  ::= 是“被定义也”的意。

1,数据查询:

OQL q=OQL.From(entityObject)

[.[InnerJoin|LeftJoin|RightJoin](entityObject2).On(entityObject.PK,entityObject2.FK)]

[.[InnerJoin|LeftJoin|RightJoin](entityObject3).On(entityObject.PK,entityObject3.FK)]

.Select([entityObjectX.Property1][,entityObjectX.Property2][{,…}])

.Where([<entityObject.Property1>[,entityObject.Property2][,…]]|[OQL2]|[OQLCompare])

.GroupBy(entityObjectX.PropertyN,<“asc”>|<“desc”>)

.HavingBy(entityObjectX.PropertyM)

.End;

 

 如果要分页,仅得这么操作:

q.Limit(分页大小[,页码[,总记录数]]);

 

 执行该方式,会转特定数据库平台的分页SQL语句。

 

2,数据统计:

 

OQL q=OQL.From(entityObject)

.Select().Count(entityObject.PropertyX,<””>|<“CountAsName”>)

.Where([<entityObject.Property1>[,entityObject.Property2][,…]]|[OQL2]|[OQLCompare])

.End;

 

3,数据更新:

 

OQL q=OQL.From(entityObject)

.Update([entityObject.Property1][,entityObject.Property2][{,…}])

.Where([<entityObject.Property1>[,entityObject.Property2][,…]]|[OQL2]|[OQLCompare])

.End;

 

4,数据删除:

 

OQL q=OQL.From(entityObject)

.Delete()

.Where([<entityObject.Property1>[,entityObject.Property2][,…]]|[OQL2]|[OQLCompare])

.End;

 

下篇我们将采用实例来讲课OQL的具体使用,敬请期待。 

 

 

注:PDF.NET现在早就开源,有关框架的详细信息,请看官网介绍:http://www.pwmis.com/sqlmap

 

 开源信息介绍:

节前送礼:PDF.NET(PWMIS数据开发框架)V4.5版开始源

 

———————分界线—————————————–

章发布后,热心网友
对自取了片眼光,由于匪关乎个人隐私,这里贴上他的初稿,如果他看出出异议的话请及时和自己联系。在这感谢他提出的下列意见!

 

另外大家看好要点个推荐,反对的语请留下个理由,谢谢。

———————分界线—————————————–

 

 shawn(630235793) 1:10:46
盖浏览了转,感觉还不易

shawn(630235793) 1:14:32
就是博文过于技术细节化而缺失了框架解决的求实问题域、面向的使用者类型,以及完整架构思想和基于关系数据访问框架的差异性描述,让读者一达到来特别难理解ORM框架的来意。

回复:

这些题材确实没有发表清楚,也是盖我的编水平有限,没有想到这些题材,也不理解该怎么来抒发。

PDF.NET的OQL要解决的最主要问题即是受ORM操作会起SQL那样的灵活性,现有大多数ORM框架还是根据CRUD方法级别之操作,还尚未如SQL那样具有语言级别之操作,要不然她怎么会吃称呼4GL为?现在,我当LINQ也享有了这么的能力,而自己框架中之OQL,也时有发生这么的力量,所以自己大胆的名它是一个“ORM
Query
Laguage”,就比如SQL是提供于RDBMS的查询引擎使用同一,OQL是供给ORM使用的。

之所以,OQL面向的使用者是那些喜欢ORM方式来做客数据库,又爱SQL的灵活性的技术人员,或者是供被喜欢其中同样种植(ORM或者SQL)而未极端好另外一栽方法的口,让他俩产生时机体会至其他一样种植艺术的优势。

一体化构思便,用面向对象的点子来操作数据库,用OO的主意来写SQL!

PS:OQL与LINQ相比,它又近乎于SQL风格,用惯了SQL的丁,第一不善接触LINQ是颇不习惯的,至少我是这般。

 

shawn(630235793) 2012-10-6 1:39:15
多少看框架设计之开端设想,首先应该是满足调用层的利用要求,换句话说请求是事务性的,还是非事务性的。如果用户的要是事务性的,在访问层应该提供事务性的拍卖体制。而休是应用层自己来对是否事务性进行拍卖。这些应在访问层的对外交互接口处提供于用户来抉择于合理。
因而,框架内的支行,我倍感还相应再次多考虑一下比较好。

回复:

实体层的接口是部分,只是这图里面不好放置而且无是根本,省略了。
是否用事物,是放在访问层的对外交互接口处提供给用户来抉择的。

shawn(630235793) 2012-10-6 1:47:13
到底数据访问框架对于用户来讲就是该屏蔽所有数据库里操作的差异性,所有和数据库相关的凡事操作都卷入于内。对于用户来讲这些还是一点一滴不肯定去考虑的,只需要提出具体求是呀虽可了。对于哪些解读用户请求、如何根据用户挑选的切切实实数据库,而用呼吁翻译成底层数据库操作指令等等,这些都是访问层里机制形成的。

 

回复:

刚而你所说,框架正是这么去开的,OQL屏蔽了SQL不同数据库中的距离,它会冲实际以的数据库,去特别本地化的SQL。

 

 

广州-海華²º¹²<harvey.cai@qq.com>  17:04:10
跟 linq 有啊似的/区别?
广州-海華²º¹²<harvey.cai@qq.com>  17:05:45
当时篇博文里主推的观,让丁想到 linq。

pdf.net 主推的相应是:linq 般好用,但是性能出众

 

  

回复:

 

LINQ是.NET独有的特性,“语言集成查询”,它是拼在.NET语言中之,这是它们的原优势。LINQ基于表达式树,所以她要求得是.NET平台同时框架版本要求在.NET3.5同以上。

PDF.NET的OQL跟LINQ一样都是ORM框架下的言语,但是OQL语法更近乎被SQL,很易上手,而且,OQL没有使用.NET的高档特性,这令其要是面向对象的言语而且支持泛型即可实现,因此拿它移植到C++、Java是意可能的,而且于.NET平台达成,它呢惟有需.NET2.0版的支撑。

 

 

 

 

相关文章