• Hibernate4.x之入门篇


    Hibernate作为一个优秀的持久化框架、ORM框架。在日常的Java开发中常常用到。本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识。

    新建一个Java项目,并加入Hibernate要使用的jar包和数据库驱动包,

    1. 建立Hibernate的配置文件
    2. 新建持久化类
    3. 新建持久化类的配置文件
    4. 利用Hibernate API编写测试类

    完成后的项目结构大概如下图:

      

    Hibernate配置文件:hibernate.cfg.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6     <session-factory>
     7         <!-- 配置连接数据库的基本信息 -->
     8         <property name="connection.username">scott</property>
     9         <property name="connection.password">tiger</property>
    10         <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    11         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
    12     
    13         <!-- 配置hibernate基本信息 -->
    14         <!-- hibernate所使用的数据库方言 -->
    15         <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
    16         
    17         <!-- 执行操作时是否在控制台打印sql -->
    18         <property name="show_sql">true</property>
    19         
    20         <!-- 是否对SQL进行格式化 -->        
    21         <property name="format_sql">true</property>
    22         
    23         <!-- 指定自动生成数据表的策略 -->
    24         <property name="hbm2ddl.auto">update</property>
    25         
    26         <!-- 指定关联的.hbm.xml 文件 -->
    27         <mapping resource="com/yl/hibernate/helloworld/News.hbm.xml"/>
    28 
    29     </session-factory>
    30 </hibernate-configuration>

    持久化类:News.java

      

     1 package com.yl.hibernate.helloworld;
     2 
     3 import java.sql.Date;
     4 
     5 public class News {
     6     
     7     private Integer id;
     8     private String title;
     9     private String author;
    10     
    11     private Date newsdate;
    12 
    13     public Integer getId() {
    14         return id;
    15     }
    16 
    17     public void setId(Integer id) {
    18         this.id = id;
    19     }
    20 
    21     public String getTitle() {
    22         return title;
    23     }
    24 
    25     public void setTitle(String title) {
    26         this.title = title;
    27     }
    28 
    29     public String getAuthor() {
    30         return author;
    31     }
    32 
    33     public void setAuthor(String author) {
    34         this.author = author;
    35     }
    36 
    37     public Date getNewsdate() {
    38         return newsdate;
    39     }
    40 
    41     public void setNewsdate(Date newsdate) {
    42         this.newsdate = newsdate;
    43     }
    44 
    45     public News(){}
    46     
    47     public News(String title, String author, Date newsdate) {
    48         super();
    49         this.title = title;
    50         this.author = author;
    51         this.newsdate = newsdate;
    52     }
    53 
    54     @Override
    55     public String toString() {
    56         return "News [id=" + id + ", title=" + title + ", author=" + author
    57                 + ", date=" + newsdate + "]";
    58     }
    59     
    60     
    61     
    62 }

    持久化类的配置文件:News.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2014-11-19 21:19:05 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping>
     6     <class name="com.yl.hibernate.helloworld.News" table="NEWS">
     7         
     8         <id name="id" type="java.lang.Integer">
     9             <column name="ID" />
    10             <!-- 指定主键的生成方式,native:使用数据库本地方式 -->
    11             <generator class="native" />
    12         </id>
    13         <property name="title" type="java.lang.String">
    14             <column name="TITLE" />
    15         </property>
    16         <property name="author" type="java.lang.String">
    17             <column name="AUTHOR" />
    18         </property>
    19         <property name="newsdate" type="java.sql.Date">
    20             <column name="NEWSDATE" />
    21         </property>
    22     </class>
    23 </hibernate-mapping>

    测试类:HibernateTest.java

     1 package com.yl.hibernate.helloworld;
     2 
     3 import java.sql.Date;
     4 
     5 import org.hibernate.Session;
     6 import org.hibernate.SessionFactory;
     7 import org.hibernate.Transaction;
     8 import org.hibernate.cfg.Configuration;
     9 import org.hibernate.service.ServiceRegistry;
    10 import org.hibernate.service.ServiceRegistryBuilder;
    11 import org.junit.Test;
    12 
    13 public class HibernateTest {
    14 
    15     @Test
    16     public void test() {
    17         //1.创建一个SessionFactory对象
    18         SessionFactory sessionFactory = null;
    19         
    20         //1.1 创建Configuration对象,对应hibernate的基本配置信息和对象关联映射信息
    21         Configuration configuration = new Configuration().configure();
    22         //4.0之前的创建方式
    23         //sessionFactory = configuration.buildSessionFactory();
    24         
    25         //1.2  创建一个ServiceRegistry 对象:hibernate4.x新添加的对象。hibernate的任何配置和服务器都需要在该对象中注册后才能有效
    26         ServiceRegistry serviceRegistry = 
    27                 new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    28                                             .buildServiceRegistry();
    29         
    30         //1.3 创建SessionFactory对象
    31         sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    32         
    33         //2.创建一个Session对象
    34         Session session = sessionFactory.openSession();
    35         //3.开启事务
    36         Transaction transaction = session.beginTransaction();
    37         //4.执行保存操作
    38         News news = new News("Java", "yulei", new Date(new java.util.Date().getTime()));
    39         session.save(news);
    40         
    41         /*News news2 = (News) session.get(News.class, 2);
    42         System.out.println(news2);*/
    43         //5.提交事务
    44         transaction.commit();
    45         //6.关闭Session
    46         session.close();
    47         //7.关闭SessionFactory 对象
    48         sessionFactory.close();
    49         
    50     }
    51 
    52 }

    ----------------------------------------------------以上为代码部分--------------------------------------------------------------------------------------------

    ----------------------------------------------------以下为对部分代码的解释--------------------------------------------------------------------------------------------

    Configuratioin类
      Configuratioin类负责管理Hibernate的配置信息。包括以下内容:
        Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类、数据库Dialect、数据库连接池等(对应hibernate.cfg.xml)文件
        持久化类与数据库表的映射关系(*.hbm.xml文件)
      创建Configuration的两种方式:
        属性文件:Configuration cfg = new Configuration();
        XML文件:Configuration cfg = new Configuration().configuration();
      Configuration的configuration方法还支持带参数的访问:
        File file = new File("simple.xml");
        Configuration cfg = new Configuration().configuration(file);

    SessionFactory接口
      针对单个数据库映射关系经过编译后的内存映像,是线程安全的。
      SessionFactory对象一旦构建完毕,即被赋予特定的配置信息
      SessionFactory是生成Session的工厂
      构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象
      Hibernate4新增了一个ServiceRegistry接口,所有基于Hibernate的配置或服务都必须统一向这个ServiceRegistry注册后才能生效
      Hibernate4中创建SessionFactory的步骤:
        

     1 //1.1 创建Configuration对象,对应hibernate的基本配置信息和对象关联映射信息
     2 Configuration configuration = new Configuration().configure();
     3 
     4 //1.2 创建一个ServiceRegistry 对象:hibernate4.x新添加的对象。hibernate的任何配置和服务器都需要在该对象中注册后才能有效
     5 ServiceRegistry serviceRegistry = 
     6 new ServiceRegistryBuilder().applySettings(configuration.getProperties())
     7 .buildServiceRegistry();
     8 
     9 //1.3 创建SessionFactory对象
    10 sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    Session接口
      Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,显示执行flush之前,所有的持久层操作的数据都缓存在session对象处。相当于JDBC中的Connection。
      持久化类与Session关联起来后就具有了持久化的能力
      

      Session类的方法:
        取得持久化对象的方法:get()、load()
        持久化对象的保存、更新和删除:save()、update()、saveOrUpdate()、delete()
        开启事务:beiginTransaction()
        管理Session的方法:isOpend()、flush()、clear()、evict()、close()等

    Transaction(事务)
      代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
      Transaction tx = session.beginTransaction();
      常用方法:
        commit():提交相关联的session实例
        rollback():撤销事务操作
        wasCommitted():检查事务是否提交

    Hibernate配置文件的两个配置项
      hbm2ddl.auto:该属性可帮助程序员实现正向工程,即由Java代码生成数据库脚本,进而生成具体的表结构。取值create|update|create-drop|validate
        create:会根据.hbm.xml文件来生成数据库表,但是每次运行都会删除上一次的表,重新生成表,哪怕二次没有任何改变
        create-drop:会根据.hbm.xml文件生成表,但是SessionFactory一关闭,表就自动删除
        update:最常用的属性值,也会根据.hbm.xml文件来生成数据库表,但若.hbm.xml文件和数据库中对应的表的表结构不同,Hibernate将更新数据表结构,但不会删除已有的行和列
        validate:会和数据库中的表进行比较,若.hbm.xml文件中的列在数据表中不存在,则抛出异常
      

      format_sql:是否将SQL转化为格式良好的SQL。取值为true|false

  • 相关阅读:
    [前端插件]Bootstrap Table服务器分页与在线编辑应用总结
    Accord.NET_Naive Bayes Classifier
    Accord.NET入门
    [C++]STL容器Vector的内存释放
    [设计模式]适配器模式与外观模式
    [设计模式]工厂模式
    Linux下spi驱动开发
    Qt移植对USB鼠标键盘、触摸屏的支持
    linux设备模型详解 http://blog.csdn.net/linux_xiaomugua/article/details/6989386
    LGPL协议的理解
  • 原文地址:https://www.cnblogs.com/dreamfree/p/4109432.html
Copyright © 2020-2023  润新知