Hibernate框架学习笔记

时间:2021-12-17 07:24:36
 
Hibernate 是一个 JDO( Java Data Objects)工具。它的工作原理是通过文件把值对象(Java对象)和
数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法。
 
配置 Hibernate 框架
配置 Hibernate 框架,需要三个准备,七个步骤。
准备一、导入 Hibernate 库
准备二、添加配置文件 hibernate.cfg.xml
准备三、添加映射文件 UserInfo.hbm.xml
步骤一、创建 Configuration
步骤二、创建 SessionFactory
步骤三、打开 Session
步骤四、开始一个事务
步骤五、持久化操作
步骤六、提交事务
步骤七、关闭 Session
 
HQL检索方式
HQL检索方式,与SQL语法有些类似。但是HQL是面向对象的,它操作的是持久化类的类名和类属性,
而SQL操作的是表名和字段名。Query接口封装了HQL查询语言。
 
 
ORM 
ORM 是 Objiect Relational Mapping 的简称,即对象关系映射。
ORM 是通过使用描述对象和数据库之间映射的原数据,将 Java 程序中的对象自动持久化到关系数据库中,本质上就是将数据从一种形式转换为另一种形式。ORM 产品如下:Hibernate、IBatis
 
hibernate.cfg.xml 文件元素分析 (Hibernate配置文件)
<hibernate-configuration>是文件的根元素,所有相关的配置都要在此元素下配置。
<session-factory>session 工厂配置,相当于 JDBC 中的 DriverManager。
<property name="connection.username">root</property>指定连接数据库的用户名。
<property name="connection.password">922526</property>指定连接数据库的密码。
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>指定连接数据
库的驱动程序。
<property name="connection.url">jdbc:mysql://localhost:3306/mybbs</property>指定连接数
据库 URL。
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>指定数据库使用
的 SQL 方言。
Hibernate 能够访问多种数据库,如 MySQL、 Oracle 和 Sybase 等。尽管多数数据库都支
持标准的 SQL 语言,但是它们往往还有各自的 SQL 方言,就像不同地区的人既能说标准普
通话,还能将各自的方言一样。
<property name="show_sql">true</property>显示 SQL 语句
 
UserInfo.hbm.xml 文件元素分析 (Hibernate映射文件)
UserInfo.hbm.xml 作用是告诉 Hibernate 怎么来做对象映射。向哪个表插入数据,每个属
性的数据类型,以及对应数据表里的列名。
 
SessionFactory 实例
对应一个数据存储源应用从 SessionFactory 中获得 Session 实例。 
SessionFactory 用到了一个设计模式-工厂模式,用户程序从工厂类 SessionFactory 中取得 Sessi
on 的实例,设计者的意图是让它能在整个应用程序*享。
 
 
Hibernate框架学习笔记
 
Hibernate框架学习笔记
 
Hibernate框架学习笔记
 
hibernate
基础部分
jdbc缺点
jdbc缺点.txt
hibernate优点
hibernate优点.txt
操作部分
查询 例子 session.get(xxx);
List<Classes> classes = session.createQuery("from Classes").list();
Iterator<Classes> iterator = session.createQuery("from Classes").iterate();
修改、session.update(xxx)
删除、session.delete(xxx)
增加 session.save(xxx)
执行过程
执行过程.txt
基本组成
hibernate.cfg.xml
hibernate配置文件.txt
持久化类
持久化类.txt
*.hbm.xml
映射文件.txt
主键的产生机制
主键的产生机制.txt
hibernate类型
hibernate类型.txt
执行原理
执行原理.bmp
对象状态
对象的状态.txt
 
hibernate缓存部分
hibernate一级缓存
get方法
load方法
save方法
update方法
flush方法
evict方法
clear方法
一级缓存.txt
hibernate二级缓存
关于二级缓存.txt
hibernate查询缓存
 
关系部分
一对多单项
一对多双向
多对多双向
hibernate-关系部分.txt
 
性能部分
延迟加载
抓取策略
延迟加载和抓取策略.txt
 
hql语句
hql语句.txt
 
 
hbm2ddl.auto
根据持久化类生成表的策略
例子:<property name="hbm2ddl.auto">update</property>
validate 通过映射文件检查持久化类与表的匹配
update 每次hibernate启动的时候,检查表是否存在,如果不存在,则创建,如果存在,则什么 都不做了
create 每一次hibernate启动的时候,根据持久化类和映射文件生成表
 
show_sql 显示sql
<property name="show_sql">true</property>
 
format_sql 格式sql
<property name="format_sql">true</property>
 
可以根据持久化类和映射文件
 
实现了Serializable的主要的作用是为了在网络上传输
 
jdbc缺点
       1、编程的时候很繁琐,用的try和catch比较多
    2、jdbc没有做数据的缓存
    3、没有做到面向对象编程
    4、sql语句的跨平台性很差
jdbc的优点
    效率比较高
hibernate的优点
       1、完全的面向对象编程,所以不需要写sql,hibernate帮我们自动生成SQL
       2、hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存   重点
    3、编程的时候就比较简单了
    4、跨平台性很强
    5、使用场合就是企业内部的系统
hibernate的缺点
    1、效率比较低
    2、表中的数据如果在千万级别,则hibernate不适合
    3、如果表与表之间的关系特别复杂,则hibernate也不适合
 
sessionFactory
1、hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中
2、sessionFactory中存放的信息都是共享的信息
3、sessionFactory本身就是线程安全的
4、一个hibernate框架sessionFactory只有一个
5、sessionFactory是一个重量级别的类
 
session
1、得到了一个session,相当于打开了一次数据库的连接
2、在hibernate中,对数据的crud操作都是由session来完成的
 
主键的产生器
1、increment 自动生长,主键必须是数字类型。
* 先找到主键的最大值,在最大值基础上加1
<!--
主键的产生器
-->
<generator class="increment"></generator>
2、assigned 在程序中手动的设置主键的值
 
3、identity
* 主键必须是数字类型
* 该效率比increment要高,但是id值不连续
 
4、UUID
* uuid的字符串是由hibernate内部生成的
* 要求主键必须是字符串类型
 
缓存
     oscache,ehcache    小型的应用
     memory cache,redis,hbase   分布式的应用
 
一级缓存
为session级别的缓存,一级缓存的生命周期和session的生命周期保持一致。
 
一级缓存的意义,通过session.flush(),只和数据库交换一次。
具体细节在缓存总操作数据,然后flush,最后和数据库交换一次
Hibernate框架学习笔记
 Hibernate框架学习笔记
 
 
一级缓存位置
Hibernate框架学习笔记
Hibernate框架学习笔记
 
一级缓存操作
get方法
    可以把对象放入到一级缓存中,也可以从一级缓存中把对象提取出来
save方法
     该方法可以把一个对象放入到一级缓存中
evit方法
可以把一个对象从session的缓存中清空
update方法
可以把一个对象放入到一级缓存(session)中
clear方法
     清空一级缓存中所有的数据
close方法
   当调用session.close方法的时候,一级缓存的生命周期就结束了
 
cascade 级联操作
null 默认值
save-update
cascade指的是级联操作,操作的是一般属性,指的是对象与对象的操作
inverse指的是关系操作,针对的就是外键
all
delete
 
 
inverse 关系操作
default:classes维护classes与student之间的关系
true: classes不维护classes与student之间的关系
false: classes维护classes与student之间的关系
 
 
一对多的单项
inverse与cascade的关系
   cascade指的是级联操作,操作的是一般属性,指的是对象与对象的操作
   inverse指的是关系操作,针对的就是外键
一对多的双向
当多的一方维护关系时,不会发出更新关系的update语句,而一的一方维护关系时
需要发出维护关系的update语句,所以在这里,一般情况下,多的一方维护关系效率
比较高。
 
多对多维护关系
多对多建立关系相当于在第三张表中插入一行数据
    多对多解除关系相当于在第三张表中删除一行数据
    多对多修改关系相当于先删除后增加
    多对多谁维护效率都一样。看需求
 
一对一
<!--
外键
column
unique外键只能出现一次
-->
<many-to-one name="classes" column="cid" class="com.itheima12.hibernate.domain.Classes"
unique="true"
cascade="save-update"></many-to-one>
 
 
二级缓存
实用的场合
   公开的数据
   数据基本上不发生变化
   该数据保密性不是很强
说明:如果一个数据一直在改变,不适合用缓存。
 
例如:12306的省份、市地址
 
生命周期
  二级缓存的生命周期和sessionFactory是一致的。
 
设置二级缓存
     利用的是ehcache实现的二级缓存
    1、在hibernate的配置文件中
<!--
二级缓存的供应商
-->
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!--
开启二级缓存
-->
<property name="cache.use_second_level_cache">true</property>
<!--
开启二级缓存的统计机制 可选
-->
<property name="generate_statistics">true</property>
 
 
2、指定哪个类开启二级缓存
可以在 xx.cfg.xml文件中
<class-cache usage="read-only" class=""com.itheima12.hibernate.domain.Classes""/>
也可以在 xx.hbm.xml文件中
<class name="com.itheima12.hibernate.domain.Classes">
<cache usage="read-only"/>
</class>
 
 
哪些方法可以把对象放入到二级缓存
    get方法,list方法可以把一个或者一些对象放入到二级缓存中
哪些方法可以把对象从二级缓存中提取出来
   get方法,iterator方法可以提取
策略
Hibernate框架学习笔记
Hibernate框架学习笔记
 
     read-only:对象只要加载到二级缓存以后,就只能读取了,不能进行修改。
     read-write:对二级缓存中的对象能够进行读和写的操作
 
 
查询缓存
      一级缓存和二级缓存都是对象缓存:就是把该对象对应的数据库表中的所有的字段
    全部查询出来了,这种查询在某些场合下会让效率降低。例如:表中的字段特别多,
    但是程序中所需要的字段却很少。
       查询缓存也叫数据缓存:内存(页面)中需要多少数据就把多少数据放入到查询缓存
    中。
生命周期
    只要一些数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该
    缓存的生命周期就结束了。
 
操作步骤
1、在hibernate的配置文件中,开启查询缓存
Hibernate框架学习笔记
2、使用查询缓存
query.setCacheable(true);//query要使用查询缓存了
query.list();//把数据放入到查询缓存中
 
总结
hibernate总共有三种缓存
一级缓存解决的问题是在一次请求中,尽量减少和数据库交互的次数,在session.flush之前,改变的是一级缓存的对象的属性。当session.flush的时候才要
跟数据库交互,一级缓存解决不了重复查询的问题。一级缓存是对象缓存
    二级缓存可以把经常不改变、常用的公共的数据放入进来,可以重复查询,利用get方法和iterator方法可以把二级缓存中的数据得到。
    查询缓存可以缓存数据或者对象,可以利用list方法把查询缓存中的数据放入到缓存中
查询缓存中存放的是数据,是数据缓存。
 
懒加载的时候:
需要数据的时候才要加载
 
集合的懒加载
   set的延迟加载:
       true
       false
       extra
   说明:
       1、因为延迟加载在映射文件设置,而映射文件一旦确定,不能修改了。
       2、延迟加载是通过控制sql语句的发出时间来提高效率的。
 
抓取策略
Hibernate框架学习笔记
Hibernate框架学习笔记
   join:左外连接
   select:默认的值
   subselect:子查询
 
说明:
   1、因为抓取策略的设置在映射文件中,所以一旦映射文件生成就不能改变了。
   2、通过发出怎么样的SQL语句加载集合,从而优化效率的。
 
抓取策略是应用于集合。
 
hql语句
1、单表
Session session = sessionFactory.openSession();
List<Classes> classes = session.createQuery("from Classes").list();
session.close();
2、Criteria查询
3、sql查询
 
 其他参考
HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good