Hello Hibernate

Hibernate

一个框架; 一个 Java 领域的持久化框架; 一个 ORM 框架

ORM(Object/Relation Mapping): 对象/关系映射

  –ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。

  –ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.

流行的ORM框架

•Hibernate:

  –非常优秀、成熟的 ORM 框架。

  –完成对象的持久化操作

  –Hibernate 允许开发者采用面向对象的方式来操作关系数据库。

  –消除那些针对特定数据库厂商的 SQL 代码

•myBatis:

  –相比 Hibernate 灵活高,运行速度快

  –开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能

•TopLink

•OJB

Hibernate开发步骤

1. 创建 Hibernate 配置文件

 1         <!-- 配置连接数据库的基本信息 -->
 2         <property name="connection.username">root</property>
 3         <property name="connection.password">1230</property>
 4         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 5         <property name="connection.url">jdbc:mysql:///hibernate5</property>
 6
 7         <!-- 配置 hibernate 的基本信息 -->
 8         <!-- hibernate 所使用的数据库方言 -->
 9         <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
10
11         <!-- 执行操作时是否在控制台打印 SQL -->
12         <property name="show_sql">true</property>
13
14         <!-- 是否对 SQL 进行格式化 -->
15         <property name="format_sql">true</property>
16
17         <!-- 指定自动生成数据表的策略 -->
18         <property name="hbm2ddl.auto">update</property>
19
20         <!-- 指定关联的 .hbm.xml 文件 -->
21         <mapping resource="com/atguigu/hibernate/helloworld/News.hbm.xml"/>

常用配置信息

2. 创建持久化类

3. 创建对象-关系映射文件

4. 通过 Hibernate API 编写访问数据库的代码

 1     public void test() {
 2         //1. 创建一个 SessionFactory 对象
 3         SessionFactory sessionFactory = null;
 4
 5         //1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息
 6         Configuration configuration = new Configuration().configure();
 7
 8         //4.0 之前这样创建
 9 //        sessionFactory = configuration.buildSessionFactory();
10
11         //2). 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象
12         //hibernate 的任何配置和服务都需要在该对象中注册后才能有效.
13         ServiceRegistry serviceRegistry =
14                 new ServiceRegistryBuilder().applySettings(configuration.getProperties())
15                                             .buildServiceRegistry();
16
17         //3).
18         sessionFactory = configuration.buildSessionFactory(serviceRegistry);
19
20         //2. 创建一个 Session 对象
21         Session session = sessionFactory.openSession();
22
23         //3. 开启事务
24         Transaction transaction = session.beginTransaction();
25
26         //4. 执行保存操作
27         News news = new News("Java12345", "ATGUIGU", new Date(new java.util.Date().getTime()));
28         session.save(news);
29
30         //5. 提交事务
31         transaction.commit();
32
33         //6. 关闭 Session
34         session.close();
35
36         //7. 关闭 SessionFactory 对象
37         sessionFactory.close();
38     }

测试代码

Configuration 类

•Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:

  –Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。

  –持久化类与数据表的映射关系(*.hbm.xml 文件)

•创建 Configuration 的两种方式

  –属性文件(hibernate.properties):

    •Configuration cfg = new Configuration();

  –Xml文件(hibernate.cfg.xml)

    •Configuration cfg = new Configuration().configure();

  –Configuration 的 configure 方法还支持带参数的访问:

    •File file = new File(“simpleit.xml”);

    •Configuration cfg = new Configuration().configure(file);

SessionFactory 接口

  •针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。

  •SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息

  •SessionFactory是生成Session的工厂

  •构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。

  •Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry  注册后才能生效

Session 接口

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

•Session 类的方法:

  –取得持久化对象的方法: get() load()

  –持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()

  –开启事务: beginTransaction().

  –管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等

Hibernate 配置文件的两个配置项

•hbm2ddl.auto:该属性可帮助程序员实现正向工程, 即由 java 代码生成数据库脚本, 进而生成具体的表结构. 。取值 create | update | create-drop | validate

  –create : 会根据 .hbm.xml  文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变

  –create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除

  –update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml  文件和数据库中对应的数据表的表结构不同, Hiberante  将更新数据表结构,但不会删除已有的行和列

  –validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常

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

时间: 2024-08-11 12:53:33

Hello Hibernate的相关文章

Hibernate - HHH000352: Unable to release batch statement

这是hibernate的一个bug,具体看https://hibernate.atlassian.net/browse/HHH-11732?attachmentViewMode=list When using stateless session with jdbc batch size we get an HHH000352: Unable to release batch statement.. error in session.close() after rollback: Code:Con

Hibernate简述及入门实例

一.Hibernate简述 总的概括,Hibernate是一个ORM的轻量级持久层框架,解决了对象和关系数据库中表的不匹配问题(阻抗不匹配)以及拥有开发代码不用去继承hibernate类或接口的优势(无侵入性).hibernate框架实现使得开发人员可以避免反复地编写javajdbc部分代码,应用面向对象的思维操作关系型数据库. 二.使用myeclipse创建hibernate实例两种方法(以hibernate3.5.2及mysql为例) a)手动编写hibernate.cfg.xml及*.hb

对象序列化和反序列--Hibernate的查询和新增极其相似

Hibernate几个关键字持久化,ORM(关系对象映射)(数据库中关系称作是一张表) 应用在项目中,刘一从写的查询代码,每次都挂掉,想要弄出测试数据,自己想着把查询出来的复杂数据弄到文件里自己要是去造那些复杂数据很麻烦public class Object1 { public static void main(String args[]){ HashMap<String, Object> obj=new HashMap<String,Object>(); obj.put(&quo

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

mybatis与hibernate的区别

本文转载自:http://blog.csdn.net/wangpeng047/article/details/17038659 以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql

hibernate载入持久化对象的两种方式——get、load

一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高.下边具体说一下get和load的不同,有些时候为了对照也会把find加进来. 1.从返回结果上对照: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索运行机制上对照: get方法和fin

org.hibernate.NonUniqueObjectException:a different object with the same identifier value was alread

转自: http://blog.csdn.net/zzzz3621/article/details/9776539 看异常提示意思已经很明显了,是说主键不唯一,在事务的最后执行SQL时,session缓存里面有多个(>1)主键一样的对象. 了解过hibernate的都知道它有一个一级缓存,即session级别的缓存,在一个事务的执行过程中可以管理持久化对象,在事务最后执行SQL,可以减少数据库的操作. 报这个异常就得仔细看看你的代码,一定有地方引用的对象已经不同了. 下面就是一个典型的例子: [

谈谈你对Hibernate的理解

答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化. 2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息.从Java程序的运行功能上来讲,保存对

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存