Hibernate详解

补充学习hibernate

一、概念

Hibernate是一个开源的、轻量级的ORM(对象关系映射)工具。ORM工具简化了数据创建、处理和访问,是将对象映射到数据库中存储的数据(表)的编程技术。

Hibernate详解_第1张图片
ORM工具内部使用JDBC API与数据库进行交互

PO(持久化对象,用于完成持久化操作)=POJO(持久化类,普通的传统的java对象)+持久化注解


二、优点

Hibernate框架有很多优点。它们分别如下:

开源和轻量级

快速性能: Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。

数据库独立查询: HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。

自动创建表: Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。

简化复杂连接: 在hibernate框架中可轻松获取多个表中的数据。

提供查询统计和数据库状态: Hibernate支持查询缓存,并提供有关查询和数据库状态的统计信息。


三、hibernate架构:

hibernate架构中有4层Java应用层,hibernate框架层,反手api层和数据库层。

体系结构要素:

1.会话工厂(SessionFactory):提供工厂方法获取Session的对象。

2.会话(Session):提供应用程序和存储在数据库中的数据之间的接口。接口提供插入,更新和删除对象的方法。 它还提供了事务,查询和标准的工厂方法。

3.事务(Transaction):可选项

4.连接提供者(ConnectionProvider):JDBC连接工厂。 它从DriverManager或DataSource抽象出来的应用程序。可选项。

5.事务工厂(TransactionFactory):可选项。


四、应用程序配置框架

创建一个java项目

为hibernate添加jar文件

创建持久类(一整个数据模型,类名是表名,有setter和getter方法)

创建持久类的映射文件(直接对持久类右键生成对应映射文件,xxx.hbm.xml)

创建配置文件(hibernate.cfg.xml:包含数据库所有内容,详解在下面)

创建检索或存储持久对象的类

运行应用程序



前阵子自学了hibernate  有点忘记了 写个博客顺便记录一下免得我很快忘了。

记操作不怎么记知识点。

这里是用eclipse 然后数据库用的mysql 不过我用navicat premium来管理数据库。

(navicat premium是一个很轻量级数据库管理工具,可以连接多种数据库Mysql啊 oracle啊 sqlserver都可以 之所以用它是因为觉得它启动快,在我只是需要查看数据库数据的情况下,挺方便的,好过去打开mysql。它在网上可以找到免费的破解版)

Hibernate详解_第2张图片
项目目录

其实都还不算项目 只是自己试着用hibernate连数据库进行简易的操作。

1.启动mysql服务 (我经常忘记这步导致最后数据库连接不上),

2.打开navicat premium连接mysql数据库

3.实体类是Address类和Students类

Address类:

Hibernate详解_第3张图片

Students类:

Hibernate详解_第4张图片

然后其实Students下面也都是写getter、setter方法了 ,记住要重写一个tostring方法,自动生成的那种,这主要是为了之后输出可以成功,否则数据库查找操作会报错。

为了比较有代表性,所以有一个Address属性,到时候关联hibernate要多一些操作,还有Blob类型的,尝试一下传图片类型的。

Hibernate详解_第5张图片

4.实体类创建完就直接对着那个包鼠标右键生成映射文件,注意后缀,选hbm.xml

Hibernate详解_第6张图片

下一步选择关联Students类

写映射文件(中间注释掉的是我一开始没写Address类,而写的String类的Address)

Hibernate详解_第7张图片

有点记不清了,但这里的代码记得是自动关联实体类的属性生成的,不用写。

也解释一下:

class name 类名,然后定义了生成的表名是student(一般与实体类名一致,也可以自己改)

然后下面就是映射类的各个属性。

此处的hibernate对象关系映射也可以不用,可以使用hibernate注解在实体类上标注。

5.接着对这个项目生成一个hibernate.cfg.xml,是hibernate的配置文件。

(是在src下而不是src的目录下)

注释有干货!!

Hibernate详解_第8张图片
基本上的配置就是这些,注释有干货!!!

6.写测试类。

同项目下建了另一个测试包和实体类包名一致,类名为StudentTest

使用JUnit测试 

@Before:初始化方法

@Test:测试方法

@After:释放资源


Hibernate详解_第9张图片
这两部分代码是不修改的,增删改查操作主要是在test方法中

一、插入数据:

Hibernate详解_第10张图片

在目录方法对应位置右键run as junit执行

Hibernate详解_第11张图片
进度条绿色的表示执行成功

看一下navicat中已经建了student表,并插入了数据

Hibernate详解_第12张图片
增加操作完成(此时没有插入图片)

这里尝试再添加一个图片流,

Hibernate详解_第13张图片
增加了输入流,图片是用blob定义

junit执行,成功,再看一下navicat

此时插入了图片

二、修改操作

注意此时要把hibernate配置中的hibernate.auto改成update否则会失败

然后增加修改的test方法:

Hibernate详解_第14张图片

junit执行一下,再查看navicat:

Hibernate详解_第15张图片
已经修改成功了

三、查找操作

同样是要把hibernate配置中的hibernate.auto改成update否则会失败

1.查找并在控制台输出整项的所有数据:(注意在所有实体类中一定要先重写toString方法)

执行,成功后看一下控制台,已经成功输出了。

Hibernate详解_第16张图片
前面的几行是执行的sql语句,后面就是输出结果

2.查找并输出图片:

Hibernate详解_第17张图片

注意此时要把hibernate配置中的hibernate.auto改成update否则会失败

junit执行,成功啦,然后就看到输出的图片就是我输入的图片(TT的照片hhh)

Hibernate详解_第18张图片

四、删除操作

同样是要把hibernate配置中的hibernate.auto改成update否则会失败

Hibernate详解_第19张图片
删除操作的代码

junit执行,然后查看navicat

发现已经是空表了


总结一下,hibernate进行单表操作的时候,session的一些操作:

session.save():保存数据(这主要是用在插入数据的时候)

session.update(): 更新数据(用于修改数据的时候)

session.delete():删除数据(用于删除数据的时候)

session.get():查询单个记录(用于查询、修改、删除的第一步取数据,调用后会立即向数据库发出sql语句,返回持久化对象,不存在则返回null)

session.load():查询单个记录(用于查询、修改、删除的第一步取数据,调用后返回一个代理对象,只保存了实体对象的id,直到使用对象的非主键属性才会发出sql语句,查询不存在,则抛出异常)


以上 是用hibernate进行简单数据库操作。

自学了hibernate注解 但这里不贴了

以后更多还是贴代码吧 关于hibernate的学习 这一部分还会再补充的。


五、hibernate映射

1、使用持久化注解:(主流)

@Entity:声明该类是一个hibernate的持久化类

@Table:指定该类的映射的表

@Id:用于指定该类的标识属性

@GeneratedValue:指定主键生成策略(strategy=GenerationType.IDENTITY 自动增长的生成策略)

2、使用JPA提供的XML配置描述文件(很少用)

3、使用Hibernate传统的XML了映射文件(.hbm.xml):少数用


六、Hibernate配置文件:

1、hibernate.properties:会提供属性,但是要自己手动添加持久化类,因此开发中少使用

2、hibernate.cfg.xml:常用 

 Configuration cfg=new Configuration().configure();

3、不使用配置文件


七、配置属性:

1、数据库相关配置:dirver_class、url、username、password

2、方言:决定数据库

org.hibernate.dialect.MySQLDialect

3、其他常用配置属性:

hibernate.show_sql:是否控制台输出sql语句

hibernate.format_sql:是否将SQL转成格式良好的sql

hibernate.connection.autocommit:是否自动提交

hibernate.hbm2ddl.auto:(1)create:每次都重新建表,会丢失前面插入的数据 (2)create-drop:每次显式关闭时,程序会自动drop刚刚创建的表 (3)update:会保留数据(常用)


八、对hibernate体系结构各对象解析:

SessionFactory:单个数据库映射关系经过编译后的内存镜像,是线程安全的,是生成session的工厂。依赖于ConnectionProvider。

Session:应用程序与持久存储层之间交互操作的一个单线程对象。所有持久化对象都必须在session管理下才可进行持久化操作。该对象生存期很短,它底层封装了JDBC连接,也是Transaction的工厂。,在显式执行flush之前,所有持久化操作的数据都在缓存中的session对象处。

持久化对象(POJO实例):可以是普通实例

事务(Transaction):代表一次原子操作,具有数据库事务的概念。一个session内可能包含多个transaction对象。

连接提供者(ConnectionProvider):是生成JDBC连接的工厂,通过抽象将应用程序与底层的DataSource或DriverManager隔离开,无须应用程序直接访问,仅在应用程序需要扩展时使用。

事务工厂(TransactionFactory):是生成Transaction对象实例的工厂,无需应用程序直接访问。负责对底层具体事务实现进行封装,将底层具体的事务抽象成hibernate事务。

你可能感兴趣的:(Hibernate详解)