2023年6月21日发(作者:)
Hibernate简介
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
对象-关系数据库映射Object/Relation Mapping
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。
除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R
Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。你用O/R
Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。 一、目前流行的 ORM 产品
目前众多厂商和开源社区都提供了持久层框架的实现,常见的有:
Apache OJB (/ojb/)
Cayenne (/cayenne/)
Jaxor ()
Hibernate ()
iBatis ()
jRelationalFramework ()
mirage (/en/oss/mirage/toon)
SMYLE (/smyle)
TopLink (/products/ias/toplink/)
其中 TopLink 是 Oracle 的商业产品,其他均为开源项目。
其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准,这也是开源项目影响工业领域标准的有力见证。
2.基本配置
1.拷贝lib包到项目中
下载
2.创建表对应的实体和配置文件
创建person类
package entity;
public class Person {
private String id;
private String name;
private String pass;
public String getId() {
return id;
}
public void setId(String id) {
= id;
}
public String getName() { return name;
}
public void setName(String name) {
= name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
= pass;
}
}
创建
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"/">
3.创建hibernate的配置文件
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"/">
//根据不同的数据库,生成不同的SQL语句
//实体类与表之间的对应关系,有false ,create,
4.在类中调用Configuration对象来操作数据库
package main;
import n;
import nFactory;
import ction;
import uration;
import ;
public class SavePerson {
public static void main(String[] args) {
//1.初始化配置文件
Configuration configuration = new Configuration().configure();
//2.建立session工厂
SessionFactory sessionFactory = essionFactory();
//3.从工厂中取得一个连接
Session session = ssion();
//4.开启事务
Transaction tx = ransaction();
Person person = new Person();
e("刘畅");
s("12345");
( person );
//5.提交事务
();
//6.关闭连接
();
}
}
3.字段类型
Java数据类型
byte、
short、
int、r
long、
标准SQL数据类型
Hibernate数据类(PS:对于不同的DB可能有型
所差异)
byte TINYINT
short SMALLINT
integer INGEGER
long BIGINT float、 float
double、 double
imal big_decimal
char、ter character
boolean、n boolean
string
boolean、n yes_no
boolean、n true_false
、 date
、 time
、timestamp
amp
ar calendar
ar calendar_date
byte[] binary
text
izable serializable
clob
blob
class
locale
ne timezone
cy currency
FLOAT
DOUBLE
NUMERIC
CHAR(1)
BIT
VARCHAR
CHAR(1)('Y'或'N')
CHAR(1)('Y'或'N')
DATE
TIME
TIMESTAMP
TIMESTAMP
DATE
VARBINARY、BLOB
CLOB
VARBINARY、BLOB
CLOB
BLOB
VARCHAR
VARCHAR
VARCHAR
VARCHAR
4.主键生成器
主键生成策略是指
1、 native int
对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)
2、assigned
在插入数据的时候主键由用户自己添加,hibernate也不管(很常用)
3、increment int
插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法 4、sequence int
调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:
NAME_SEQ(Oracle中很常用)
5、identity int
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)
6、hilo
使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)
我们也可以自己设置自定义的表名和字段名
7、sehilo
通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence
的数据库,如 Oracle(比较少用)
8、 string
hibernate会算出一个128位的唯一值插入
9、 string
hibernate会算出一个16位的值插入
10、foreign
使用外部表的字段作为主键
11、select
使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)
5.方言
RDBMS
DB2
DB2 AS/400
DB2 OS390
方言
2Dialect
2400Dialect
2390Dialect RDBMS
PostgreSQL
MySQL
方言
eSQLDialect
ialect
MySQL with InnoDB nnoDBDialect
MySQL with MyISAM yISAMDialect
Oracle (any version)
Oracle 9i/10g
Sybase
Sybase Anywhere
SAP DB
Informix
HypersonicSQL
Ingres
Progress
Mckoi SQL
Interbase
Pointbase
FrontBase
Firebird
Dialect
9Dialect
Dialect
AnywhereDialect
ialect
ixDialect
alect
Dialect
ssDialect
ialect
aseDialect
aseDialect
aseDialect
rdDialect
Microsoft SQL Server verDialect
6.核心接口
核心接口简介
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。
Session接口:
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
SessionFactory接口:
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Configuration接口:
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
Transaction接口:
Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
·Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
2023年6月21日发(作者:)
Hibernate简介
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
对象-关系数据库映射Object/Relation Mapping
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。
除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R
Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。你用O/R
Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。 一、目前流行的 ORM 产品
目前众多厂商和开源社区都提供了持久层框架的实现,常见的有:
Apache OJB (/ojb/)
Cayenne (/cayenne/)
Jaxor ()
Hibernate ()
iBatis ()
jRelationalFramework ()
mirage (/en/oss/mirage/toon)
SMYLE (/smyle)
TopLink (/products/ias/toplink/)
其中 TopLink 是 Oracle 的商业产品,其他均为开源项目。
其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准,这也是开源项目影响工业领域标准的有力见证。
2.基本配置
1.拷贝lib包到项目中
下载
2.创建表对应的实体和配置文件
创建person类
package entity;
public class Person {
private String id;
private String name;
private String pass;
public String getId() {
return id;
}
public void setId(String id) {
= id;
}
public String getName() { return name;
}
public void setName(String name) {
= name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
= pass;
}
}
创建
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"/">
3.创建hibernate的配置文件
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"/">
//根据不同的数据库,生成不同的SQL语句
//实体类与表之间的对应关系,有false ,create,
4.在类中调用Configuration对象来操作数据库
package main;
import n;
import nFactory;
import ction;
import uration;
import ;
public class SavePerson {
public static void main(String[] args) {
//1.初始化配置文件
Configuration configuration = new Configuration().configure();
//2.建立session工厂
SessionFactory sessionFactory = essionFactory();
//3.从工厂中取得一个连接
Session session = ssion();
//4.开启事务
Transaction tx = ransaction();
Person person = new Person();
e("刘畅");
s("12345");
( person );
//5.提交事务
();
//6.关闭连接
();
}
}
3.字段类型
Java数据类型
byte、
short、
int、r
long、
标准SQL数据类型
Hibernate数据类(PS:对于不同的DB可能有型
所差异)
byte TINYINT
short SMALLINT
integer INGEGER
long BIGINT float、 float
double、 double
imal big_decimal
char、ter character
boolean、n boolean
string
boolean、n yes_no
boolean、n true_false
、 date
、 time
、timestamp
amp
ar calendar
ar calendar_date
byte[] binary
text
izable serializable
clob
blob
class
locale
ne timezone
cy currency
FLOAT
DOUBLE
NUMERIC
CHAR(1)
BIT
VARCHAR
CHAR(1)('Y'或'N')
CHAR(1)('Y'或'N')
DATE
TIME
TIMESTAMP
TIMESTAMP
DATE
VARBINARY、BLOB
CLOB
VARBINARY、BLOB
CLOB
BLOB
VARCHAR
VARCHAR
VARCHAR
VARCHAR
4.主键生成器
主键生成策略是指
1、 native int
对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)
2、assigned
在插入数据的时候主键由用户自己添加,hibernate也不管(很常用)
3、increment int
插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法 4、sequence int
调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:
NAME_SEQ(Oracle中很常用)
5、identity int
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)
6、hilo
使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)
我们也可以自己设置自定义的表名和字段名
7、sehilo
通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence
的数据库,如 Oracle(比较少用)
8、 string
hibernate会算出一个128位的唯一值插入
9、 string
hibernate会算出一个16位的值插入
10、foreign
使用外部表的字段作为主键
11、select
使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)
5.方言
RDBMS
DB2
DB2 AS/400
DB2 OS390
方言
2Dialect
2400Dialect
2390Dialect RDBMS
PostgreSQL
MySQL
方言
eSQLDialect
ialect
MySQL with InnoDB nnoDBDialect
MySQL with MyISAM yISAMDialect
Oracle (any version)
Oracle 9i/10g
Sybase
Sybase Anywhere
SAP DB
Informix
HypersonicSQL
Ingres
Progress
Mckoi SQL
Interbase
Pointbase
FrontBase
Firebird
Dialect
9Dialect
Dialect
AnywhereDialect
ialect
ixDialect
alect
Dialect
ssDialect
ialect
aseDialect
aseDialect
aseDialect
rdDialect
Microsoft SQL Server verDialect
6.核心接口
核心接口简介
Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。
Session接口:
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
SessionFactory接口:
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Configuration接口:
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
Transaction接口:
Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
·Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。
发布评论