Hibernate3.x:最超卓的ORM框架[Java编程]
本文“Hibernate3.x:最超卓的ORM框架[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1、前言
JDBC是Java操作数据库最常用的数据库接口,它断绝了数据库的复杂度,使程序员可以将主要精神放到程序逻辑上来.而JDBC也只是供应了和数据库交互的简单方法,如翻开数据库表,履行SQL语句等.这关于复杂的程序也需求编写大量的代码,因此,近几年在Java数据库范畴呈现了很多框架,这此框架重新对JDBC举行了更高层次的封装.如早期的iBATIS.这个框架利用起来非常便利.它也没有基于复杂的面向对象模子.也不工作在复杂的关系图中.这种最初级的框架将数据库和利用程序断绝开来.使程序员只操作逻辑数据库.但由于这种框架不是基本面向对象和关系模子,在对付大规模利用程序时仍旧捉襟见肘.基于这些不足,近来很多基于关系映射(ORM)的数据库框架开始风行起来.Hibernate就是此中的佼佼者.ORM的基本思惟是利用外键和得当的约束将抽象差别的数据库.在最新的Hibernate3.x中,加强了对约束的掌握,利勤奋效更强,也更简单利用.
在这些ORM框架刚兴起的时刻,有很多人认为ORM框架最多只是从多挑选之一.即便某个ORM框架做的非常出钯,将对象和数据库之间映射的非常完善也是如此.他们认为直接利用SQL写程序才是王道,而利用自动生成的SQL的效率低下,并且很不机动.但随着程序规模越来越大,这种设法越来越站不住脚.这主要并不只是因为直接利用SQL将产生大量的代码,而是因为利用ORM框架,我们将操作一个完好差别的层:ORM层.直接利用SQL也大概产生其他的问题,如我们常常会碰到的N+1挑选问题.并且在衔接很多表时,我们会一遍一各处反复写非常近似的SQL语句.假如我们利用Hibernate,这些问量就将荡然无存.我们可以使非常简单的HQL来完成上述复杂的问题.象Hibernate一样ORM框架还应当能举行各种优化,以使操作到达最佳化.就目前来看,这些框架的优化功效已经越来越强,正在渐渐代替用JDBC和SQL操作数据库的方法.
固然可以用ORM框架来编写大大都程序,但有时也需求直接利用SQL来操作.大概Hibernate的开辟团队也意识到了这一点,也为Hibernate供应了直接履行SQL的功效.在早期的Hibernate版本中,办理筹划是直接将JDBC衔接表露给用户,这样程序员便可以直接利用prepared statment来履行SQL了.但在新的Hibernate3.x中,这种情形已经被改变了.目前,Hibernate3.x可以不利用一条SQL编写整个利用程序,并且这并不会影响Hibernate的机动性,同时也可以利用Hibernate的全部其他特点.
2、Hibernate3.x功效演示
上面说了很多Hibernate的好处,也面就让我们来领会一下Hibernate3.x在这方面的出色表现.我们将利用一个简单的Person-Employment-Oranization模子来阐明.最简单的类是Person,下面是它的定义:
<class name="Person" lazy="true">
<id name="id" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="name" not-null="true"/>
<loader query-ref="person"/>
<sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
<sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
<sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
</class>
看了上面的定义,大概我们会首先注意到三个手写的SQL语句:INSERT、UPDATE和DELETE.此中的?将匹配上面所列的两个属性(这两个属性是id和name).除了这个,这三条语句没有什么之处.
大概很多读者最感爱好的是<loader>标签.这个标签订义了一个命名查询.这个查询在任什么时刻候当我们利用get(),load()装载person或利用惰性关联获得数据时城市履行它.普通来说,这个命名查询应当是一个SQL语句,以下面如示:
<sql-query name="person">
<return alias="p" class="Person" lock-mode="upgrade"/>
SELECT NAME AS {p.name}, ID AS {p.id} FROM PERSON WHERE ID=? FOR UPDATE
</sql-query>
注:一个本地的SQL查询大概会返回多个"实体列",但本例对比简单,只返回了一个实体.
Employment相对更复杂一点,并且并非全部的属性都包含在INSERT和UPDATE中.定义以下:
<class name="Employment" lazy="true">
<id name="id" unsaved-value="0">
<generator class="increment"/>
</id>
<many-to-one name="employee" not-null="true" update="false"/>
<many-to-one name="employer" not-null="true" update="false"/>
<property name="startDate" not-null="true" update="false"
insert="false"/>
<property name="endDate" insert="false"/>
<property name="regionCode" update="false"/>
<loader query-ref="employment"/>
<sql-insert>
INSERT INTO EMPLOYMENT
(EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, ID)
VALUES (?, ?, CURRENT_DATE, UPPER(?), ?)
</sql-insert>
<sql-update>UPDATE EMPLOYMENT SET ENDDATE=? WHERE ID=?</sql-update>
<sql-delete>DELETE FROM EMPLOYMENT WHERE ID=?</sql-delete>
</class>
以上是“Hibernate3.x:最超卓的ORM框架[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |