1、Hibernate框架设计原理
1)设计原理
Hibernate采用ORM思想对JDBC进行封装,Hibernate框架是ORM思想的一种实现,解决对象和数据库数据映射问题
Hibernate提供一系列API,允许我们直接访问实体对象,然后根据ORM映射关系,转换成SQL去执行,从而达到访问数据库的目的。
2)ORM思想
ORM(Object Relation Mapping)即对象关系映射,指的是Java对象和关系数据库之间的映射。
ORM思想,就是将对象与数据库进行相互转换的思想,不同的框架/技术实现ORM的手段不同,但更多的是采用配置+反射的方式实现。
2、Hibernate框架体系结构
1)主配置文件
Hibernate的主配置文件是一个XML文件,通常命名为 hibernate.cfg.xml ,此文件可以配置数据库连接参数、Hibernate框架参数、及映射关系文件
2)实体类
实体类是数据库表对应的Java类型,它是用于封装数据库记录的对象类型。
3)映射关系文件
映射关系文件指定实体类和数据库表的对应关系,即类中的属性和表中的字段之间的对应关系。
Hibernate使用XML文件来描述映射关系,文件通常命名为“实体类.hbm.xml”,存放在实体类相同的路径下。
3)底层API
Hibernate提供一系列的底层API,基于ORM思想对数据库进行访问,API主要是对映射关系文件的解析,根据解析出来的内容动态生成SQL语句,自动将属性和字段关系映射。
3、如何使用Hibernate
1)Hibernate常用的API
Configuration:负责加载主配置文件信息,同时加载映射关系文件信息
SessionFactory:负责创建Session对象
Session:数据库连接会话,负责执行增删改查操作
Transaction:负责事务控制
Query:负责执行特殊查询
2)Hibernate使用步骤
a.先导入Hibernate 的jar包,及数据库驱动包
b.引入Hibernate主配置文件hibernate.cfg.xml
c.创建实体类
d.创建映射关系文件(存放于实体类相同路径下,通常命名为“实体类.hbm.xml”)
e.使用Hibernate常用API执行增删改查操作
4、Hibernate映射类型
Hibernate提供6种映射类型,书写时全小写,对应转换如下:
映射类型 | Java类型 | 数据库类型 | |
整数 | byte | java.liang.Byte | number(m) |
short | java.lang.Short | number(m) | |
integer | java.lang.Integer | number(m) | |
long | java.lang.Long | number(m) | |
小数 | float | java.lang.Float | number(m,n) |
double | java.lang.Double | number(m,n) | |
字符串 | string | java.lang.String | varchar() |
日期(年月日) | date | java.util.Date或java.sql.Date | date |
时间(年月日时分秒) | time | java.sql.Timestamp | date |
布尔 | yes/no | boolean或java.lang.Boolean | char(1)('Y'or'N') |
true/false | boolean或java.lang.Boolean | char(1)('T'or'F') |
5、Hibernate主键生成方式
1)sequence:采用序列方式生成主键,适用于Oracle,其配置语法:
<generator class="sequence">
<param name="sequence">序列名</param>
</generator>
2)identity:采用数据库自增长机制生成主键,适用于数据库支持自动递增,其配置语法:
<generator class="increment"></generator>
注意:这种方式在并发量高时存在问题,可能会出现重复的主键。
3)assigned:是Hibernate不负责生成主键,需要开发者自己处理主键的生成,其配置语法:
<generator class="assigned"></generator>
4)uuid/hilo:采用uuid或hilo算法生成一个主键值,是一个不规则的长数字,其配置语法:
<generator class="uuid"></generator>
注意:这种方式生成的主键值可以保证不重复,但是没有规律,不能按主键值排序。
5)native:根据当前配置的数据库方案,自动选择sequenec或identity,其配置语法:
<generator class="native">
//注意:如果Oracle,需要制定序列名
<param name="sequence">序列名</param>
</generator>
6)increment:不是采用数据库自身的机制来生成主键,而是Hibernate提供的一种生成主键的方式,它会取当前表中主键的最大值,然后加1作为新的主键值,其配置语法:
<generator class="increment"></generator>
注意:这种方式在并发量高时存在问题,可能会出现重复的主键。