Hibernate学习0.Hibernate入门

Hibernate是什么

面向java环境的对象/关系数据库映射工具。

1.开源的持久层框架.

2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据模型之间的映射.

3.连接java应用和数据库的中间件.

4.对JDBC进行封装,负责java对象的持久化.

5.在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑

Hibernate作用

Hibernate是Java应用和关系数据库之间的桥梁,它负责Java对象和关系数据之间的映射。

Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API。

ORM简介

对象-关系映射(ORM,即Object-Relation Mapping).

指单个组件中负责所有实体域对象的持久化,封装数据访问细节。

对象-关系映射的概念


面向对象概念


面向关系概念




对象


表的行(记录)


属性


表的列(字段)

ORM中间件的使用方法

采用元数据来描述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对象-关系映射文件中。只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参照映射文件的信息,把域对象持久化到数据库中。

public void deleteCustomer(Customer c){
      Session session = getSession();
      session.delete(c);
}

执行步骤如下:

1.运用反射机制,获得Customer对象的Customer.class类。

2.参照映射文件得到Customer类对应的表的信息,以及和Customer类关联的类以及相应的表信息。

3.根据以上信息生成SQL语句。

4.调用JDBC  API,执行该语句。

Hibernate软件包

要使用Hibernate,需要得到Hibernate的jar包和相应的一些第三方包。在使用Hibernate时,需要用到的是Hibernate.jar和lib目录下的一些第三方jar包。

  • hibernate3.jar: 包含Hibernate3的基础框架和核心API类库,是必须使用的jar包。
  • cglib-2.1.2.jar: CGLIB库,Hibernate用它来实现PO字节码的动态生成,它是非常核心的库,是必须使用的jar包。
  • dom4j-1.6.1.jar: dom4j是一个Java的XML API,类似于jdom,用来读写XML文件。
  • commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。
  • commons-logging.jar: Apache Commons包中的一个,包含了日至功能,必须使用的jar包。
  • ant-1.6.5.jar: Ant编译工具的jar包,用来编译Hibernate源代码的。它是可选包。
  • c3po-0.9.0.jar: C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO的连接池,如果准备用这个连接池,就需要这个jar包。
  • connector.jar: JCA(Java Cryptography Architecture,Java加密架构,java平台中用于访问和开发加密功能的框架)规范,如果在App Server上把Hibernate配置为Connector,就需要这个jar。一般App Server都会带上这个包。
  • jaas.jar: JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以它的实际上是多余的包。
  • jdbc2_0-stdext.jar: JDBC2.0的扩展包,一般来说数据库连接池会用上它,不过App Server都会带上它,所以也是多余的。
  • jta.jar: JTA(java事务处理的机制)规范,当Hibernate使用JTA的时候需要,不过App Server都会带上它,所以也是多余的。
  • junit-3.8.1.jar: Junit包,当运行Hibernate自带的测试代码的时候需要,否则就不用。
  • xerces-2.6.2.jar和xml-apis.jar:Xerces是XML解析器,xml-apis实际上是JAXP。也是多余的包。

Hibernate API简介

1.提供访问数据库操作(session,transaction,query)

2.配置hibernate接口(configuratioin)

3.回调接口(Interceptor,Lifecycle,Validatable)

4.用于扩展的功能接口(UserType,CompositeUserType, IdentifierGenerator)

Hibernate对JDBC做了轻量级的封装。所谓轻量级是指Hibernate并没有完全封装JDBC,java应用既可以通过HibernateAPI来访问数据库,还可直接通过JDBC API访问数据库。

Hibernate核心接口

1.Configuration

配置hibernate,根启动hibernate,创建sessionFactory对象。

2 .sessionFactory

负责创建Session对象,可以通过Configuration对象创建SessionFactory对象。

SessionFactory 对象中保存了当前的数据库配置信息和所有映射关 系以及       预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。

SessionFactory对象的创建会有较大的开销,而且SessionFactory对象采取了线程安全的设计方式,因此在实际中SessionFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个SessionFactory实例

Configuration config = new Configuration().configure();

SessionFactory factory = config.buildSessionFactory();

3.Session

使用最广泛,也被称为持久化管理器,它提供和持久化相关的操作。增、删、改、查等。不是线程安全的,因此,一个Session对象只可以由一个线程使用。避免多个线程共享。轻量级的,创建和销毁不需要消耗太多资源。Session中有一个缓存,称为一级缓存。存放当前工作单元加载的对象。

Configuration config = new Configuration().configure();

SessionFactory factory = config.buildSessionFactory();

Session session = factory.openSession();

4.Transaction hibernate数据库事务接口

将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。

使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)

Transaction tx = session.beginTransaction();

5.Query和Criteria接口

都是查询接口,query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。Criteria接口完全封装了基于字符串形式的查询语句,比query接口更面向对象,他擅长执行动态查询。sessoin接口的find方法也具有数据查询功能,但他只是执行一些简单的hql查询语句的快捷方式,远没有query接口功能强大。

回调接口

1.Lifecycle和Validatable接口:lifecycle接口能使持久化类响应被加载、保存和删除事件。Validatable接口使持久化类的接口被保存之前进行数据验证。这种方式强迫持久化类实现特定接口,使hibernate API渗透到持久化类中,会影响可移植性,不值得推荐。

2.Interceptor:不必由持久化类来实现。可定义专门实现该接口的类,负责响应持久化类的实例被加载、保存、更新或删除的事件。

Hibernate映射类型接口

1.PrivateType类:映射java基本数据类型,包括ByteType、ShortType、IntegerType、LongType、FloatType、DoubleType、CharactorType、BooleanType。

2.DateType:映射java日期类型。

3.BinaryType:映射Byte[]类型。

Query.setParameter(“name”,”name”,Hibernate.STRING)

可供扩展的接口

hibernate提供的多数功能是可配置的,允许用户选择适当的内置策略。如可配置如下数据库方言:

hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect

hibernate.dialect=net.sf.hibernate.dialect.OracleDialect

hibernate.dialect=net.sf.hibernate.dialect.SybaseDialect

如果hibernate内置的策略不能满足需求时,允许用户自定义实现接口或扩展特定的类。Hibernate的扩展点包括:

主键生成策略:IdentifierGenerator

sql方言:Dialect抽象类

缓存机制:cache和cacheprovider接口

jdbc连接管理器:connectionprovider等

Hibernate运行过程

Hibernate的运行过程如下:

1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,

2、并用这些信息生成一个SessionFactory对象,

3、然后从SessionFactory对象生成一个Session对象,

4、并用Session对象生成Transaction对象;

A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;

B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。

小结

时间: 2024-08-06 20:05:26

Hibernate学习0.Hibernate入门的相关文章

Hibernate学习之Hibernate流程

Hibernate的核心组件 在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作.除配置文件,映射文件和持久化类外,Hibernate的核心组件包括以下几部分:a)Config

Hibernate学习之——Hibernate环境搭建

之前在写关于安卓闹钟的教程,写了一半就没后一半了,其实自己也没做好,在校外实习,校内毕业实习又有任务,只能先放放了,等毕业实习结束之后,在继续安卓闹钟开发之旅,相信这个时间不会很久的.现在毕业实习用到的SSH框架(Struts+Spring+Hibernate),自己没有多少时间去好好学习,但是还是想把学到的东西记录下来. 一.Hibernate简介 1.什么是Hibernate? Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBatis,Nhib

Hibernate学习8—Hibernate 映射关系(多对多)

第二节:Hibernate 多对多映射关系实现 比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系: 1,多对多单向实现: 单向关系: 这里通过学生可以获取这个学生选修的课程: 但是通过课程无法获取选修这门课程的学生: Student.java: package com.cy.model; import java.util.HashSet; import java.util.Set; public class Student { privat

Hibernate学习8—Hibernate 映射关系

第一节:Hibernate 一对一映射关系实现 假设一个用户对应一个地址: 1)按照主键映射: User.java: package com.cy.model; public class User { private int id; private String name; private Address address; public int getId() { return id; } public void setId(int id) { this.id = id; } public St

Hibernate学习11——Hibernate 高级配置

第一节:配置数据库连接池 这里配置c3p0连接池,需要的jar包: jar包位于hibernate压缩包的:hibernate-release-4.3.5.Final\lib\optional\c3p0 文档中介绍了两种配置方式: 1)在hibernate.properties中配置: 2)在hibernate.cfg.xml中配置: <hibernate-configuration> <session-factory> <!--数据库连接设置 --> <prop

Hibernate学习10——Hibernate 查询方式

本章主要是以查询Student的例子: Student.java: package com.cy.model; public class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name;

Hibernate学习之hibernate执行顺序

Hibernate 执行的顺序如下:  (1) 生成一个事务的对象,并标记当前的 Session 处于事务状态(注:此时并未启动数据库级事务).  (2) 应用使用 s.save 保存对象,这个时候 Session 将这个对象放入 entityEntries ,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作, Session 还要在 insertions 中登记应用的这个插入行为(行为包括:对象引用.对象 id . Session .持久化处理类).  (3) s.evic

Hibernate学习5—Hibernate操作对象

第一节:Hibernate 中四种对象状态 删除状态:处于删除状态的Java 对象被称为删除对象.比如说session delete一个对象,这个对象就不处于session缓存中了, 已经从session的缓存中移出来了,只要提交事务的话,对应的数据库记录也会被删除. 游离状态:比如说session被关闭了,这里面的对象就变为游离状态了,游离状态和删除状态中的对象,如果不用的话,会被垃圾收集器回收. 几种状态之间的转化: 例子: public class StudentTest { public

Hibernate学习5—Hibernate操作对象2

第二节:Session 常用方法讲解 2)load和get()方法: 数据库中不存在与OID 对应的记录,Load()方法会抛出异常: load方法默认采用延迟加载,load出来的对象是一个代理类.开始并没有值,只有用到它的属性等的时候,才会去发出sql语句. 而get方法一开始就发出sql语句. 如果说获取一个对象是为了删除它,可以用load,因为只要获取个引用就行了. 如果说获取一个对象是为了访问它的属性,建议用get: @Test public void testLoadClass() {