一、Hibernate的概述
1.1 Hibernate框架的介绍
-
什么是框架?
所谓框架,就是封装好了一些功能,我们需要使用这些功能时,调用即可,不需要再手动的实现
-
Hibernate框架是什么?
Hibernate是一个开放源代码的ORM(Object Relation Mapping,对象关系映射)框架,它对JDBC进行了轻量级的对象封装。使得Java开发人员可以使用面向对象的编程思想来操作数据库。
类似于C#中的Entity FrameWork
简单理解,就是帮我们操作数据库的框架
操作数据库:JDBC---->DBUtils---->Hibernate
-
使用Hibernate的好处?
操作数据库的时候,可以面向对象的方式来完成,不需要书写SQL语句
-
Hibernate框架是一个ORM框架
所谓的ORM就是利用描述对象和数据库表之间映射的元数据,自动把java应用程序中的对象,持久化到关系型数据库的表中。通过操作java对象,就可以完成对数据库表的操作。可以把ORM理解为关系型数据和对象的一个纽带,开发人员只需要关注纽带一端的映射对象即可。
1.2 Hibernate框架的搭建
Hibernate框架的搭建步骤:
-
下载Hibernate5开发包,导入需要的jar包
-
创建数据库,准备表,实体
-
书写ORM元数据(对象与表的映射的配置文件)
-
导入约束
-
核心配置文件的xml建议放在src下,命名为hibernate.cfg.xml
-
映射文件的xml建议放在src/domain下,命名为类名.hbm.xml
-
-
实体
-
-
书写配置文件
-
书写代码测试
1.2.1 约束
-
导入的约束类型有两种:
-
一种是核心配置文件的约束文件
-
一种是映射文件的约束文件
-
-
约束类文件
约束类文件类型的后缀是.dtd的,dtd 是一套关于标记符的语法规则。它是XML1.0版规格得一部分,是XML文件的验证机制,属于XML文件组成的一部分。dtd 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和dtd文件来看文档是否符合规范,元素和标签使用是否正确。
一个dtd文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。XML文件提供应用程序一个数据交换的格式,dtd正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的dtd,各公司都能够依照dtd建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
-
导入约束的目的:
说的直白点就是为了检验编码者的代码是否合乎编写的规则;
1.2.2 导入约束的步骤
-
有网的情况下:
第一步:复制相应的约束版本和下载网址
操作顺序是:在项目中的:Referenced Libraries --> hibernate-core-5.0.7.Final.jar --> org.hibernate 文件下的如图所示的两个dtd文件(在此文件夹最下方)
hibernate-configuration-3.0.dtd是核心配置文件的约束文件,hibernate-mapping-3.0.dtd是映射文件的约束文件
第二步:将下面的两项复制粘贴到约束导入框内:(hibernate-configuration-3.0.dtd为例)
操作顺序是:eclipse ---> window ----> preferences -----> xml ----> xml Catalog
再添加网址
-
在无网的情况下
没有网的情况下也可以导入使用约束,导入的前提是你有相应的hibernate-mapping-3.0.dtd和hibernate-onfiguration-3.0.dtd这两个文件
第一步:复制相应的约束文件下载网址(hibernate-mapping-3.0.dtd为例)第二步:将复制的内容,添加到xml文件内
第三步:添加信息到约束导入框
前面的顺序相同,只是在导入dtd文件的方式不一样,如果dtd在项目中存在,选择WorkSpace,如果文件存在磁盘上,选择File System
1.2.3 创建实体(持久化类)
持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普通的java对象(Plain Old Java Object),即POJO的编程模式进行持久化。POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法访问,对外部隐藏内部的实现细节。
下面创建实体类Customer(对应数据库表cst_customer),Customer类包含与cst_customer数据表字段对应得属性,以及相应得get/set方法。
1.2.4 准备ORM元数据
映射文件内容配置:(已导入映射文件的约束)
Hibernate需要知道实体类Customer映射到数据库中的哪张表,以及类中的哪个属性对应数据库表中的哪个字段,这些是需要在映射文件中配置。
在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件内定义Customer的属性是如何映射到cst_customer表的列上的。
标签属性说明:
-
用来创建类和表的映射:
<class></class>
-
name属性:类中的全路径,包名可以放在
的Package属性内,可以减少路径的书写 -
table属性:表名(如果类名和表名是一致的,table属性可以省略)
-
catalog属性:数据库名称,可以省略
-
-
用来创建类中的属性与表中的主键字段对应:
<id></id>
-
name属性:类中的属性名
-
column属性:表中字段名(如果类中的属性名和表中的字段名一致,可以省略)
-
length属性:字段的长度
-
type属性:类型。写java数据类型,Hibernate数据类型(默认),SQL类型
-
-
用来设置主键策略:
<generator></generator>
-
用来创建类中的普通属性与表中字段对应:
<property></property>
-
name属性:类中的属性名
-
column属性:表中字段名(如果类中的属性名和表中的字段名一致,可以省略)
-
length属性:字段的长度
-
type属性:类型。写java数据类型,Hibernate数据类型(默认),SQL类型
-
核心文件内容配置:(已导入核心配置文件的约束)
Hibernate的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及Hibernate运行时所需要得各个属性得值。在src下创建下一个名为hibernate.cfg.xml(默认名称),发布后,会在项目的WEB-INF/classes路径下。
Hibernate的配置文件也可以是properties属性文件格式的配置文件,它使用键值对的形式存放信息,默认文件名称:hibernate.properties。
核心配置文件内,<session-factory></session-factory>
的作用是创建<session>
对象的,<session>
是hibernate中操作数据库的核心对象,<session-factory>
必须包含三部分内容:
-
第一部分:连接数据库的信息
-
第二部分:hibernate的可选配置
-
第三部分:映射文件的位置
连接数据库的信息可以在hibernate的开发包中找到,查找步骤:开发包----->project----->etc---->hibernate.properties中查找:
hibernate的可选配置也可以在hibernate.properties中找到,简单配置文件的作用:
-
是否显示hibernate生成的SQL语句
<property name="hibernate.show_sql">true</property>
-
是否格式化输出SQL语句到控制台
<property name="hibernate.format_sql">true</property>
-
配置hibernate采用何种方式生成DDL语句
<property name="hibernate.hbm2ddl.auto">update</property>
-
none:不用Hibernate自动生成表
-
create:每次都会创建一个新的表
-
create-drop:每个都会创建一个新的表,程序执行结束后删除这个表
-
update:如果数据库中有表,使用原来的表,如果没有表,创建一个新表,可以更新表结构
-
validate:只会使用原来的表。对映射关系进行校验
-
设置映射文件的位置,也可以在代码中设置
<mapping resource=""/>
1.2.5 测试
步骤分析:
-
解析主配置文件
-
根据配置文件创建SessionFactory
-
根据SessionFactory创建Session
-
开启事务
-
执行操作
-
提交事务
-
释放资源
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import domain.Customer;
public class HibernateDemo1 {
@Test
public void test1() {
//1. 解析主配置文件
Configuration cfg = new Configuration();
cfg.configure();
//2. 根据配置文件创建SessionFactory
SessionFactory factory = cfg.buildSessionFactory();
//3. 根据SessionFactory创建Session
Session session = factory.openSession();
//4. 开启事务
Transaction tx = session.beginTransaction();
//5. 执行操作
Customer cust = new Customer();
cust.setCustName("chenia");
session.save(cust);
//6. 提交事务
tx.commit();
//7. 释放资源
session.close();
factory.close();
}
}