• hibernate初体验


    简介:

          Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    下载Hibernate:

         到Hibernate官网:http://www.hibernate.org/ 或  http://sourceforge.net/ 上都能下载到最新版本的Hibernate。

    初探Hibernate

        通过如下小实例演示如何使用hibernate操作数据库(增删改查等)。你会发现,在java代码中基本看不到对数据库作操作的jdbc语句或sql语句,这些都同hibernate来完成,用户只需要关心业务的实现。

    参考手册:

    hibernate_reference.pdf 下载地址:http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/pdf/hibernate_reference.pdf  虽说是中文版的,可是翻译不是很完整,而且是3.6版的,不过影响不大,本文以这个手册作为参考。

    或者可以使用线上版的http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html_single/ hibernate4.2版,全英文。

    环境介绍:

    开发工具IDE: Eclipse Java EE IDE for Web Developers.
    jdk版本 jdk1.7
    hibernate版本 hibernate-release-4.2.5.Final
    数据库 oracle11g

    如下数据库表,表名student:

    QQ截图20131013224148

    一、搭建Hibernate的使用环境

    1. 我们这里建立Java Project。例如:HelloHibernate。
    2. 引入hibernate所需要的jar包。解压下载好的hibernate-release-4.2.5.Final.zip。打开解压后的文件夹,打开lib,把required目录下的jar包全引入到项目中。(以上是hibernate4所要导入的jar包,hibernate3所需要的jar包如下:根目录下的hibernate3.jar,lib->required目录下所有的jar包,依赖包:log4j-1.2.16.jar、commons-lang-2.3.jar、slf4j-log4j12-1.5.8.jar)
    3. 引入数据库驱动包。

    二、创建实体类

          接下来我们创建一个实体类,用来对应数据库的student表。Student.java代码如下:

    package accp.hibernate;
    
    import java.util.Date;
    
    public class Student {
        private int id;
        private String name;
        private Date birthDay;
        //省略get,set方法……    
    }

          可以看到Student类中的属性都对应着student表中的字段,上面代码省略了get和set方法,要让hibernate操作该属性,必须要提供get和set方法(该段可以参考 hibernate_reference.pdf 第四章 持久化类(Persistent Classes))

    三、映射文件

          Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映射文件发挥作用的地方。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。

         映射文件放在和相应实体类同一包下。命名为 Student.hbm.xml。代码如下:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="accp.hibernate">
        <class name="Student" table="Student">
            <id name="id" column="id">
                <generator class="native"/>
            </id>
            
            <property name="name" type="java.lang.String" column="name"/>
            <property name="birthDay" type="java.util.Date" column="birthday"/>
        </class>
    </hibernate-mapping>

    元素简介:

    hibernate-mapping package属性:指需要被持久化的类所位于哪个包。
    class

    在 hibernate-mapping 标签(tag)之间, 含有一个 class 元素。所有的持久化实体类都需要一个这样的映射,来把类对象映射到SQL 数据库里的表。name属性:实体类名。table:对应的表名。

    id 对主键属性的声明。name:实体类中代表主键的字段名。column:表中的主键名。
    generator

    嵌套在 id 元素中的 generator 元素指定标识符的生成策略(也就是标识符值是怎么产生的)。在这个例子里,我们选择 native,它提供了取决于数据库方言的可移植性。(可参考hibernate_reference.pdf 第 28 章 数据库移植性考量,第4节. 标识符的生成)

    property

    需要持久化属性的声明。默认情况下,类里面的属性都被视为非持久化的。和 id 元素一样,property 元素的 name 和 column 属性告诉 Hibernate 实体类属性和表字段的对应关系。

    (该段可以参考 hibernate_reference.pdf 第五章 对象/关系数据库映射基础(Basic O/RMapping))

    四、Hibernate 配置

         此时,你应该有了持久化类和它的映射文件。现在是配置 Hibernate 的时候了。在项目的src目录下创建 hibernate.cfg.xml 文件,代码如下:

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <!-- 数据库连接 -->
            <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <property name="connection.username">news</property>
            <property name="connection.password">news</property>
            <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
            <!-- Enable Hibernate's automatic session context management -->
            <property name="current_session_context_class">thread</property>
            <!-- Disable the second-level cache -->
            <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
            <!-- JDBC connection pool (use the built-in) -->
            <property name="connection.pool_size">1</property>
            <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">update</property>
            <!-- 显示sql语句 -->
            <property name="show_sql">true</property>
            <!-- 引入映射文件 -->
            <mapping resource="accp/hibernate/Student.hbm.xml" />
        </session-factory>
    </hibernate-configuration>
    <property name="connection.driver_class"> 所使用的JDBC驱动类全称
    <property name="connection.url"> 数据库连接字库串
    <property name="connection.username"> 数据库的用户名
    <property name="connection.password"> 数据库的密码
    <property name="dialect"> Hibernate SQL 方言。可参考下面 Hibernate SQL 方言表
    <mapping> resource属性指定映射文件的路径

    Hibernate SQL 方言表(部分)

    DB2 org.hibernate.dialect.DB2Dialect
    DB2 AS/400 org.hibernate.dialect.DB2400Dialect
    MySQL5 org.hibernate.dialect.MySQL5Dialect
    MySQL5 with InnoDB org.hibernate.dialect.MySQL5InnoDBDialect
    Oracle 9i org.hibernate.dialect.Oracle9iDialect
    Oracle 10g org.hibernate.dialect.Oracle10gDialect
    Sybase org.hibernate.dialect.SybaseASE15Dialect
    Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect
    Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect

    (本段可以参考 hibernate_reference.pdf 第三章 配置)

    五、编写测试类

         编写Test.java类,实现使用hibernate往数据库内插入一条数库。代码如下:

     1 package accp.hibernate;
     2 
     3 import java.util.Date;
     4 
     5 import org.hibernate.Session;
     6 import org.hibernate.SessionFactory;
     7 import org.hibernate.Transaction;
     8 import org.hibernate.cfg.Configuration;
     9 
    10 public class Test {
    11     public static void main(String[] args) {
    12         //创建实体对象
    13         Student s = new Student();
    14         s.setName("张三");
    15         s.setBirthDay(new Date());
    16         //得到session
    17         Configuration cfg = new Configuration().configure();
    18         SessionFactory sf = cfg.buildSessionFactory();
    19         Session session = sf.openSession();
    20         //开始事务
    21         Transaction transaction = session.beginTransaction();
    22         session.save(s);        //插入数据
    23         transaction.commit();   //事务提交
    24         session.close();
    25     }
    26 }

           其中第17-19行得到session的代码是hibernate3的写法,在hibernate4中也能正常运行,但会报方法已过时的警告。解决方法,把17-19行的代码换成下面的代码:

    Configuration cfg = new Configuration().configure();
    ServiceRegistry  sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); 
    SessionFactory sf = cfg.buildSessionFactory(sr);
    Session session = sf.openSession();

         程序运行后可以看到控制台打印出如下SQL语句:

    Hibernate: select hibernate_sequence.nextval from dual
    Hibernate: insert into Student (name, birthday, id) values (?, ?, ?)

         这是由hibernate自动生成,可以看到hibernate还自动生成了一个名为hibernate_sequence的序列,用来作为自增长的主键。sql语句发出的同时数据库也增加了相应的数据。

  • 相关阅读:
    455. Assign Cookies(分饼干)(leetcode)
    栈的压入、弹出序列 (剑指offer)
    第五届蓝桥杯c/c++B组1
    第六届蓝桥杯试题c/c++B组8
    第六届蓝桥杯试题c/c++B组7
    第六届蓝桥杯试题c/c++B组6
    第六届蓝桥杯试题c/c++B组5
    第六届蓝桥杯试题c/c++B组4
    第六届蓝桥杯试题c/c++B组3
    第六届蓝桥杯试题c/c++B组2
  • 原文地址:https://www.cnblogs.com/likailan/p/3368030.html
Copyright © 2020-2023  润新知