说说Hibernate

当你在实战项目中需要用到SSH时, 如果你之前只用过Mybatis那自然是不能解决问题的, 因为在很多银行类金融类项目中你可能会使用到Hibernate, 那么关于Hibernate你应该要了解什么呢, 本篇文章就以学习Hibernate框架为目的, 巩固在工作中可能需要用到的这种ORM技术, 同时也欢迎家人们探讨交流和指正。

概述

Hibernate是一种Java语言下的对象关系映射(ORM)解决方案。它为面向对象领域模型到传统的关系型数据库的映射, 提供了使用方便的持久化框架

它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始, 开发人员都可以采用Hibernate。

Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射), 还提供了面向对象的数据查询检索机制, 从而极大地缩短了手动处理SQLJDBC上的开发时间。

前面已经提到了Hibernate是一种Java语言下的ORM解决方案, 所以我们要对ORM有一定了解, 再往前走就是JDBC, 所以我们就要先理解JDBC, 那么JDBC是什么呢?

什么是JDBC?

JDBC代表Java Database Connectivity, 它是提供了一组Java API来访问关系型数据的Java程序, 这些Java API可以使Java程序执行SQL语句, 能够与任何符合规范的SQL数据库进行交互。JDBC提供了一个灵活的框架来编写操作数据库的独立的应用程序, 该应用程序能够运行在不同的平台上且不需要修改, 能够与不同的DBMS进行交互。

JDBC的优点和缺点

JDBC的优点

JDBC的缺点

干净整洁的SQL处理

大项目中使用很复杂

大数据下有良好的性能

很大的编程成本

对于小应用非常好

没有封装

易学的简易语法

难以实现MVC的概念

查询需要指定DBMS

为什么是ORM(对象关系映射)?

当我们工作在一个面向对象的系统中时, 存在一个对象模型和关系数据库不匹配的问题。

RDMS用表格的形式存储数据, 然而像Java或者C#这样的面向对象的语言他表示一个对象关联图。考虑下面的带有构造方法和公有方法的Java类:

public class Employee{
    private int id;
    private String first_name;
    private String last_name;
    private int salary;

    public Employee(){}
    public Employee(String fname, String lname, int salary){
        this.first_name = fname;
        this.last_name = lname;
        this.salary = salary;
    }
    public int getId(){
        return id;
    }
    public String getFirstName(){
        return first_name;
    }
    public String getLastName(){
        return last_name;
    }
    public int getSalary(){
        return salary;
    }
}

现考虑以上的对象需要被存储和索引进下面的RDBMS表格中:

create table EMPLOYEE(
    id INT NOT NULL auto_increment,
    first_name VARCHAR(20) default
NULL,
    last_name VARCHAR(20) default
NULL,
    salary int default NULL,
    PRIMARY KEY(id)
);

第一个问题, 如果我们开发了几页代码或应用程序后, 需要修改数据库的设计怎么办?

第二个问题, 再关系型数据库中加载和存储对象时我们要面临一下5个不匹配的问题。

不匹配

描述

粒度

有时你会有一个对象模型, 该模型类的数量比数据库中关联的表的数量更多

继承

RDBMS不会定义任何在面向对象编程语言中本来就有的继承

身份

RDBMS明确定义一个'sameness'的概念: 主键。然而, Java同时定义了对象判等(a==b)和对象值判等(a.equals(b))

关联

面向对象的编程语言使用对象引用来表示关联, 而一个RDBMS使用外键来表示对象关联

导航

在Java中和在RDBMS中访问对象的方式完全不相同

ORM(Object-Relational Mapping)是以上所有不匹配问题的解决方案。

什么是ORM?

ORM表示Object-Relational Mapping, 是一个方便在关系型数据库和类似于Java, C#等面向对象的编程语言中转换数据的技术。一个ORM系统相比于普通的JDBC有以下的优点:

  1. 使用业务代码访问对象而不是数据库中的表

  1. 从面向对象逻辑中隐藏SQL查询的细节

  1. 基于JDBC的'under the hood'

  1. 没有必要去处理数据库实现

  1. 实体是基于业务的概念而不是数据库的结构

  1. 事务管理和键的自动生成

  1. 应用程序的快速开发

一个ORM解决方案由以下四个实体组成:

  1. 一个API来在持久类的对象上实现基本的CRUD操作

  1. 一个语言或API来指定引用类和属性的查询

  1. 一个可配置的服务用来指定映射元数据

  1. 一个技术和事务对象交互来执行dirty checking, lazy association fetching和其他优化的功能

Java ORM框架

在Java中有几个持久化的框架和ORM选项。一个持久化的框架是ORM存储和索引对象到关系型数据库的服务。

Enterprise JavaBeans Entity Beans

Java Data Objects

Castor

TopLink

Spring DAO

Hibernate

And many more

Hibernate简介

Hibernate是由Gavin King于2001年创建的开放源代码的对象关系型框架。它强大且高效的构建具有关系对象持久性和查询服务的Java应用程序。

Hibernate将Java类映射到SQL数据类型中, 并把开发人员从95%的公共数据持久性编程工作中解放出来。

Hibernate是传统Java对象和数据库服务器之间的桥梁, 用来处理基于O/M映射机制和模式的那些对象。

Hibernate优势

  1. Hibernate使用XML文件来处理映射Java类别到数据库表格中, 并且不用编写任何代码。

  1. 为在数据库中直接储存和检索Java对象提供简单的API。

  1. 如果在数据库中或任何其他表格中出现变化, 那么仅需要改变XML文件属性。

  1. 抽象不熟悉的SQL类型, 并为我们提供工作中所熟悉的Java对象。

  1. Hibernate不需要应用程序服务器来操作。

  1. 操控你数据库中对象复杂的关联。

  1. 最小化与访问数据库的智能提取策略。

  1. 提供简单的数据询问。

支持的数据库

Hibernate支持几乎所有的主要RDBMS。以下是一些由Hibernate所支持的数据库引擎:

HSQL Database Engine

DB2/NT

MySQL

PostgreSQL

FrontBase

Oracle

Microsoft SQL Server Database

Sybase SQL Server

Informix Dynamic Server

支持的技术

XDoclet Spring

J2EE

Eclipse plug-ins

Maven

Hibernate架构

架构

Hibernate架构是分层的, 作为数据访问层, 你不必知道底层API。Hibernate利用数据库以及配置数据来为应用程序提供持续性服务

下面是一个非常高水平的Hibernate应用程序架构视图:

下面是一个详细的Hibernate应用程序体系结构视图以及一些重要的类:

Hibernate使用不同的现存Java API, 比如JDBC, Java事务API(JTA), 以及Java命名和目录界面(JNDI)。JDBC提供了一个基本的抽象级别的通用关系型数据库的功能, Hibernate支持几乎所有带有JDBC驱动的数据库。JNDI和JTA允许Hibernate与J2EE应用程序服务器相集成。

下面的部分简要地描述了在Hibernate应用程序架构所涉及地每一个类对象。

配置对象

篇日志对象是你在任何Hibernate应用程序中创造的第一个Hibernate对象, 并且经常只在应用程序初始化期间创造。它代表了Hibernate所需一个配置或属性文件。配置对象提供了两种基础组件。

数据库连接: 由Hibernate支持的一个或多个配置文件处理, 这些文件是hibernate.properties和hibernate.cfg.xml。

类映射设置: 这个组件创造了Java类和数据库表格之间的联系。

SessionFactory对象

配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。

SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

Session对象

一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。

Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。

Transaction对象

一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。

这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。

Query对象

Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。

Criteria对象

Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

Hibernate环境

为了给Hibernate应用准备需要地开发环境, 该怎样安装Hibernate应用和一些其他相关的包。这里会用MySQL数据库来对一些Hibernate应用的例子进行试验。

下载Hibernate

首先要在想要把Hibernate应用安装在Windows系统或是Unix系统这两者之间做出选择, 之后进行到下一步骤去下载与Windows系统对应的.zip文件或是与Unix系统对应的.tz文件。

之后到http://www.hibernate.org/downloads这个网址来下载最新版本的Hibernate应用。

这里下载的是hibernate-distribution-3.6.4.Final这个版本的应用, 在这个版本的应用下当我们解压下载的文件时会显示以下的目录结构:

安装Hibernate

一旦你下载好并解压了Hibernate应用最新版本的安装文件, 你需要执行以下两个简单的步骤。

一定要确保你把你的CLASSPATH变量设置合理, 否则当你编译你的应用时可能会遇到问题。

首先把从/lib复制来的所有库文件拷贝到CLASSPATH里, 并且改变你的CLASSPATH变量来涵盖所有的JAR。

最后复制hibernate3.jar这个文件到CLASSPATH里。这个文件位于安装文件的根目录里, 它是Hibernate应用针对的主要JAR。

Hibernate的前提

以下是一个Hibernate应用需要的有关包/库的表格, 在安装Hibernate应用之前你需要先安装它们, 为了安装这些包你必须把来自/lib的库文件拷贝到CLASSPATH, 并按以下说明相应地改变CLASSPATH变量。

S.N.

包/库

1

dom4j - XML 解析 www.dom4j.org/

2

Xalan - XSLT 处理器 http://xml.apache.org/xalan-j/

3

Xerces - The Xerces Java 解析器 http://xml.apache.org/xerces-j/

4

cglib -Java 类生成库 http://cglib.sourceforge.net/

5

log4j - 日志控制 http://logging.apache.org/log4j

6

Commons - 日志,邮件等 http://jakarta.apache.org/commons

7

SLF4J - 简单日志门面 http://www.slf4j.org

Hibernate配置

配置

Hibernate 需要事先知道在哪里找到映射信息,这些映射信息定义了 Java 类怎样关联到数据库表。Hibernate 也需要一套相关数据库和其它相关参数的配置设置。所有这些信息通常是作为一个标准的 Java 属性文件提供的,名叫 hibernate.properties。又或者是作为 XML 文件提供的,名叫 hibernate.cfg.xml

我们将考虑 hibernate.cfg.xml 这个 XML 格式文件,来决定在我的例子里指定需要的 Hibernate 应用属性。这个 XML 文件中大多数的属性是不需要修改的。这个文件保存在应用程序的类路径的根目录里。

Hibernate属性

下面是一个重要的属性列表, 你可能需要表中的属性来在单独的情况下配置数据库。

S.N.

属性和描述

1

hibernate.dialect

这个属性使 Hibernate 应用为被选择的数据库生成适当的 SQL。

2

hibernate.connection.driver_class

JDBC 驱动程序类。

3

hibernate.connection.url

数据库实例的 JDBC URL。

4

hibernate.connection.username

数据库用户名。

5

hibernate.connection.password

数据库密码。

6

hibernate.connection.pool_size

限制在 Hibernate 应用数据库连接池中连接的数量。

7

hibernate.connection.autocommit

允许在 JDBC 连接中使用自动提交模式。

如果您正在使用JNDI和数据库应用程序服务器然后您必须配置以下属性:

S.N.

属性和描述

1

hibernate.connection.datasource

在应用程序服务器环境中您正在使用的应用程序 JNDI 名。

2

hibernate.jndi.class

JNDI 的 InitialContext 类。

3

hibernate.jndi.<JNDIpropertyname>

在 JNDI的 InitialContext 类中通过任何你想要的 Java 命名和目录接口属性。

4

hibernate.jndi.url

为 JNDI 提供 URL。

5

hibernate.connection.username

数据库用户名。

6

hibernate.connection.password

数据库密码。

Hibernate和MySQL数据库

MySQL数据库是目前可用的开源数据库系统中最受欢迎的数据库之一。

我们要创建hibernate.cfg.xml配置文件并将其放置在应用程序的CLASSPATH的根目录里。你要确保在你的MySQL数据库中testdb数据库是可用的, 而且你要有一个用户test可用来访问数据库。

XML配置文件一定要遵守Hibernate 3 Configuration DTD, 在 http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd这个网址中是可以找到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿码德乌斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值