21 Hibernate框架开发环境配置与应用指导书v10.docx
《21 Hibernate框架开发环境配置与应用指导书v10.docx》由会员分享,可在线阅读,更多相关《21 Hibernate框架开发环境配置与应用指导书v10.docx(24页珍藏版)》请在冰豆网上搜索。
21Hibernate框架开发环境配置与应用指导书v10
Hibernate框架开发环境配置与应用指导书
1.Hibernate框架简介
Hibernate框架是一个非常流行的持久化框架,其在Web开发中占据了非常重要的地位。
Hibernate作为Web应用的底层,实现了对数据操作的封装。
Hibernate框架的应用可以改变传统的JDBC操作数据库的方式。
使用Hibernate框架最核心的是关于整体数据库的配置文件和与之相关的类。
●Configuration类
●Hibernate配置文件
●SessionFactory类
●Hibernate中的对象:
临时对象、持久化对象、脱管对象
●Hibernate中的持久化类:
1.1Configuration类
Configuration类负责管理Hibernate的配置信息,一个Configuration类的实例代表了应用程序中Java类到数据库的映射的集合。
应用程序通常只是创建一个Configuration实例,并通过它创建SessionFactory实例。
例如下面的代码:
SessionFactorysessionFactory=newConfiguration().configure().buildSessionFactory();
1.2Hibernate配置文件:
hibernate.cfg.xml
Configuration是Hibernate的入口,在新建一个Configuration的实例时,Hibernate会在类路径中查找文件hibernate.properties和hibernate.cfg.xml文件,如果这两个文件同时存在,则hibernate.cfg.xml将会覆盖hibernate.properties文件;如果两个文件都不存在,将抛出异常。
1.3SessionFactory类
SessionFactory负责Session实例的创建。
为了创建一个SessionFactory对象,必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。
这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,可以简单地抛弃它。
例如下面的实例代码:
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
SessionFactory是线程安全的,可以被多个线程调用以取得Session对象,而构造SessionFactory很消耗资源,所以多少情况下一个应用中只初始化一个SessionFactory,为不用的线程提供Session。
SessionFactory是重量级的,不能随意创建或者是销毁。
1.4Hibernate中的对象:
临时对象、持久化对象、脱管对象
(1)临时状态
对象在进行数据库保存操作之前被称之为临时状态,此时的数据库中并没有该对象的任何信息,而且该对象的Id信息。
如果此时没被进行持久化,则会在程序退出时丢失临时状态对象的任何信息。
由Java中的new命令开辟内存空间的Java对象,也就是平时所熟悉的普通Java对象。
如果没有变量对它引用,它将被JVM收回。
临时对象在内存是孤立存在的,它的意义仅仅是携带信息的载体,不和数据库中的数据有任何关联。
通过Session的save()和saveOrUpdate()方法可以把一个瞬时对象和数据库相关联,并把临时对象携带的信息通过配置文件所做的映射插入到数据库中,这个临时对象就成为持久化对象,并拥有和数据库继续相同的id字段。
(2)持久化状态
对象在保存到数据库后但并没有脱离Session的时候被称为持久化状态。
该状态时的数据库中已经有了该对象的信息,而且该对象的Id为数据库中对应记录的主键值。
不过由于此时还存在于Session中,所以持久化状态的对象可以对任何有关数据库的操作进行执行。
持久化对象在数据库中有相应的记录,并拥有一个持久化标识。
如果使用delete()方法,持久化对象就变成临时对象,并且删除数据库中相对应的记录,这个对象和数据库不再有任何关联。
当一个Session执行close()或者clear()或evict()之后,持久化对象就变为脱管对象,这时对象的id虽然拥有数据库的识别值,但已经不在Hibernate持久层的管理之下,它和临时对象基本上是一样的,只不过比临时对象多了数据库的标识id值。
在没有任何变量引用此对象的情况下,JVM可能将其回收。
(3)脱管状态
Session关闭之后,与此Session相关联的持久化对象就变为脱管对象,可以继续对这个对象做修改。
如果脱管对象被从新关联到某个新的Session上,会在此转成持久对象。
脱管对象拥有数据库的标识id,所以它可以通过update()、saveOrUpdate()等方法,再次与持久层关联。
1.5Hibernate持久化类
什么是ORM,ORM的全称是Object/RelationMapping即对象/关系映射。
ORM在单独的持久化层,由ORM中间件对数据细节访问进行封装。
ORM可以通过映射来实现对数据操作转换为对象的操作。
对象指使用的编程语言是面向对象的,而关系则指使用的数据库是关系型数据库。
对象/关系映射则是指完成面向对象语言到关系型数据库的映射,通过映射后,我们可以像操作对象一样来操作我们的数据库。
Hibernate开发,通过创建一个持久化类来映射一个数据库表。
其中持久化类的属性则映射到数据库表中的字段。
当我们使用面向对象的方式来操作持久化对象时,ORM框架能自动将这些操作转换成SQL语句,从而完成对数据库的操作。
持久化类
属性1
属性2
数据库表
字段1
字段2
关系模型
对象模型
ORM
(Object/RelationMapping)
2.Hibernate开发过程
通过使用Hibernate框架,Web应用可以通过面向对象的方式来进行数据库的各种访问操作,如插入数据、更新数据、删除数据、查询数据等等。
1.新建java项目:
javaweb172;
a)添加hibernate配置。
b)或者导入包:
hibernate根目录下lib目录下requested目录下的所有包;将导入的包文件建立路径:
buildpath。
2.创建Hibernate配置文件-----hibernate.cfg.xml
a)配置数据库连接URL,以及数据库连接驱动、数据库用户名及用户密码。
还配置一个属性dialect,用来指定数据库产品类型。
3.创建持久化类-----Product.java
a)持久化类是一个POJO(PlainOldJavaObject)类,不用继承任何类或接口。
包含与数据库表中相对应的属性,并包含各个属性所对应的setter和getter方法。
4.创建对象关系映射文件-----Product.hbm.xml
a)用来映射持久化类和数据库表,从而将持久化类中的属性和数据库表中的字段关联起来。
其中id元素用来定义主键标识,property元素用来定义其他属性。
如果不指定数据库表中字段,则默认使用持久化类中的属性作为其数据库表字段名称。
映射文件名一般使用持久化类名加“.hbm.xml”,并保存在持久化类同目录下。
5.通过Hibernate自动创建数据库表------CreateDB.java
a)并根据持久化类的属性名来作为数据库表的字段名。
6.插入数据;
7.查询数据;
8.更新数据;
9.删除数据;
10.使用Hibernate工具类
3.Hibernate开发实例
1.新建javaproject:
Hibernate1
2.在MyEclipse中配置SQLServer数据库连接
a.调出DBBrowser视图。
点击菜单“Window->ShowView->DbBrower”,切换出数据库浏览视图。
b.新增SQLServer数据库连接
c.在DBBrowser窗口内点击鼠标右键,选择“New”,进入“DatabaseProfile”界面:
d.在Driver的下拉框中如果没有SQLServer2005的驱动,则点击其下的“Configuredatabasedriver”,进入数据库驱动配置窗口:
e.在数据库驱动配置窗口中,点击“New…‘,进入新增数据库驱动界面:
选择MicrosoftSQLServer,输入Drivername,并添加数据库驱动的jar文件,确定后返回。
3.增加MyEclipse的Hibernate支持
右键点击项目,在菜单中选择“MyEclipse->AddHibernateCapabilities…”,按照向导逐步进行。
生成hibernate.cfg.cml配置文件。
4.Hibernate开发源代码
4.1.创建Hibernate配置文件------hibernate.cfg.xml
文件名:
hibernate.cfg.xml(在src下)
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"
--数据库连接URL-->
jdbc:
sqlserver:
//localhost:
1433;databaseName=javawebda
--数据库连接驱动-->
com.microsoft.sqlserver.jdbc.SQLServerDriver
--数据库用户名-->
sa
--数据库用户密码-->
sa
--数据库方言-->
org.hibernate.dialect.SQLServerDialect
--指定映射文件-->
sqlcnn
4.2.创建持久化类------Product.java
文件名:
Product.java(在新建包下)
packagecom.rzchina.javaweb;
publicclassProduct{
//产品ID
privateStringid;
//产品名称
privateStringname;
//产品价格
privatedoubleprice;
//获得产品ID
publicStringgetId(){
returnid;
}
//设置产品ID
publicvoidsetId(Stringid){
this.id=id;
}
//获得产品名称
publicStringgetName(){
returnname;
}
//设置产品名称
publicvoidsetName(Stringname){
this.name=name;
}
//获得产品价格
publicdoublegetPrice(){
returnprice;
}
//设置产品价格
publicvoidsetPrice(doubleprice){
this.price=price;
}
}
4.3.创建对象关系映射文件------Product.hbrn.xml
文件名:
Product.hbrn.xml(在新建包下)
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--每个class对应一个持久化对象-->
--id元素用来定义主键标识,并指定主键生成策略-->
--定义其他属性-->
4.4.通过Hibernate自动创建数据库表------CreateDB.java
文件名:
CreateDB.java(在新建包下)
packagecom.rzchina.javaweb;
importorg.hibernate.cfg.Configuration;
importorg.hibernate.tool.hbm2ddl.SchemaExport;
publicclassCreateDB{
publicstaticvoidmain(String[]args){
//读取配置文件hibernate.cfg.xml
Configurationcfg=newConfiguration().configure();
//创建SchemaExport实例
SchemaExportsExport=newSchemaExport(cfg);
//创建数据库表
sExport.create(true,true);
}
}
4.5.插入数据------InsertProduct.java
packagecom.rzchina.javaweb;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassInsertProduct{
publicstaticvoidmain(String[]args){
//读取配置文件hibernate.cfg.xml
Configurationcfg=newConfiguration().configure();
//创建SessionFactory
SessionFactoryfactory=cfg.buildSessionFactory();
//创建Session
Sessionsession=factory.openSession();
//开启事务
session.beginTransaction();
//实例化一个Product
Productproduct=newProduct();
product.setId("0511236");
product.setName("冰箱");
product.setPrice(1250.00);
//保存数据
session.save(product);
//事务提交
session.getTransaction().commit();
//关闭session
if(session.isOpen()){
session.close();
}
}
}
4.6.查询所有数据------QueryAllProduct.java
packagecom.rzchina.javaweb;
importjava.util.Iterator;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassQueryAllProduct{
publicstaticvoidmain(String[]args){
//读取配置文件hibernate.cfg.xml
Configurationcfg=newConfiguration().configure();
//创建SessionFactory
SessionFactoryfactory=cfg.buildSessionFactory();
//创建Session
Sessionsession=factory.openSession();
Productp=null;
//使用HQL查询
Stringhql="FROMProductaspro";
//通过Query方法查询
Queryq=session.createQuery(hql);
//查询结果保存到list中
Listlist=q.list();
//遍历是否存在该id的产品,如果存在则进行输出
Iteratoriter=list.iterator();
while(iter.hasNext()){
p=(Product)iter.next();
System.out.println("id:
"+p.getId()+"name:
"+p.getName()+"price:
"+p.getPrice());
}
//关闭session
if(session.isOpen()){
session.close();
}
}
}
4.7.更新数据------UpdateProduct.java
packagecom.rzchina.javaweb;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassUpdateProduct{
publicstaticvoidmain(String[]args){
//读取配置文件hibernate.cfg.xml
Configurationcfg=newConfiguration().configure();
//创建SessionFactory
SessionFactoryfactory=cfg.buildSessionFactory();
//创建Session
Sessionsession=factory.openSession();
//开启事务
session.beginTransaction();
//实例化一个Product
Productproduct=newProduct();
product.setId("0511236");
product.setName("冰箱");
product.setPrice(1888.88);
//更新数据
session.update(product);
//事务提交
session.getTransaction().commit();
//关闭session
if(session.isOpen()){
session.close();
}
}
}
4.8.按Id查询------UpdateProduct.java
packagecom.rzchina.javaweb;
importjava.util.Iterator;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassQueryProductByid{
publicstaticvoidmain(String[]args){
Sessionsession=HibernateUtil.getSession();
//使用HQL查询
Stringhql="FROMProductasproWHEREpro.id=?
";
//通过Query方法查询
Queryq=session.createQuery(hql);
q.setString(0,"0511236");
//查询结果保存到list中
Listlist=q.list();
//遍历是否存在该id的产品,如果存在则进行输出
Iteratoriter=list.iterator();
if(iter.hasNext()){
Productp=(Product)iter.nex