Day 17 Hibernate

来源:互联网 发布:淘宝上的电动车靠谱吗 编辑:程序博客网 时间:2024/06/02 07:04

一.什么是 Hibernate ?

 1. 一个框架

  2.一个 Java 领域的持久化框架

狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
广义的理解,“持久化”包括和数据库相关的各种操作:
保存:把对象永久保存到数据库中。
更新:更新数据库中对象(记录)的状态。
删除:从数据库中删除一个对象。
查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
加载:根据特定的OID,把一个对象从数据库加载到内存中。

 3. 一个 ORM 框架

ORM是对JDBC的封装

ORM(Object/Relation Mapping): 对象/关系映射
ORM 主要解决对象-关系的映射
ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.

二.安装 hibernate 插件

安装方法说明(hibernatetools-4.1.1.Final):
Help --> Install New Software...
Click Add... 
In dialog Add Site dialog, click Archive... 
Navigate to hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip  and click  Open 
Clicking OK in the Add Site dialog will bring you back to the dialog 'Install' 
Select the Jboss Tools hibernatetools Nightly Build Update Site that has appeared 
Click Next  and then Finish 
Approve the license 
Restart eclipse when that is asked

三.准备 Hibernate 环境



四.接口

1.Configuration 类

Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:
Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
持久化类与数据表的映射关系(*.hbm.xml 文件)
创建 Configuration 的两种方式
属性文件(hibernate.properties):
Configuration cfg = new Configuration();
Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
Configuration 的 configure 方法还支持带参数的访问:
File file = new File(“simpleit.xml”);
Configuration cfg = new Configuration().configure(file);
 

2.SessionFactory 接口

针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。 
SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息
SessionFactory是生成Session的工厂
构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。
Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry  注册后才能生效
Hibernate4 中创建 SessionFactory 的步骤

3.Session 接口

持久化类与 Session 关联起来后就具有了持久化的能力。
Session 类的方法:
取得持久化对象的方法: get() load()
持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
开启事务: beginTransaction().
管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等

4.Transaction(事务)

hbm2ddl.auto:该属性可帮助程序员实现正向工程, 即由 java 代码生成数据库脚本, 进而生成具体的表结构. 。取值 create | update | create-drop | validate
create : 会根据 .hbm.xml  文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变 
create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除 
update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml  文件和数据库中对应的数据表的表结构不同, Hiberante  将更新数据表结构,但不会删除已有的行和列 
validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
format_sql:是否将 SQL 转化为格式良好的 SQL . 取值 true | false


五.Hibernate开发步骤

1.创建 Hibernate 配置文件

hibernate.cfg.xml

<?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.username">root</property>    <property name="connection.password">12345678</property>    <property name="connection.driver_class.">com.mysql.jdbc.Driver</property>    <property name="connection.url">jdbc:mysql://localhost:3306/student</property>       <!-- 配置hibernate的基本信息 -->        <!-- hibernate所使用的数据库方言 -->    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <!-- 执行操作时是否在控制台打印sql-->   <property name="show_sql">true</property>     <!-- 是否对SQL进行格式化 -->   <property name="format_sql">true</property>      <!--指定自动生成数据表的策略 -->   <property name="hbm2ddl.auto">update</property>       <!--指定关联的.hbm.xml文件 -->    <mapping resource="com/test/hibernat/News.hbm.xml"/>    </session-factory></hibernate-configuration>
2.创建持久化类
(提供一个无参的构造器, 提供一个标识属性)

News.javapackage com.test.hibernat;public class News {private Integer id;private String name;private String sex;private String age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public News( String name, String sex, String age) {super();this.name = name;this.sex = sex;this.age = age;}public News() {super();}public String toString() {return "News [id=" + id + ", name=" + name + ", sex=" + sex + ", age="+ age + "]";}}


3.创建对象-关系映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-2-18 11:07:01 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.test.hibernat.News" table="NEWS">            <id name="id" type="java.lang.Integer">            <column name="ID" />                        <!-- 指定主键的生成方式,native:使用数据库本地方式 -->            <generator class="native" />        </id>        <property name="name" type="java.lang.String">            <column name="NAME" />        </property>              <property name="sex" type="java.lang.String">            <column name="SEX" />        </property>                <property name="age" type="java.lang.String">            <column name="AGE" />        </property>                    </class></hibernate-mapping>

4.通过 Hibernate API 编写访问数据库的代码

package com.test.hibernat;import static org.junit.Assert.*;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.Test;public class HibernateTest {@Testpublic void test() {//1.创建一个SessionFactory对象SessionFactory sessionFactory;//SessionFactory sessionFactory=null;//1)创建一个Configuration 对象:对应hibernate的基本配置信息和对象关系映射信息Configuration configuration=new Configuration().configure();//2)创建一个ServiceRegistry对象:hibernate4.x新添加的对象//hibernate的任何配置和服务都需要在该对象中注册后才能有效ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();//3)sessionFactory=configuration.buildSessionFactory(serviceRegistry);//2.创建一个Session对象Session session=sessionFactory.openSession();//3.开启事物Transaction transaction=session.beginTransaction();//4.执行保存操作News news=new News("gt","woman","18");session.save(news);//5.提交事物transaction.commit();//6.关闭Sessionsession.close();//7.关闭SessionFactory对象sessionFactory.close();}}  ---------------------常用以下格式-------------------------(package com.hibirnat.demo;import static org.junit.Assert.*;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class HibernatTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Before//定义需要的,先执行public void init(){Configuration configuration=new Configuration().configure();ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory=configuration.buildSessionFactory(serviceRegistry);session=sessionFactory.openSession();transaction=session.beginTransaction();}@After//释放,最后执行public void destroy(){transaction.commit();session.close();sessionFactory.close();}@Test//测试,第二执行public void test() {}})



六.通过 Session 操纵对象

1.Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法.
   Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应

2.Session 缓存

在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期
Session 缓存可减少 Hibernate 应用程序访问数据库的频率。



3.flush 缓存

flush:Session 按照缓存中对象的属性变化来同步更新数据库
默认情况下 Session 在以下时间点刷新缓存:
显式调用 Session 的 flush() 方法
当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush ,然后在向数据库提交事务
当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对象的最新状态
flush 缓存的例外情况: 如果对象使用 native 生成器生成 OID, 那么当调用 Session 的 save() 方法保存对象时, 会立即执行向数据库插入该实体的 insert 语句.
commit() 和 flush() 方法的区别:flush 执行一系列 sql 语句,但不提交事务;commit 方法先调用flush() 方法,然后提交事务. 意味着提交事务意味着对数据库操作永久保存下来。



4.Hibernate 主键生成策略



5.数据库的隔离级别

1)于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

2)在 Hibernate 中设置隔离级别

JDBC 数据库连接使用数据库系统默认的隔离级别. 在 Hibernate 的配置文件中可以显式的设置隔离级别. 每一个隔离级别都对应一个整数:
-1. READ UNCOMMITED
-2. READ COMMITED
-4. REPEATABLE READ
-8. SERIALIZEABLE
Hibernate 通过为 Hibernate 映射文件指定 hibernate.connection.isolation 属性来设置事务的隔离级别

6.clear()



                                             
0 0
原创粉丝点击