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
基础部分
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,最后和数据库交换一次
 
 
 
一级缓存位置
 
一级缓存操作
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方法可以提取
策略
 
     read-only:对象只要加载到二级缓存以后,就只能读取了,不能进行修改。
     read-write:对二级缓存中的对象能够进行读和写的操作
 
 
查询缓存
      一级缓存和二级缓存都是对象缓存:就是把该对象对应的数据库表中的所有的字段
    全部查询出来了,这种查询在某些场合下会让效率降低。例如:表中的字段特别多,
    但是程序中所需要的字段却很少。
       查询缓存也叫数据缓存:内存(页面)中需要多少数据就把多少数据放入到查询缓存
    中。
生命周期
    只要一些数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该
    缓存的生命周期就结束了。
 
操作步骤
1、在hibernate的配置文件中,开启查询缓存
2、使用查询缓存
query.setCacheable(true);//query要使用查询缓存了
query.list();//把数据放入到查询缓存中
 
总结
hibernate总共有三种缓存
一级缓存解决的问题是在一次请求中,尽量减少和数据库交互的次数,在session.flush之前,改变的是一级缓存的对象的属性。当session.flush的时候才要
跟数据库交互,一级缓存解决不了重复查询的问题。一级缓存是对象缓存
    二级缓存可以把经常不改变、常用的公共的数据放入进来,可以重复查询,利用get方法和iterator方法可以把二级缓存中的数据得到。
    查询缓存可以缓存数据或者对象,可以利用list方法把查询缓存中的数据放入到缓存中
查询缓存中存放的是数据,是数据缓存。
 
懒加载的时候:
需要数据的时候才要加载
 
集合的懒加载
   set的延迟加载:
       true
       false
       extra
   说明:
       1、因为延迟加载在映射文件设置,而映射文件一旦确定,不能修改了。
       2、延迟加载是通过控制sql语句的发出时间来提高效率的。
 
抓取策略
   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
 

Hibernate框架学习笔记的更多相关文章

  1. j2ee开发之hibernate框架学习笔记

    hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...

  2. hibernate框架学习笔记6:事务

    MySQL的事务.JDBC事务操作: 详细见这篇文章:比较详细 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔离级别: ...

  3. hibernate框架学习笔记3:API详解

    Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...

  4. hibernate框架学习笔记2:配置文件详解

    实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private ...

  5. hibernate框架学习笔记1:搭建与测试

    hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...

  6. hibernate框架学习笔记11:Criteria查询详解

    创建实体类对象: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public class Custome ...

  7. hibernate框架学习笔记10:HQL查询详解

    HQL语句中不可以出现与表有关的内容,而是对象的属性 实体类(注意配置文件): package domain; import java.util.HashSet; import java.util.S ...

  8. hibernate框架学习笔记4:主键生成策略、对象状态

    创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...

  9. hibernate框架学习笔记12:查询优化

    类级别查询优化: 创建一个实体类: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public clas ...

随机推荐

  1. Java URLEncoder URLDecoder

    URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换 URLDecoder类包含一 ...

  2. 关于thinkphp5被入侵后的一些思考

    最近一段时间thinkphp5爆出漏洞  request.php中的请求过滤不严 是得web端 可以直接写入一个文件到服务器上 进而可得webshell权限 我的一个客户 就是这样被入侵了   刚开始 ...

  3. ubuntu(更新所有软件[可更新])终端命令

    转载自https://blog.csdn.net/quite_cgy/article/details/70312034 (1)输入命令 (2)执行效果(由于已经更新完毕,因此显示所有软件包均为最新,否 ...

  4. java环境变量配置方法

    原创文章,转载请注明出处. 这是本人2011-9-4记录的,现在把它放在博客上. windows xp下配置JDK环境变量: 1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 ...

  5. mysql innodb count(*)速度慢且不准确的解决办法

    innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据.而innodb必须 ...

  6. 06-padding(内边距)

    padding padding:就是内边距的意思,它是边框到内容之间的距离 另外padding的区域是有背景颜色的.并且背景颜色和内容的颜色一样.也就是说background-color这个属性将填充 ...

  7. 尚硅谷redis学习6-持久化RDB

    是什么 持久化文件保存在dump.rdb中 持久化策略 在shutdown或flush或flushall后会立即持久化 重新启动后会从rdb文件中恢复数据 可以手动持久化 持久化失败时不允许写,如在强 ...

  8. Java面试题_简答题

    作为一个大三在校生,很快就要去实习了,但总感觉自己连一个刚入门的菜鸟都不如,哎.发现自己连那个程序员的门槛都还没进,有点小伤心,不过伤心没用,努力向前才是我们现在应该做的事情. 下面是我之前在学校所从 ...

  9. KVM虚拟化技术(六)磁盘管理

    KVM支持的虚拟磁盘类型 raw 这并非是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像:它并不存储元数据,因此可以作为保证虚拟机兼容性的候选方案,然而也正因为 它不存储元数据,因此不能支持某些高 ...

  10. linux目录结构详解(以suse linux 10为例)

    一.文件系统结构 位于Linux系统的最顶端即根目录是/.Linux的文件系统的入口就是/,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. 它之下的子目录有: ...