• 持久化框架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方法来指定删除操作。

        《未完待续》

  • 相关阅读:
    csu 1604 SunnyPig (bfs)
    openjudge 大师兄,师傅被妖怪抓走啦
    poj 3264 线段树 求区间最大最小值
    bzoj 1012 维护一个单调数列
    poj 1840 暴力+标记
    最短路径(Dijkstra实现)
    最小生成树(Kruskal实现)
    最小生成树(Prim实现)
    拓扑排序(Kahn实现)
    拓扑排序(DFS实现)
  • 原文地址:https://www.cnblogs.com/tdcqma/p/4838420.html
Copyright © 2020-2023  润新知