简介
Hiberante简介
hibernate是一个ORM数据持久层框架。其主要功能就是简化了java对数据库的操作。使整个数据库操作是面向对象的
开发效率很高。 底层就是jdbc来实现。
什么是ORM?
Object Relation Mapping 对象-关系-映射
临时状态的数据:不能长期保留,new的对象 在内存中保存的数据
持久状态的数据:可以长期保留的数据,本地文件或存在数据库中的数据
持久层(数据访问层)将数据与数据库交互》CRUD
工作原理
1.加载核心配置文件 hibernate.cfg.xml(名字固定)
Configuration conf = new COnfiguration().configure(); 默认读取根目录下的hibernate.cfg.xml.
2.创建session工厂 一个项目只有一个 类似application
SessionFactory sf = conf.buildSessionFactory();
3.创建session 操作数据库的核心对象
4.开启事务 hibernate对于数据库的所有操作都是在内存中完成的
Transaction tx = session.beginTransaction();
5.执行持久化操作
6.提交事务
tx.commit();
简单应用
1、添加依赖
<!--hibernate 核心包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.1.Final</version>
</dependency>
<!--hibernate缓存-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.4.1.Final</version>
</dependency>
2、添加hibernate核心配置文件
3、在reources中添加配置文件
4、编写配置文件,5个必写属性,其中dialect表示数据库的方言,表示使用的为什么数据库。
<!--连接数据库的基本信息-->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.username">sc1911</property>
<property name="connection.password">admin</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
5、通过数据库表反向生成实体类
在生成实体类的同时会自动生成映射配置文件,若mapper中table等属性值报红,用alter + 回车 ,添加DataSource,选择你的数据库。
6、测试
注意:
当实体类属性与数据库列名不同时:
在resource创建对应映射文件如:test.hbm.xml
约束为
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
添加mapper映射
延迟加载
session.get(类型,id) 立即加载
session.load(类型,id)延迟加载 提高效率
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常;
get方法检索不到的话会返回null;
持久化操作(注意,凡是对于数据库的操作,只有事务提交的时候才发送sql语句)
针对一条数据
查询方式
- 单条数据
get load - 多条数据
方法1(利用hql)针对于对象的查询,参数为对象的属性:
参数命名方式1:
利用query的list()方法可以将结果封装到集合
参数命名方式2:
该方法可以自动传参
方法2通过hibernate实现sql语句(针对于表的查询,参数为表的列名)
hibernate中对象的3种状态
在更新操作时发现无论是否使用session.update()进行更新都会发送sql语句
这是由于hibernate的持久状态数据。
hibernate对象有两种产生方式,一种是new出来的 一种是查出来的
三种状态
1、瞬时状态:对象刚刚创建,没有session操作,session缓存中不存在,数据库中也不存在。
2、游离状态:是持久状态的数据调用session中的close、clear、evict(清空缓存中的对象,参数为需要清空的对象)。这些删除了一级缓存session的方法,数据就变为游离态。
3、持久状态:当调用save(),saveOrUpdate()方法将数据存入数据库了,这个数据就是持久状态(数据库存在,session缓存存在)。若对象是持久状态的数据,对该对象修改时,数据库的数据也会修改,因为只要是持久状态,数据库就一定有一条数据与之一一对应,一方改变另一方也改变。
关联映射和级联操作
关联映射就是通过配置文件来配置表与表的关系
关联映射
(1:1,1:n,n:1,n:n)
一对一关联
一对多关联(常用)
查询一个用户和对应部门信息
一个部门对应多个用户,需要在一的一方需要添加多的一方的集合
如:在用户HUser 中添加属性 HDept
在配置文件中进行配置
如何删除一个部门?
在hibernate中,要删除一个部门,由于员工表和部门表有关联,所以会将员工表的d_id也就是外键设为null,使之与部门表解除关联,然后再删除部门。要在删除部门的同时删除该部门下的所有员工,需要进行如下操作(级联操作):
多对一关联(常用)
需要在多的一方的实体类中添加一的一方
如在HDept中添加List 集合
在配置文件中进行配置
多对多关联
在配置关联映射前,需要在数据库中确保表与表之间存在约束。
缓存
- 一级缓存session级别 默认开启的
- 二级缓存sessionFactory级别 默认关闭的,需要配置
导入ehcache.jar
<!--hibernate缓存-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.4.1.Final</version>
</dependency>
ehcache.xml
在核心配置文件中配置
<!--开启二级缓存-->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!--提供二级缓存实现类-->
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.internal.EhcacheRegionFactory
</property>
<!--提供二级缓存配置文件-->
<property name="hibernate.cache.provider_configuration_file_resource_path">
ehcache.xml
</property>
需要在哪里使用就去相应的类的配置文件中添加配置
测试,打印结果为true
锁
- 乐观锁
1、在pojo中添加一个字段用于记录版本号
2、在映射文件中添加配置
分页操作
query.setFirstResult()
query.setMaxResults()