Hibernate开发基础

介绍

  1. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

  2. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

  3. 优势Hibernate开发基础

【回顾】使用JDBC访问数据库的步骤

  1. 加载JDBC驱动
    Class.forName(“数据库驱动类”);
  2. 实例化数据库连接驱动类,建立数据库连接,取得Connection对象
    Connection con = DriverManager.getConnection(url,userName,password);
  3. 建立Statement对象或PreparedStatement对象.
    Statement stat = con.prepareStatement(sql);
  4. 执行SQL语句
    stat.executeQuery();
  5. 访问结果记录集ResultSet对象
    resultset=pstmt.executeQuery();
  6. 依次将ResultSet,Statement,PreparedStatement,Connection对象关闭,释放所占用的资源。
    close

Hibernate开发基础

持久化

  1. 持久化完成的操作有①将对象保存到数据库中②将关系型数据库中的数据读取出来③封装成对象
  2. 大多数情况下特别是企业级开发应用时,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化而持久化的实现过程则大多通过各种关系型数据库来完成的
  3. 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
  4. 持久化是将程序数据在持久状态和瞬时状态间转换的机制。
    JDBC就是一种持久化机制。文件IO也是一种持久化机制。
  5. Hibernate开发基础

序列化

我们先跳开一下,看看另一个类似的有用概念:序列化也是一种对象服务,就是把内存中的对象序列化成流、或者把流反序列化成对象。需要实现2个接口:

  1. void Serialize(Stream stream,object o) 把对象序列化到流中
  2. object Deserialize(Stream stream) 把流反序列化成对象

序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、主机之间进行。我之所以在这里提到序列化,是因为我们可以利用序列化来辅助持久化,可以说凡是可以持久化的对象都可以序列化,因为序列化相对容易一些(也不是很容易),所以主流的软件基础设施,比如.net和java,已经把序列化的框架完成了。

持久化层

在分层结构中,DAO 层(数据访问层)也被称为持久化层
Hibernate开发基础
三层结构中各层主要完成的功能:

  1. 表示层:提供了与用户交互的接口。实现用户操作界面,展示用户需要的数据。
  2. 业务逻辑层:完成业务流程,处理表示层提交的数据请求,并将要保存的数据提交给数据库。
  3. 数据库层:存储需要持久化的业务数据。数据库独立于应用,它提供了系统状态的一种持久化表现形式。
  1. 在三层软件体系结构中,业务逻辑层除了负责业务逻辑以外,还要负责相关的数据库操作,为了使业务逻辑层的开发人员能真正专注于业务逻辑的开发而把数据访问从业务逻辑中分离开来,形成一个新的、单独的持久化层。增加了持久层以后,三层的软件体系结构就变成了四层。
    Hibernate开发基础

  2. 所谓“持久层”,也就是在系统逻辑层面上,专著于实现数据持久化的一个相对独立的领域(Domain),是把数据保存到可掉电式存储设备中。持久层是负责向(或者从)一个或者多个数据存储器中存储(或者获取)数据的一组类和组件。
    这个层必须包括一个业务领域实体的模型(即使只是一个元数据模型)。
    Hibernate开发基础

  3. 持久层的实现是和数据库紧密相连的。在Java领域内,访问数据库的通常做法是使用JDBC。JDBC使用灵活而且访问速度快,但JDBC不仅需要操作对象,还需要操作关系,并不是完全的面向对象编程。

  4. 近年来又涌现出了许多新的持久层框架,这些框架为持久层的实现提供了更多的选择。目前主流的持久层框架包括:Hibernate、iBatis,JDO等。这些框架都对JDBC进行了封装,使得业务逻辑的开发人员不再面对关系型操作,简化了持久层的开发。

如何进行对象-关系数据库的匹配【ORM思想】

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

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

XML可以用来解析成对象
Hibernate开发基础
ORM解决方案包含下面四个部分
– 在持久化对象上执行基本增、删、改、查操作的API
– 用于对持久化对象或属性查询的一种语言或者API
– 用于实体关系映射的工具
– 能够与事务对象交互、执行检查、延迟加载以及其他优化功能

ORM基本映射

  1. 数据表映射类:持久化类被映射到一个数据表。程序使用这个持久化类创建实例、修改属性、删除实例时,系统自动会转换为对这个表进行CRUD操作
    Hibernate开发基础
  2. 数据表的行映射对象(实例):持久化类会生成很多实例,每个实例就对应数据表中的一行记录。当程序在应用中修改持久化类的某个实例时,ORM工具将会转换成对对应表中特定行的操作。
    Hibernate开发基础
    1. 数据表的列(字段)映射对象的属性:当程序修改某个持久化对象的指定属性时(持久化实例映射到数据行),ORM将会转换成对对应数据表中指定数据行、指定列的操作Hibernate开发基础

编写程序

  1. 编写实体类entity(持久化类)文件,创建配置对象–关系映射文件
    注解或者xml文件
    Hibernate与JPA的关系非常密切,因此Hibernate基本上直接使用了JPA的标准注解。在hibernate-jpa-2.1-api-1.0.0.Final.jar文件就是JPA规范的JAR包
  2. 创建Hibernate配置文件hibernate.cfg.cml——【hibernate maping——hbm, Configuation——cfg
    Hibernate配置文件的默认文件名为hibernate.cfg.xml,当程序调用Configuration对象的configure()时,Hibernate将自动加载该文件
  3. 使用Hibernate API编写访问数据库的业务逻辑代码
  4. Hibernate开发基础
    (1)配置好hibernate的配置文件和与类对应的配置文件后,启动服务器。
    (2)服务器通过实例化Configeration对象,读取cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系。
    (3)通过实例化的Configeration对象创建一个sessionFactory实例。
    (4)通过sessionFactory实例可以创建session对象。
    (5)得到session之后,便可以开始一个事务,然后就可以通过Session接口提供的各种方法操纵对数据库的访问。除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的session内置方法来实现。
    (6)操作完成后,提交数据库操作结果,关闭Session连接。

Hibernate体系结构

 处于Session管理下的POJO才有持久化操作的能力;同时Hibernate需要一个hibernate.properties或者cfg.xml文件,该文件用于配置Hibernate和数据库的连接信息

SessionFactory: Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,是生成Session的工厂,该对象可以在进程或集群的级别上,为事务之间可以重用的数据提供可选的二级缓存

Session: 应用程序和持久层之间交互操作的一个单线程对象。它也是持久化操作的关键对象,所有持久化对象必须在Session管理下才可以进行持久化操作。对象生存期短,也是Transaction的工厂。Session持有必选的一级缓存,在显示执行flush之前,所有持久化的数据都在缓存中的Session对象处
持久化对象: 系统创建的POJO实例,一旦与特定的Session关联,并对应数据表的指定记录,则该对象就处于持久化状态,这些对象都被称为持久化对象。持久化对象与普通的JavaBean的唯一区别是它们正与一个Session关联

瞬态对象和脱管对象: 通过new关键字创建的Java对象,没有与Session相关联,此时为瞬态;瞬态对象可能是被应用程序实例化后,尚未进行持久化的对象。如果一个曾经持久化过的实例,如果Session被关闭则转换为脱管状态。

事务(Transaction): 代表一次原子操作,它具有数据库事务的概念。在某些情况下,一个Session之内可能包含多个Transaction对象。虽然事务操作是可选的,但所有持久化操作都应该在事务管理下进行

事务工厂(TransactionFactory): 生成Transaction对象实例的工厂。同样无须应用程序直接访问。它负责对底层具体的事务实现进行封装,将底层具体的事务抽象成Hibernate事务

 ConnectionProvider: 连接提供者,生成JDBC连接的工厂,通过抽象将应用程序与底层的DataSource或DirverManager隔离开。这个对象无须应用程序直接访问,仅在应用程序需要扩展时使用

Hibernate配置

Configuration对象

  1. org.cfg.Configuration实例代表一个应用程序到SQL数据库的映射配置,Configuration提供了一个buildSessionFactory()方法,该方法可以产生一个不可变的SessionFactory对象。
  2. Configuration对象的唯一作用是创建SessionFactory对象,所以一旦SessionFactory创建完成,它就被丢弃了
  3. 每个 Hibernate 配置文件对应一个 Configuration 对象。
  4. Hibernate的基本配置文件有两种形式:hibernate.cfg.xml和hibernate.properties。
    Hibernate开发基础
    Hibernate开发基础
    hibernate.properties文件配置
hibernate.dialect org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.username root
hibernate.connection.password 123
hibernate.connection.url jdbc\:mysql\://localhost\:3306/exam7_02?useUnicode\=true&characterEncoding\=UTF-8
hibernate.hbm2ddl.update=true
show_sql=true

配置Hibernate方法
6. 使用cfg.xml文件作为配置文件。【xmlConfig】
Configuration cfg = new Configuration().configure();
使用hibernate.cfg.xml配置文件时,因为文件中已经添加了Hibernate持久化类,所以无须在程序中添加持久化类
7. 不使用任何的配置文件,以编码方式来创建Configuration对象。 【noConfig】
File file = new File(“simpleit.xml”);
Configuration cfg = new Configuration().configure(file);

其他的相关方法
8. Configuration addAnnotatedClass(Class annotatedClass):用于为Configuration对象添加一个持久化类
9. Configuration addPackage(String packageName):用于为Configuration对象添加指定包下的所有持久化类
10. Configuration setProperties(Properties properties):用于为Configuration对象设置一系列属性
11. Configuration setProperty(String propertyName,String value):用于为Configuration对象设置一个单独的属性

Hibernate开发基础

hibernate.cfg.xml的常用属性

1. jdbc连接

– connection.driver_class:设置连接数据库驱动。
– connection.url:设置所连接数据库服务的URL。
– connection.username:连接数据库的用户名。
– connection.password:连接数据库的密码。
– connection.pool_size:设置hibernate数据库连接池的最大并发连接数。
dialect:设置数据库连接所使用的方言。数据库方言就是告诉Hibrenate应用程序的底层即将使用哪种数据库
Hibernate开发基础

Hibernate.properties

  1. hibernate.properties配置文件是Hibernate框架的另外一种配置数据库参数的形式,文件使用“#”为注释,去掉“#”就可以使用里面的设置,该文件给出了配置数据库的方法和对常用数据库的配置。