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

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

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

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

  

Hibernate配置文件:hibernate.cfg.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本信息 -->
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <!-- 配置hibernate基本信息 -->
<!-- hibernate所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- 执行操作时是否在控制台打印sql -->
<property name="show_sql">true</property> <!-- 是否对SQL进行格式化 -->
<property name="format_sql">true</property> <!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property> <!-- 指定关联的.hbm.xml 文件 -->
<mapping resource="com/yl/hibernate/helloworld/News.hbm.xml"/> </session-factory>
</hibernate-configuration>

持久化类:News.java

  

 package com.yl.hibernate.helloworld;

 import java.sql.Date;

 public class News {

     private Integer id;
private String title;
private String author; private Date newsdate; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public Date getNewsdate() {
return newsdate;
} public void setNewsdate(Date newsdate) {
this.newsdate = newsdate;
} public News(){} public News(String title, String author, Date newsdate) {
super();
this.title = title;
this.author = author;
this.newsdate = newsdate;
} @Override
public String toString() {
return "News [id=" + id + ", title=" + title + ", author=" + author
+ ", date=" + newsdate + "]";
} }

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

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

测试类:HibernateTest.java

 package com.yl.hibernate.helloworld;

 import java.sql.Date;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; public class HibernateTest { @Test
public void test() {
//1.创建一个SessionFactory对象
SessionFactory sessionFactory = null; //1.1 创建Configuration对象,对应hibernate的基本配置信息和对象关联映射信息
Configuration configuration = new Configuration().configure();
//4.0之前的创建方式
//sessionFactory = configuration.buildSessionFactory(); //1.2 创建一个ServiceRegistry 对象:hibernate4.x新添加的对象。hibernate的任何配置和服务器都需要在该对象中注册后才能有效
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry(); //1.3 创建SessionFactory对象
sessionFactory = configuration.buildSessionFactory(serviceRegistry); //2.创建一个Session对象
Session session = sessionFactory.openSession();
//3.开启事务
Transaction transaction = session.beginTransaction();
//4.执行保存操作
News news = new News("Java", "yulei", new Date(new java.util.Date().getTime()));
session.save(news); /*News news2 = (News) session.get(News.class, 2);
System.out.println(news2);*/
//5.提交事务
transaction.commit();
//6.关闭Session
session.close();
//7.关闭SessionFactory 对象
sessionFactory.close(); } }

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

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

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 创建Configuration对象,对应hibernate的基本配置信息和对象关联映射信息
Configuration configuration = new Configuration().configure(); //1.2 创建一个ServiceRegistry 对象:hibernate4.x新添加的对象。hibernate的任何配置和服务器都需要在该对象中注册后才能有效
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry(); //1.3 创建SessionFactory对象
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

Hibernate4.x之入门篇的更多相关文章

  1. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  2. spring boot(一):入门篇

    构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  3. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  4. 一个App完成入门篇(七)- 完成发现页面

    第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...

  5. [原创]Linq to xml增删改查Linq 入门篇:分分钟带你遨游Linq to xml的世界

    本文原始作者博客 http://www.cnblogs.com/toutou Linq 入门篇(一):分分钟带你遨游linq to xml的世界 本文原创来自博客园 请叫我头头哥的博客, 请尊重版权, ...

  6. 转:OSGi 入门篇:模块层

    OSGi 入门篇:模块层 1 什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现.但是这种实现与Java本身现有的一些模块化特性又有明显的不同. 本文 ...

  7. 转:OSGi 入门篇:生命周期层

    OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...

  8. 【three.js详解之一】入门篇

    [three.js详解之一]入门篇   开场白 webGL可以让我们在canvas上实现3D效果.而three.js是一款webGL框架,由于其易用性被广泛应用.如果你要学习webGL,抛弃那些复杂的 ...

  9. [Maven]Apache Maven 入门篇

    作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...

随机推荐

  1. Git之不明觉厉11-利其器source tree

    前面10篇文章都在用命令行,虽然装逼不错,但是我想说一句,平时我也是用source tree比较多点,命令行一般都是在source tree的图形按钮找不到在哪里,就直接用命令行.对于初次用git的同 ...

  2. 如何查看windows操作系统当前使用的字符集

    如何查看windows操作系统当前使用的字符集 Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页.如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量. 语法 ch ...

  3. 微信公众号jssdk使用的惨痛经历

    最近一直在做微信公众号开发,遇到个DT的问题: 大家都知道使用jssdk的时候开发人员必须在后台按照官方文档给定的规则生成签名,我前前个月就写好了这个测试demo页面,而且完全正常能用,像分享等这些功 ...

  4. Android模拟神器Genymotion eclipse插件安装问题出解决

    我之前一直是打开eclipse之前直接运行Genymotion模拟器就可以连接到adb了,非常方便,但最近突然想来装个eclipse的Genymotion插件玩玩,安装时居然出错了,于是不折腾好心里不 ...

  5. vs中使用过的扩展和好的nuget库

    扩展 ReAttach ReAttach gives you an easy way to ReAttaching your prior debug targets. ReAttach stores ...

  6. linux 命令 备忘

    openssl rand -base64 32 随机数 date | md5sum data 日期 cal 日历 man -f man sync 数据同步写入磁盘 shutdown reboot ha ...

  7. linux命令useradd添加用户详解

    1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s shell] [-c comment] [ ...

  8. 汇编之FS段寄存器

    FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移  说明 000  指向SEH链指针 004  线程堆栈顶部 008  线程堆栈底部 00C  SubSystemTib 010  FiberD ...

  9. 算法导论_ch2

    Ch2算法基础 whowhoha@outlook.com 2.1 插入排序 输入:n个数的一个序列〈a1,a2,…,an〉. 输出:输入序列的一个排列〈a′1,a′2,…,a′n〉,满足a′1≤a′2 ...

  10. Unity3D调用第三方SDK(之一)从eclipse到Unity3D 友盟

    原地址:http://www.360doc.com/content/14/0120/14/11670799_346638215.shtml 篇展示在Unity3D中调用友盟SDK的实现方法. 首先附上 ...