《清华ITJAVAEE教学PPT.ppt》由会员分享,可在线阅读,更多相关《清华ITJAVAEE教学PPT.ppt(27页珍藏版)》请在三一办公上搜索。
1、第十章,创建Hibernate应用,课程目标,创建Hibernate主配置文件 创建Hibernate映射文件 利用Hibernate API访问数据库 使用Hibernate转换工具 使用Hibernate实现数据的添加、删除、修改、查询等功能,体验项目,程序实现的功能:该程序通过Hibernate实现保存对象、删除和查询对象等功能。程序运行的过程如下所示:(1)启动服务器后,访问添加数据页面,如图10-1所示:,图10-1 添加数据页面,(2)分别添加两条不同的数据,由于我们采用的是Struts框架,当添加成功后,视图仍将转发至添加数据页面。又由于在该页面中调用了查询表数据的Bean,所以
2、将在此页面显示数据库中所有的信息,如图10-2所示:,图10-2 添加成功并将数据返回给客户端,(3)该程序实现了删除数据的功能,可以一次性删除多条数据。此时我们选择删除“Lily”的信息,如图10-3所示:,图10-3 删除数据,(4)当重复添加相同的账号,或数据长度过长时,则执行失败,从而视图将转发至错误页面。如图10-4所示:,图10-4操作失败页面,Hibernate 的配置文件,Hibernate的配置文件有两种形式,一种是xml格式的文件,默认的名称为“hibernate.cfg.xml”。另一种是“键=值”形式的属性文件,以“properties”为后缀,默认的名称为“hiber
3、nate.properties”。这些配置文件都应存放于Web应用中的WEB-INFclasses目录下。Hibernate可以从它的配置文件中读取与数据库连接的相关信息。,true com.microsoft.jdbc.sqlserver.SQLServerDriverjdbc:microsoft:sqlserver:/localhost:1433;databasename=test sa,hibernate.cfg.xml与hibernate.properties文件介绍,hibernate.cfg.xml文件的根元素,这是hibernate.cfg.xml基本配置文件,元素是可以同时存在
4、多个,在程序中,创建一个configuration实例,代码如下:,Configuration conf=new Configuration();conf.configure();,新建一个Configuration实例时,Hibernate会在classPath中查找hibernate.properties文件。如果该文件存在,则将该文件内容加载到一个Properties的实例GLOBAL_PROPERTIES中,如果该文件不存在,将打印信息:hibernate.properties not found 如果hibernate.properties文件存在,系统还会验证一下这个文件配置的有效
5、性,对于一些已经不支持的配置参数,系统将打印警告信息。,configure()方法默认会在classpath下寻找hibernate.cfg.xml文件。如果没有找到该文件,系统会打印如下信息并抛出HibernateException异常:hibernate.cfg.xml not found 如果找到该文件,configure()方法会首先访问元素,并获取该元素的name属性。如果非空,将用这个配置的值来覆盖hibernate.properties文件中hibernate.session_factory_name的配置值。,接下来configure()方法将访问的子元素。首先将使用所有的元素
6、配置信息。在元素中,我们就可以配置它的“name”属性来获得访问数据库所需要的驱动、URL、数据库登录的用户名和密码等信息。下面我们来看看“name”属性所对应值的介绍。,“show_sql”,为true时,表示正在执行的程序。会在控制台打印出所执行的SQL语句,为false时就不会打印。一般在程序的开发阶段,都将其设置为true,以便观察程序的运行情况。“dialect”,指定Hibernate SQL的一种方式。例如,如果使用MySQL数据库,设置为“net.sf.hibernate.dialect.MySQLDialect”。“connection.driver_class”,表示配置访
7、问数据库的驱动。“connection.url”,表示配置访问数据库连接的URL。“connection.username”,表示配置登录数据库的用户名。“connection.password”,表示配置登录数据库的密码,上例的配置表示密码为空。,Hibernate能访问多种关系型的数据库,如SQL Server、MySQL、Oracle、Sybase等等。对于hibernate.properties文件来说,它完成的功能和hibernate.cfg.xml文件相同。当读取完元素的信息后,configure()方法将访问以下元素所配置的信息:,其中元素是必不可少的,必须通过配置元素的reso
8、urce属性,configure()才能访问到我们定义的Java对象和关系数据库表的映射文件(*.hbm.xml)。在这里需要注意一点,在hibernate.properties文件中,不需要配置被映射的类文件,而是通过实例化Configuration后调用它的addClass()方法来访问类文件,,创建持久化类,在创建映射文件前,应该创建一个持久化类。持久化类是指其实例需要被Hibernate持久化到数据库中的类。持久化类通常是域模型中的实体域类。持久化类需符合JavaBean的标准,包含一些属性,以及与之相对应的setter和getter方法。其中属性一般修饰为private,方法修饰为p
9、ublic。,.newInstance()方法来构造持久化实例,所有持久化类必须提供一个不带参数的默认构造方法。另外,对属性进行操作的setter与getter方法的书写都要符合规范,set与get后面必须紧跟属性名,且属性名字的第一个字母大写,如getName()。如果set与get后面的属性名全小写或全大写,那么会导致Hibernate在运行时抛出异常。,接下来为创建的持久化类建立一个关系数据库表,以用来保存数据。,由于Hibernate是通过xml格式的文件来指定对象与关系数据之间的映射,所以需要为持久化类(如Users)建立一个xml格式的映射文件,并将其命名为:类名.hbm.xml。
10、然后将该文件存放于应用中的WEB-INFclasses目录下。如以下代码:,创建映射文件(*.hbm.xml),在hibernate.cfg.xml文件中可以配置元素的resource 属性来指定映射文件,参考代码如下:,1DTD,配置映射文件时,需要遵循它对应的DTD文件格式。每一个xml文件都有其各自的DTD文件。Hibernate的对象-关系映射文件所遵循的DTD文件,可以去http:/rnate-mapping-2.0.dtd下载,该文件对元素有以下定义:,元素中存在子元素,hibernate-mapping-2.0.dtd文件对元素有如下定义:,2元素,按照hibernate-map
11、ping-2.0.dtd的定义,在元素中必须存在子元素,且子元素只能出现一次。同时子元素可以出现多次,但是按照DTD的定义顺序,子元素必须在子元素之前。元素用来设置对象标识符,它有三个属性需要配置,分别如下:,name:与对应持久化类中的id属性名一致。type:与对应持久化类中的id属性的数据类型一致。column:与对应关系数据库表中的字段名一致。,Generator接口,并提供了多种内置的实现。例如以上接口的缩写名为“identity”。代码书写可以写成如下格式:,3元素,元素包括多个属性,主要为以下几个:,name属性:指定持久化类的属性名称。type属性:指定Hibernate映射类
12、型。Hibernate映射类型是Java类型与SQL类型的桥梁。例如当SQL类型为varchar时,那么Hibernate映射类型为java.lang.String类型。column属性:指定与类的属性映射的关系数据库表的字段名,该名称不区分大小写。not-null属性:为true时,表示name属性不允许为null;当为false时,表示允许为null,默认为false。length属性:指定类属性存储的数据长度。,利用Hibernate API访问数据库,Hibernate的初始化,首先创建一个Configuration类的实例,然后调用Configuration对象的configure(
13、)方法,此时Hibernate会读取默认文件路径下的配置文件,并将配置文件的信息加载至内存中。如当主配置文件名称不是默认的名称时,譬如为“a.xml”,可以作为参数传入configure()方法中。接下来调用Configuration对象的buildSessionFactory()方法以创建SessionFactory类的实例,并把Configuration对象所包含的所有配置信息拷贝至SessionFactory对象的缓存中。如以下代码:,Configuration conf=new Configuration();conf.configure();/conf.configure(a.xml
14、);SessionFactory fact=conf.buildSessionFactory();,SessionFactory对象是一个重量级的对象,如果在应用中只有一个数据存储源,只需要创建一个SessionFactory实例,如果创建多个SessionFactory实例,将会消耗掉很大的内存空间。,访问Hibernate的Session接口,Hibernate初始化结束后,就可以调用SessionFactory实例的openSession()方法来获得Session实例,通过Session实例,可以对数据库进行各种操作,如以下代码片段将一个Java对象保存至数据库中。,Transacti
15、on tran;trytran=session.beginTransaction();session.save(users);/users代表一个对象mit();catch(Exception e)if(tran!=null)tran.rollback();finallysession.close();,Session实例的删除、查询、更新、加载等方法的演示,1delete()方法演示 int id=1;Transaction tran=session.beginTransaction();session.delete(from Users as u where u.id=+id);mit()
16、;,2find()方法演示String name=null;String password=null;Transaction tran=session.beginTransaction();List list=session.find(from Users as u);for(int i=0;ilist.size();i+)Users users=(Users)list.get(i);name=users.getName();password=users.getPassword();,3update()方法的演示 int id=1;Transaction tran=session.beginT
17、ransaction();List list=session.find(from Users as u where u.uid=+id);for(int i=0;ilist.size();i+)Users users=(Users)list.get(i);users.setPassword(abc123);session.update(users);mit();mit();,4.load()方法演示 int id=1;Transaction tran=session.beginTransaction();Users users=(Users)session.load(Users.class,i
18、d);users.setPassword(abc123);mit();,为了提高开发效率,Hibernate提供了一些实用工具,它们用于在映射文件、Java源文件以及数据库Schema之间自动进行转换。下面来看看这些工具的转换作用:hbm2java:根据映射文件自动生成Java源文件。hbm2ddl:根据映射文件自动生成数据库Schema。XDoclet:根据带有Doclet标记的Java源文件生成映射文件。Middlegen:根据数据库Schema自动生成映射文件。,Hibernate提供的转换工具,编写映射文件,hbm2java和hbm2ddl工具是根据映射文件来自动生成Java源文件或数
19、据库的,所以需要先编写对象-关系的映射文件。,元素用于精度的控制Java源代码中的内容,它具有以下属性:,class-description:指定描述类的javaDoc。field-description:指定描述类属性的javaDoc。interface:如果为true,表示生成接口而非类,默认为false。implements:指定类所实现的接口。extends:指定类继承的父类名。generated-class:重新指定生成的类名。scope-class:指定类的修饰符,默认为public。scope-set:指定set方法的修饰符,默认为public。scope-get:指定get方法
20、的修饰符,默认为public。scope-field:指定类的属性修饰符,默认为private。use-in-toString:如果为true,表示在tostring方法中包含此属性。gen-property:如果为false不会在java类中生成此属性,默认为true。finder-method:指定find方法名。,元素用于精度的控制表的定义,它具有以下属性:,name:指定字段名称。length:指定字段长度。not-null:当为true时不允许为空,默认为false。unique:当为true时该字段有唯一约束,默认为false。index:给一个或多个字段建立索引。unique-k
21、ey:为多个字段设定唯一约束。foreign-key:为外键命名。sql-type:设定字段SQL的类型。check:设定SQL检查约束。,运行hbm2java和hbm2ddl工具,将“hibernate.cfg.xml”配置文件拷贝至src目录下。我们将采用ANT工具来运行它。在项目的根目录下建立一个“build.xml”文件,这个文件含有四个任务,这里会用到“generate-code”、“schemaexport”两个任务。然后运行“build.xml”文件,就可以在src目录下生成User.java类文件了。由于篇幅有限,就不列出Java文件的内容了。同时在项目根目录下,也会产生一个“
22、schema-export.sql”文件,该文件是在“build.xml”中设定的:,drop table if exists INFOcreate table INFO(id int not null auto_increment,username varchar(10)not null,phone varchar(11),set varchar(2),address varchar(100),email varchar(30),primary key(id),实践项目,一、程序的实现要求如下:(1)保存对象至数据库。(2)从数据库中删除对象。(3)从数据库中查询对象。,二、实现步骤,(1)
23、以Struts+Hibernate形式来实现该项目。当用户点击“添加”按钮时,在AddAction类中实现对象的持久化。(2)用户成功保存数据后,将在页面中显示出所有已经保存的信息,并在每条信息前加上一个复选框,用来选择需要删除的数据,编写代码实现该功能bean。(3)当用户选择某条数据或多条数据后,点击“删除”按钮,在DeleteAction类中完成删除的操作。(4)最后配置Hibernate的主配置文件和映射的持久化类文件。,本章总结,创建Hibernate主配置文件 创建Hibernate映射文件 利用Hibernate API访问数据库 使用Hibernate转换工具 使用Hibernate实现数据的添加、删除、修改、查询等功能,