Hibernate学习笔记

简介

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值