Hibernate作为一个优秀的持久化框架、ORM框架。在日常的Java开发中常常用到。本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识。
新建一个Java项目,并加入Hibernate要使用的jar包和数据库驱动包,
完成后的项目结构大概如下图:
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