前言
面向对象(OO)思想是软件开发的基本思想 关系型数据库又是应用系统必不可少的一环,但是面向对象是从软件工程的基本原则发展而来,而关系型数据库却是从数学理论的基础诞生的,两者区别非常大,ORM(object relational mapping)于是应运而生
ORM是对象到关系的映射,它的作用是在关系型数据库和对象之间做一个自动映射,将数据库中的数据库映射成为对象,也就是持久化类,对关系型数据以对象的形式进行操作,减少应用开发过程中数据持久化的编程任务,可以把ORM理解成关系型数据和对象的一个纽带。开发人员只需要关注纽带一端映射的对象即可
Hibernate是众多ORM工具中的佼佼者。
一、Hibernate简介
作为一个优秀的持久层框架 Hibernate充分体现了ORM的设计理念,提供了高效的对象到关系型数据库的持久化服务,它将持久化服务从软件业务层中完全抽取出来,让业务逻辑的处理更加简单,程序之间的各种业务并非紧密耦合(UML的设计理念)
Hibernate体系概念图如下
Hibernate中有非常重要的三个类
1:配置类
主要负责管理Hibernate的配置信息以及启动Hibernate 在Hibernate运行时配置类会读取一些底层实现的基本信息,包括数据库的各种配置
2:会话工厂类
会话工厂类是生成Session的工厂,它保存了当前数据库中所有的映射关系,可能只有一个可选的二级数据缓存,并且它是线程安全的,但是会话工厂是一个重量级对象,它的初始化创建过程会耗费大量的系统资源
3:会话类
会话类是Hibernate中数据库持久化操作的核心,它将负责Hibernate所有的持久化核心,通过它可以对数据库进行增删改查,但它不是线程安全的。
二、Hibernate入门
1:获取Hibernate
从官方网站下载所需的jar包 网址如下
2:Hibernate配置文件
Hibernate通过读取默认的XML配置文件hibernate.cfg.xml加载数据库的配置信息,该配置文件被默认放于项目的classpath根目录下
连接mysql数据库配置如下
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/db_database16</property> <propert name="connection.username">root</property> <property name="connection.password">111</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping resource="com/mr/employee/Employee.hbm.xml"/> <mapping resource="com/mr/user/User.hbm.xml"/> </session-factory> </hibernate-configuration>
3:了解并编写持久化类
Hibernate中的持久化类有四条编程规则
1:实现一个默认的构造函数
所有的持久化类都必须含有一个默认的无参数构造方法
2:提供一个标识属性
3:使用非fianl类
4:为属性声明访问器
4:Hibernate映射
Hibernate的核心就是对象关系映射,对象和关系型数据库之间的映射通常是用XML文档来实现的,这个映射文档被设计成易读的,并且手工修改 示例如下
<?xml version="1.0" encoding="utf-8"> <DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <hibernate-mapping> <class name="com.mr.User" table="tb_user"> <id name="id" column="id" type="int"> <generator class="native"/> </id> <property name="name" type="string" not-null="true" length="50"> <column name="name"/> </property> <property name="password" type="string" not-null="true" length="50"> <columnn name="password"/> </property> </class> </hibernate-mapping>
三:Hibernate数据持久化
Hibernate实例状态分为三种
1:瞬时状态(transient)
通过java中的new关键字开辟内存空间创建的java对象,但是它并没有纳入Hibernate Session的管理中,如果没有变量对它引用,它将被JVM回收。
2:持久化状态(persistent)
与数据库中的数据关联,它总是与会话状态和事务关联在一起,当持久化状态对象发生改动时并不会立即执行数据库操作。只有当事务结束时,才会更新数据库
3:脱管状态(detached)
当持久化状态对象的session关闭后,这个对象就从持久化状态变为脱管状态,但是它仍然存在与数据库中的数据关联
三种状态关系如下
Hibernate初始化类
Configuration cfg=new Configuration().configure(); factory=cfg.buildSessionFactory();
保存数据
Hibernate的数据持久化过程如下图所示
四:使用Hibernate的缓存
缓存是数据库数据在内存中的临时容器 是数据库与应用程序的中间件 如下图所示
1:一级缓存
一级缓存属于Session级缓存 所以它的声明周期与Session相同,它随Session创建而创建,随Session销毁而销毁
(Session间缓存不能共享,所以不能访问其他session的缓存)
下面实例中Hibernate只访问了一次数据库,第二次对象加载是从一级缓存中将该对象的缓存实例以结果的形式直接返回
Session session=null; try{ session=HibernateInitialize.getSession(); Product product=(Product)session.get(Product.class,new Integet("1")); System.out.printIn("第一次装载对象"); Product product2=(Product)session.get(Product.class,new Integet("1")); System.out.printIn("第二次装载对象"); } catch(Exception e){ e.printStackTrace(); } finally{ HibernateInitialize.closeSession(); }
2:配置并使用二级缓存
Hibernate的二级缓存将由从属于一个SessionFactory的所有Session对象共享,当程序使用Session加载持久化对象时,Session首先会根据加载的数据类和唯一性标识在缓存中查找是否存在此对象的缓存实例 没有再向二级缓存中查找实例对象,如果还没有就直接访问数据库
配置二级缓存
<hibernate-configuration> <session-factory> ... <property name="hibernate.cache.use_second_level_cache">true</property> //开启二级缓存 <property name="hibernate.cache.provider_calss">//指定缓存产品提供商 org.hibernate.cache.EhCacheProvider</property> </session-factory> </hibernate-configuration>
在持久化的映射文件中需要指定缓存的同步策略
<hibernate-mapping> <class name="com.mr.product.Product" table="tab_product"> <cache usage="read-only"/> ... </class> </hibernate-mapping>