解说Hibernate的工作原理实例

*

解说Hibernate的工作原理实例

*http://developer.51cto.com2009-09-2315:37佚名21jn我要评论(0)

原理是什么呢?hibernate可以理解为是一个中间件它负责把java程序的sql语句接收过来发送到数据库,而数据库返回来的信息hibernate接收之后直接生成一个对象传给java。

大家可能对Hibernate有大概了解,但Hibernate原理到底是什么,不一定清楚,这篇文章主要通过一个实例说明Hibernate原理。希望对大家的学习有所帮助。

我们知道如果用java连接数据库我们首先想到的就是JDBC,那么Hibernate原理是什么呢?hibernate可以理解为是一个中间件它负责把java程序的sql语句接收过来发送到数据库,而数据库返回来的信息hibernate接收之后直接生成一个对象传给java。

在说Hibernate原理之前,先说说Hibernate的文件吧。

假设一个student的学生表:

sql语句:

1.createtablestudent(idNumber(10),namevarchar2(20))

接下来呢.我们需要有两个hibernate特有的文件。一个是以.cfg.xml结尾的文件.一个是以.hbm.xml结尾的文件。这两个文件做什么用的呢?

.cfg.xml的作用就是连接数据库,文件内部其实就是一个由user,password,url,driver组成的一个连接库的基本信息。

文件的内容是这样的:

1.xmlversion='1.0'encoding='UTF-8'?>

2.

3.PUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN"

4."http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

5.

6.<hibernate-configuration>

7.<session-factory>

8.<propertyname="connection.username">111property>

9.<propertyname="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:risproperty>

10.<propertyname="dialect">org.hibernate.dialect.Oracle9Dialectproperty>

11.<propertyname="connection.password">111property>

12.<propertyname="connection.driver_class">oracle.jdbc.driver.OracleDriverproperty>

13.

14.<mappingresource="Student.hbm.xml"/>

15.session-factory>

16.hibernate-configuration>

这个文件的全称应该是"你的应用名字.cfg.xml"。当前例子建立的项目名称是one.cfg.xml。

简单分析一下这个文件:

包含的是程序里面的configuration的实例的信息。通过这个实例的方法configure我们可以从mapping里得到对应的表的信息和类的信息。

这个标签是我们在程序里通过configure的方法BuildSessionFactory所得到的一个SessionFactory对象,这个对象可以理解为一个statement,我们对数据库的所有操作都是通过它的一系列方法来实现的。

里面的那些property是一些连接需要的东西。其中dialect这个是hibernate的方言属性值,对于不同的数据库,方言的值dialect是不同的,那么下面就列出在不同的数据库中如何设置该dialect值(参见下表):

RDBMS

方言

DB2

org.hibernate.dialect.DB2Dialect

DB2AS/400

org.hibernate.dialect.DB2400Dialect

DB2OS390

org.hibernate.dialect.DB2390Dialect

PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

MySQL

org.hibernate.dialect.MySQLDialect

MySQLwithInnoDB

org.hibernate.dialect.MySQLInnoDBDialect

MySQLwithMyISAM

org.hibernate.dialect.MySQLMyISAMDialect

Oracle(anyversion)

org.hibernate.dialect.OracleDialect

Oracle9i/10g

org.hibernate.dialect.Oracle9Dialect

Sybase

org.hibernate.dialect.SybaseDialect

SybaseAnywhere

org.hibernate.dialect.SybaseAnywhereDialect

MicrosoftSQLServer

org.hibernate.dialect.SQLServerDialect

SAPDB

org.hibernate.dialect.SAPDBDialect

Informix

org.hibernate.dialect.InformixDialect

HypersonicSQL

org.hibernate.dialect.HSQLDialect

Ingres

org.hibernate.dialect.IngresDialect

Progress

org.hibernate.dialect.ProgressDialect

MckoiSQL

org.hibernate.dialect.MckoiDialect

Interbase

org.hibernate.dialect.InterbaseDialect

Pointbase

org.hibernate.dialect.PointbaseDialect

FrontBase

org.hibernate.dialect.FrontbaseDialect

Firebird

org.hibernate.dialect.FirebirdDialect

跟住继续讲Student.hbm.xml这个文件。这个文件是对数据库的表的映射文件,我们用这个文件指出哪个类对应着哪个表,而且还指出哪个类中的属性对应着表中的哪个字段。

文件的内容是这样的:

1.xmlversion="1.0"?>

2.

3.PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

4."http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

5.

6.<hibernate-mapping>

7.<classname="src.Student"table="student">

8.<idname="id"column="id">

9.<generatorclass="increment"/>

10.id>

11.<propertyname="name"column="name"/>

12.class>

13.hibernate-mapping>

到此这个文件就结束了。特别说一下这个id的问题。我们看到文件里面有个,这个是什么呢?这个是可以实现自动id增加,也就是说如果我们往数据库中插入一个name那么就id自动加1。

这个文件解释一下了这个所包含的就是我们前一个文件里面说的mapping。我们在java类中configure得到的mapping就是从这个文件里面读取出来的。类如果带包的话一定要带包名(推荐一切写的类都要带包).包名和类名要注意.包名小写,类名的第一个大写。我是怕出错,这里提醒大家一下,这个就是先指定了类对应的表。然后里面的那些就是指定表中的字段与类中的属性的对应关系了。

到这里这两个特殊的文件就介始完了。下面就开始讲我们的java类了。主要有两个:一个是Pojo类,一个是我们的Test类。

Pojo类其实就是简单的一个javaBean。(PlainOldJavaObjects,简单洁净Java对象)。看下面的代码:

1.packagesrc;

2.

3.publicclassStudent{

4.

5.privateintid;

6.privateStringname;

7.

8.publicvoidsetId(intid){

9.this.id=id;

10.}

11.

12.

13.publicvoidsetName(Stringname){

14.this.name=name;

15.}

16.

17.publicintgetId(){

18.returnid;

19.}

20.

21.publicStringgetName(){

22.returnname;

23.}

24.}

就是这么简单的一个类。就是和数据库的字段对应然后取值的。

下面是我们关键的Test类:

1.packagesrc;

2.

3.importorg.hibernate.*;

4.importorg.hibernate.cfg.*;

5.

6.publicclassTest{

7.publicstaticvoidmain(Stringbb[]){

8.try{

9.SessionFactorysf=newConfiguration().configure().BuildSessionFactory();

10.Sessions=sf.opension();

11.Transactionts=s.beginTransaction();

12.for(inti=0;i<3;i++){

13.Studentst=newStudent();

14.st.setName("begingo"+i);

15.s.save(st);

16.}

17.ts.commit();

18.s.close();

19.}catch(Exceptione){

20.e.printStackTrace();

21.}

22.}

23.}

这里的第一句SessionFactorysf=newConfiguration().configure().BuildSessionFactory();得到configuration的实例.这个开始要和最前面的哪个.cfg.xml对应着看了。

我们取得实例,然后通过configure()读取mapping对应的.hbm.xml文件的信息。然后我们通过BuildSessionFactory得到SessionFactory对象,然后我们在通过opensession()建立连接.Session就是指一个session被建立。这个需要有servlet的基础理解,这里等于是一个connection被建立好。

下面通过session对象开启事务(Transaction)这个相当于conn.setAutoCommit(false);先不递交最后通过另外一个方法递交。我们看到下面我们循环里把咱们写好的Student实例化了。既然实例化了我们就能用里面的方法了。

每次都要session来save一下。一个对象set之后要保存,很好理解吧,保存在了session中。最后递交commit();这个方法实际上是实现了两个作用

1.conn.commit();

2.conn.setAutoCommit(true);

这样才能把我们的数据放进数据库中。很奇怪没有sql语句吧.最后提醒一下.想想hibernate的特性.我们对数据库的操作就是对对象的操作.这就是OR-Mapping。呵呵,实例分析结束。

1.Hibernate入门学习宝典

2.Hibernate属性简单分析

3.Struts-Spring-Hibernate案例

4.简述Hibernate配置连接池

5.对Hibernate中get()与load()不同点分析

【责任编辑:叶淑娟TEL:(010)68476606】

原文:解说Hibernate的工作原理实例

标签:Hibernate原理

上一篇:Hibernateupdate全面讲解下一篇:HibernatesaveOrUpdate分析

网友评论

查看所有评论(0)

通行证:密码:注

相关推荐