热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hibernate教程(一)Hibernate简介

Hibernate简介Hibernate是一个Java对象映射关系的解决方案的ORM(Object-RelationalMapping)框架,是一个开源持久框架,由GavinKin

Hibernate简介

  • Hibernate是一个Java对象映射关系的解决方案的ORM(Object-Relational Mapping)框架,是一个开源持久框架,由Gavin King于2001年创建。为Java应用提供强大的、高性能对象持久化和查询服务。

  • Hibernate将Java类映射到数据库表,将Java数据类型映射到SQL数据类型,减轻了开发人员95%的数据持久性相关的编程任务。

  • Hibernate位于传统的Java对象和数据库服务器之间,基于适当的O/R机制和模式来处理持久化这些对象的所有工作。

《Hibernate教程(一)---Hibernate简介》 Hibernate-position

Hibernate的优势

  • Hibernate通过XML配置文件将Java类映射到数据库表,而不需要编写任何代码。
  • 提供简单的API,用于直接存储和检索数据库中的Java对象。
  • 如果数据库或任何表中有更改,只需要修改XML文件。
  • 提取我们不熟悉的SQL类型,并提供我们熟悉的Java对象。
  • Hibernate不需要应用府服务器来操作。
  • 操作复杂关联的数据库对象。
  • 使用智能抓取策略简化数据库操作。
  • 提供简单的数据查询。

Hibernate支持的数据库

Hibernate几乎支持所有的关系型数据库管理系统(RDBMS),支持的数据库如下所示:

  • HSQL Database Engine
  • DB2/NT
  • MySQL
  • PostgreSQL
  • FrontBase
  • Oracle
  • Microsoft SQL Server Database
  • Sybase SQL Server
  • nformix Dynamic Server

Hibernate架构

Hibernate架构是分层的,所以我们不需要知道底层的API,Hibernate利用数据库和配置数据向我们的应用程序提供持久性服务(和持久性对象)。

下图是Hibernate应用结构体系简要视图:

《Hibernate教程(一)---Hibernate简介》 Hibernate-hign-level

下图是Hibernate应用结构体系详细视图,包含了几个重要的核心类:

《Hibernate教程(一)---Hibernate简介》 Hibernate架构

  • Hibernate使用各种现有的Java API,如JDBC,JTA,JNDI

JDBC提供了关系数据库通用的功能抽象层,所有具有JDBC驱动程序的数据库都被Hibernate支持。
JTAJNDI允许Hibernate与J2EE服务器集成。

Hibernate应用结构体系主要类对象

Configuration Object

Configuration Object是我们在Hibernate应用程序中创建的第一个Hibernate对象,通常在应用程序初始化时且只创建一次。它是Hibernate所需要的配置和属性文件。Configuration对象提供两个关键组件:

  • Database Connection:通过Hibernate支持的一个或多个配置文件来处理。hibernate.properties,hibernate.cfg.xml
  • Class Mapping Setup:这个组件用于Java类和数据库表之间创建连接。

SessionFactory Object

Configuration Object用于创建一个SessionFactory Obejct,该对象使用提供的配置文件为应用程序配置Hibernate,并允许实例化一个Session对象。SessionFactory线程安全对象,供应用程序的所有线程使用。

SessionFactory是重量级对象。因此通常在应用程序启动期间创建并保留供以后使用。

每个数据库都需要使用一个单独的配置文件创建一个SessionFactory对象。如果使用多个数据库,则必须创建多个SessionFactory对象。

Session(会话) Object

Session(会话)用于获取与数据库的物理连接,Session对象是轻量级的,并且是每当需要与数据库进行交互时才会被实例化。持久化对象通过Session对象进行保存和检索。

Session对象不应该长时间保持打开,因为他们通常不是线程安全的,所以应该根据业务需求创建和销毁它们。

Transaction(事务) Object

事务Transaction代表与数据库的工作单元,大多数关系型数据库都支持事务功能。Hibernate中的事务由底层事务管理器和事务(来自JDBC和JTA)处理。

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

Query Object

查询Query对象使用SQL或者Hibernate查询语言(Hibernate Query Language,HQL)字符串从数据库检索数据并创建对象。Query实例用于绑定查询参数,限制查询返回的结果数量,最后执行查询。

Criteria Object

条件对象用于创建和执行面向对象的标准查询以检索对象。

Hibernate 环境配置

该章主要介绍如何安装Hibernate以及其它相关包来为Hibernate应用程序准备一个开发环境。本文将使用Mysql数据库来演示Hibernate实例。

Hibernate下载

  • 在windows上下载.zip文件,在Unix上下载.tz文件。
  • 从http://www.hibernate.org/downloads下载最新版的Hibernate。
  • 下载完成之后进行解压。

安装Hibernate

下载完Hibernate之后,只需要执行以下两个简单的步骤即可。请确保正确的配置了CLASSPATH环境变量,否则在编译应用程序时会出现问题。

Hibernate的依赖包

S.N.Packages/Libraries
1dom4j – XML parsing www.dom4j.org/
2Xalan – XSLT Processor http://xml.apache.org/xalan-j/
3Xerces – The Xerces Java Parser http://xml.apache.org/xerces-j/
4cglib – Appropriate changes to Java classes at runtime http://cglib.sourceforge.net/
5log4j – Logging Faremwork http://logging.apache.org/log4j
6Commons – Logging, Email etc. http://jakarta.apache.org/commons
7SLF4J – Logging Facade for Java http://www.slf4j.org

Hibernate配置

Hibernate需要提前知道在哪里可以找到定义的Java类和数据库表相关联的映射信息。Hibernate还需要一组与数据库和其它相关参数相关的配置设置。所有这些信息通常作为标准java属性文件hibernate.properties或者名为hibernate.cfg.xml的XML文件提供。

Hibernate属性

以下是在独立情况下为一个数据库配置所需要的重要属性列表:

S.N.Properties and Description
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.Properties and Description
1 hibernate.connection.datasource:在应用服务器中定义的JNDI名称
2 hibernate.jndi.class:JNDI的InitialContext类
3 hibernate.jndi.:
4 hibernate.jndi.url:提供JNDI的url
5 hibernate.connection.username:数据库用户名
6 hibernate.connection.password:数据库密码

Hibernate和Mysql数据库

MySQL是目前最流行的开源数据库系统之一,下面我们创建一个hibernate.cfg.xml配置文件,并将其放置于应用程序类路径的根目录下,必须确保已经安装MySQL 并保证已经保证创建了可用的测试数据库。
XML配置文件必须符合Hibernate 3 Configuration DTD,该文件可从http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd获得。


"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">



org.hibernate.dialect.MySQLDialect


com.mysql.jdbc.Driver



jdbc:mysql://localhost/test


root


root123





下表是各类数据库的属性类型(Dialect Property)列表:

DatabaseDialect Property
DB2org.hibernate.dialect.DB2Dialect
HSQLDBorg.hibernate.dialect.HSQLDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Informixorg.hibernate.dialect.InformixDialect
Ingresorg.hibernate.dialect.IngresDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Microsoft SQL Server 2000org.hibernate.dialect.SQLServerDialect
Microsoft SQL Server 2005org.hibernate.dialect.SQLServer2005Dialect
Microsoft SQL Server 2008org.hibernate.dialect.SQLServer2008Dialect
MySQLorg.hibernate.dialect.MySQLDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 11gorg.hibernate.dialect.Oracle10gDialect
Oracle 10gorg.hibernate.dialect.Oracle10gDialect
Oracle 9iorg.hibernate.dialect.Oracle9iDialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
Progressorg.hibernate.dialect.ProgressDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialect

Hibernate实例

创建POJO类

  • 首先,我们创建Java POJO类,这取决于将被持久化到数据库的应用程序,生成getXXX()setXXX()方法,使其成为JavaBeans兼容类。
  • POJO(java普通对象)是一种java对象,它不扩展或实现一些EJB框架分别需要的一些专门的类或接口。所有正常的Java对象都是POJO。
  • 当你设计一个要被Hibernate持久化的类时,提供符合JavaBeans的代码以及一个在Employee类中像id属性一样用作索引的属性很重要。

public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;
public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}

创建数据库表

第二步,我们需要在数据库中创建一张表,将表对应我们需要持久化的每一个对象,根据上面的java类我们创建下面这样一个表“

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)
);

创建配置映射文件

接下来我们需要创建一个配置文件,说明Hibernate如何将定义的类映射至数据库表。


"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">



This class contains the employee detail.









我们应该把映射文件保存为.hbm.xml格式的文件。上面文件保存为Employee.hbm.xml

  • 映射文件是一个XML格式的文档。作为包含所有元素的根元素。
  • 元素用于定义从java类到数据库表的特定映射。java类名称使用使用类元素的name属性指定,并且使用table属性指定数据库表名称。
  • 元素是可选元素,用于创建类描述。
  • 是将类中的唯一ID元素映射到数据库表的主键。id元素中的name属性引用类中的属性,cloumn属性引用数据库表中的列。type属性保存hibernate映射类型,此映射类型将从Java转换成SQL数据类型。
  • id元素中的属性用于自动生成主键值,设置class的属性值为native,让hibernate选择identitysequence,hilo算法来创建主键,这取决于底层数据库的能力。
  • 元素用于将Java类属性映射到数据库表中的列。元素的name属性引用类中的属性,cloumn属性引用数据库表中的列。type属性保存hibernate映射类型,此映射类型将从Java类型转换成SQL数据类型。

创建应用类(java class)

完成了以上步骤后,我们来创建一个应用文件来测试一下我们的配置。

import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class ManageEmployee {
private static SessionFactory factory;
public static void main(String[] args) {
try{
factory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
ManageEmployee ME = new ManageEmployee();
/* 添加一些employee对象到数据库表中*/
Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
Integer empID3 = ME.addEmployee("John", "Paul", 10000);
/* 列出所有employee对象 */
ME.listEmployees();
/* 修改 */
ME.updateEmployee(empID1, 5000);
/* 从数据库中删除 */
ME.deleteEmployee(empID2);
/* 列出所有对象s */
ME.listEmployees();
}
/* 向数据库中添加employee对象的方法 */
public Integer addEmployee(String fname, String lname, int salary){
Session session = factory.openSession();
Transaction tx = null;
Integer employeeID = null;
try{
tx = session.beginTransaction();
Employee employee = new Employee(fname, lname, salary);
employeeID = (Integer) session.save(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
return employeeID;
}
/* 列出所有employee对象的方法 */
public void listEmployees( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
List employees = session.createQuery("FROM Employee").list();
for (Iterator iterator =
employees.iterator(); iterator.hasNext();){
Employee employee = (Employee) iterator.next();
System.out.print("First Name: " + employee.getFirstName());
System.out.print(" Last Name: " + employee.getLastName());
System.out.println(" Salary: " + employee.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* 修改employee对象的方法 */
public void updateEmployee(Integer EmployeeID, int salary ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
employee.setSalary( salary );
session.update(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
/* 删除employee对象的方法 */
public void deleteEmployee(Integer EmployeeID){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Employee employee =
(Employee)session.get(Employee.class, EmployeeID);
session.delete(employee);
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
}

编译和执行

编译和执行的步骤(请确保正确配置了环境变量):

  • 创建hibernate.cfg.xml配置文件。
  • 创建Employee.hbm.xml映射文件。
  • 创建Employee.java文件,并编译它。
  • 创建如上所示的ManageEmployee.java文件,并执行编译。
  • 执行ManageEmployee.class文件,运行程序。

推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 福克斯新闻数据库配置失误导致1300万条敏感记录泄露
    由于数据库配置错误,福克斯新闻暴露了一个58GB的未受保护数据库,其中包含约1300万条网络内容管理记录。任何互联网用户都可以访问这些数据,引发了严重的安全风险。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 华为智慧屏:超越屏幕尺寸的智能进化
    继全球发布后,华为智慧屏于9月26日在上海正式亮相,推出65英寸和75英寸版本。该产品不仅在屏幕尺寸上有所突破,更在性能和智能化方面实现了显著提升。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 深入理解 .NET 中的中间件
    中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ... [详细]
  • 本文详细介绍了在XAMPP环境中如何修改Apache和MySQL的默认端口号,并确保WordPress能够正常访问。同时,提供了针对Go语言社区和Golang开发者的相关建议。 ... [详细]
author-avatar
奔三人2502933897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有