持久化框架Hibernate 开发实例(二)

1 简述

  通过使用Hibernate框架,开发者可以使用面向对象的方式来进行数据库访问,从而取代

以前使用JDBC进行数据库访问的方式。通过使用Hibernate框架,web应用可以通过面向

对象的方式来进行数据库的各种访问操作,如插入,更新,删除,查询数据等。

1.1 创建Hibernate配置文件

  hibernate从其配置文件中读取和数据库有关的信息。hibernate的配置文件分为两种形式,

一种是XML格式的配置文件,还有一种是资源文件格式的配置文件。分为XML文件或properties文件。

默认文件名为hibernate.cfg.xml与hibernate.properties,参数既可以配置在cfg.xml文件中,

也可以排至在properties文件中。通常配置文件位于classpath目录下。

  下面来看XML格式的配置文件,其文件名为hibernate.cfg.xml。在该配置文件中配置数据库连接

URL,以及数据库连接驱动,数据库用户名及用户密码。还配置一个属性dialect,该属性用来指定

数据库产品类型。

hibernate.cfg.xml:

 1 <!DOCTYPE hibernate-configuration PUBLIC
 2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 4 
 5 <hibernate-configuration>
 6 <session-factory>
 7     <!-- 数据库连接URL -->
 8     <property name="connection.url">
 9         jdbc:mysql://localhost/javaweb
10     </property>
11     
12     <!-- 数据库连接驱动 -->
13     <property name="connection.driver_class">
14         com.mysql.jdbc.Driver
15     </property>
16     
17     <!-- 数据库用户名 -->
18     <property name="connection.username">root</property>
19     
20     <!-- 数据库用户密码 -->
21     <property name="connection.password">123456</property>
22     
23     <!-- 数据库方言 -->
24     <property name="dialect">
25         org.hibernate.dialect.MySQLDialect
26     </property>
27     
28     <!-- 指定映射文件 -->
29     <mapping resource="com/javaweb/hibernate/Product.hbm.xml"/>
30 
31 </session-factory>
32 </hibernate-configuration>

1.2 创建持久化类

  持久化类是一个POJO类,不用集成和实现任何类或借口。该类中包含与数据库表中

相对应的属性,并包含各个属性所对应的setter和getter方法。以下示例代码中的持久化类

包含了三个属性:id,name及price,分别表示产品ID,产品名称及产品价格。

Product.java

 1 package com.javaweb.hibernate;
 2 public class Product {
 3     //产品ID
 4     private String id;
 5     //产品名称
 6     private String name;
 7     //产品价格
 8     private double price;
 9     //获得产品ID
10     public String getId() {
11         return id;
12     }
13     //设置产品ID
14     public void setId(String id) {
15         this.id = id;
16     }
17     //获得产品名称
18     public String getName() {
19         return name;
20     }
21     //设置产品名称
22     public void setName(String name) {
23         this.name = name;
24     }
25     //获得产品价格
26     public double getPrice() {
27         return price;
28     }
29     //设置产品价格
30     public void setPrice(double price) {
31         this.price = price;
32     }
33 }

1.3 创建对象关系映射文件

  关系映射文件用来映射持久化类和数据库表,从而将持久化类中的属性和数据库表中的

字段关联起来。其中id元素用来定义主键标识,property元素用来定义其他属性。如果不指定

数据库表中字段,子默认使用持久化类中的属性作为其数据库表字段名称。映射文件的文件名

一般采用持久化类名加上“.hbm.xml”,并保存在持久化类的同目录下。

  以下实例是一个对应关系的映射文件示例,用来映射前面添加的持久化类Product.java

Product.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping>
 6     <!-- 每个class对应一个持久化对象,此处对应的是同目录下的Product -->
 7     <class name="com.javaweb.hibernate.Product">
 8         <!-- id元素用来定义主键标识,并指定主键生成策略 -->
 9         <id name="id">
10             <generator class="assigned"></generator>
11         </id>
12         
13         <!-- 定义其他属性 -->
14         <property name="name"></property>
15         <property name="price"></property>
16     </class>    
17 </hibernate-mapping>

另外,此处要想是的映射文件起作用,还必须在Hibernate的配置文件hibernate.cfg.xml中

配置该映射文件,具体代码如下图所示:

数据映射文件编写时还需要注意以下几点:

  * 按照XML文件的编写规范,一一对应。

  * 数据映射必须要放置到<hibernate-mapping></hibernate-mapping>之间。

  * 指定所使用到的实体类的存放位置及映射的表名和数据库名,以上内容要在<class></class>属性中指定。

1.4 创建数据库表

  以前开发Web应用,都是先创建数据库表,然后才能通过JDBC来进行操作。现在将

思想转变一下,可以不用创建数据库,而是通过Hibernate来自动创建数据库表,并根据

持久化类的属性名来作为数据库表的字段名。以下示例代码为通过Hibernate创建数据库的实例。

CreateDB.java

 1 package com.javaweb.hibernate;
 2 
 3 import org.hibernate.SessionFactory;
 4 import org.hibernate.cfg.Configuration;
 5 import org.hibernate.tool.hbm2ddl.SchemaExport;
 6 
 7 public class CreateDB {
 8 
 9     public static void main(String[] args){
10         //读取配置文件hibernate.cfg.xml
11         Configuration cfg = new Configuration().configure();
12         
13         SessionFactory sessionFactory = cfg.buildSessionFactory();
14         
15         //创建SchemaExport实例
16         SchemaExport sExport = new SchemaExport(cfg);
17         //创建数据库表
18         sExport.create(true, true);
19     }
20 }

  以上代码第11行通过Configuration类来读取配置文件hibernate.cfg.xml。

代码第16行创建了SchemaExport实例化对象,代码第18行通过调用SchemaExport的

实例化对象的create()方法来创建数据库。

1 drop table if exists Product
2 create table Product (
3 id varchar(255) not null, 
4 name varchar(255), 
5 price double precision, 
6 primary key (id)
7 )

在MySql服务器控制台中输入“desc product;”命令,可以看到该表的字段名称及其他信息,

如下图所示:

1.5 插入数据

下面看如何使用Hibernate插入一条数据。首先看以下要完成数据库操作需要那些步骤。

  • 获得Configuration实例
  • 通过Configuration实例调用其buildSessionFactory()方法来获得SessionFactory实例。
  • 通过SessionFactory实例调用openSession()方法来获得Session实例。
  • 通过Session实例beginTransaction()方法开启事务。
  • 通过Session实例调用其方法完成想面向对象方式的数据库操作。
  • 通过Session实例的getTransaction()获得当前事务并关闭。
  • 关闭Session。

以下代码是一个通过Hibernate插入数据的示例。

InsertProduct.java

 1 package com.javaweb.hibernate;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 
 7 public class InsertProduct {
 8 
 9     public static void main(String[] args) {
10         //读取配置文件hibernate.cfg.xml,获得Configuration实例
11         Configuration cfg = new Configuration().configure();
12         
13         //创建SessionFactory
14         SessionFactory factory = cfg.buildSessionFactory();
15         
16         //创建Session
17         Session session = factory.openSession();
18         
19         //开启事务
20         session.beginTransaction();
21         
22         //实例化一个Product
23         Product product = new Product();
24         product.setId("0511236");
25         product.setName("冰箱");
26         product.setPrice(1250.00);
27 
28         //保存数据
29         session.save(product);
30         
31         //事务提交
32         session.getTransaction().commit();
33         
34         //关闭session
35         if(session.isOpen()) {
36             session.close();
37         }
38     }
39 }

  运行该java应用程序。在MySQL控制台中输入" select * from product;"命令

可以看到数据成功插入到product表中了。

               

1.6 删除数据

  删除数据操作和插入数据操作也非常类似,调用Session对象的delete()方法即可完成

数据的删除。

deleteProduct.java

 1 package com.javaweb.hibernate;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 
 7 public class deleteProduct {
 8 
 9     public static void main(String[] args) {
10         
11 /**
12         //读取配置文件hibernate.cfg.xml
13         Configuration cfg = new Configuration().configure();
14         
15         //创建SessionFactory
16         SessionFactory factory = cfg.buildSessionFactory();
17         
18         //创建Session
19         Session session = factory.openSession();
20         
21         //开启事务
22         session.beginTransaction();
23         
24         //实例化一个Product
25         Product product = new Product();
26         product.setId("0511236");
27         product.setName("冰箱");
28         product.setPrice(1888.88);
29 
30         //删除数据
31         session.delete(product);
32         
33         //事务提交
34         session.getTransaction().commit();
35         
36         //关闭session
37         if(session.isOpen()) {
38             session.close();
39         }
40 */        
41 
42 //以下操作使用hibernate工具类来进行删除操作!
43         
44         //创建Session
45         Session session = HibernateUtil.getSession();
46         
47         //开启事务
48         session.beginTransaction();
49         
50         //实例化一个Product
51         Product product = new Product();
52         product.setId("0511236");
53         product.setName("冰箱");
54         product.setPrice(1888.88);
55 
56         //删除数据
57         session.delete(product);
58         
59         //事务提交
60         session.getTransaction().commit();
61         
62         //关闭session
63         HibernateUtil.closeSession(session);
64     }
65 }

  代码第51行实例化了一个Product对象,并设置其属性。代码57行通过调用session对象的

delete方法删除Product实例化对象。重新运行java应用程序。在MySQL控制台输入"select * from product;"

命令,数据可被被删除。

  同样,可以使用HQL查询语句来实现按ID删除。

deleteProductByid.java

 1 package com.javaweb.hibernate;
 2 
 3 import org.hibernate.Query;
 4 import org.hibernate.Session;
 5 import org.hibernate.SessionFactory;
 6 import org.hibernate.cfg.Configuration;
 7 
 8 public class deleteProductByid {
 9 
10     public static void main(String[] args) {
11         //读取配置文件hibernate.cfg.xml
12         Configuration cfg = new Configuration().configure();
13         
14         //创建SessionFactory
15         SessionFactory factory = cfg.buildSessionFactory();
16         
17         //创建Session
18         Session session = factory.openSession();
19         
20         //开启事务
21         session.beginTransaction();
22         
23         // 使用HQL查询
24         String hql = "DELETE Product WHERE id=?";
25         Query q = session.createQuery(hql);
26         q.setString(0, "0511234");
27         q.executeUpdate();
28 
29         
30         //事务提交
31         session.getTransaction().commit();
32         
33         //关闭session
34         if(session.isOpen()) {
35             session.close();
36         }
37     }
38 }

  代码24行声明了一个HQL语句,用来删除指定ID的产品。代码第25行共通过Session对象的

createQuery方法来执行该HQL语句。代码第26行通过参数设置id的值为"0511234",代码第27行

通过调用Quert对象的executeUpdate方法来指定删除操作。

    《未完待续》

posted @ 2015-09-25 15:38  北海悟空  阅读(296)  评论(0编辑  收藏  举报