一.简介

思考:为什么使用Hibernate?

Hibernate对JDBC访问数据库的代码进行了封装、

Hibernate是一个基于JDBC的主流持久化框架、

Hibernate的性能比较好,它是一个轻量级框架、

什么是持久化?

是将内存中的数据保存到磁盘等存储设备。

瞬时状态:保存在内存的程序数据,程序退出后数据就消失了,称为瞬时状态。

持久状态:保存在磁盘上的数据,程序退出后仍然存在,称为数据的持久状态。

持久化:将程序数据在瞬时状态和持久状态之间转换的机制。

什么是ORM?

ORM(Object Relation Mapping)完成对象数据到关系型数据映射的机制称为对象-关系映射,简称ORM。

ORM的实现思想:将关系数据库中表中的记录映射为对象,以对象的形式展现,程序员可以把数据库的操作转换成对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。ORM一般采用XML的格式保存对象与关系数据表的映射。

二.编写入门程序

         1.导入相关的jar包、

2.创建数据库表,封装类、

3.创建核心主xml文件、

4.创建映射xml文件、

5.编写功能测试、

1、下载hibernate3.x的开发包 (3.6.10)

http://sourceforge.net/projects/hibernate/files/hibernate3/

Hibernate并没有提供日志的实现所有可以下载slf4j 和 log4j 开发包,整合Hibernate的日志系统到log4j

Jar包介绍:

2、创建表与Javabean

这里数据库使用Mysql

User:

public class User {
private int uid;
private String uname;
private Date ubithday;
private Integer age; public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public int getUid() {
return uid;
} public void setUid(int uid) {
this.uid = uid;
} public String getUname() {
return uname;
} public void setUname(String uname) {
this.uname = uname;
} public Date getUbithday() {
return ubithday;
} public void setUbithday(Date ubithday) {
this.ubithday = ubithday;
} @Override
public String toString() {
return "User{" + "uid=" + uid + ", uname='" + uname + '\'' + ", ubithday=" + ubithday + '}';
}
}

3、创建ORM(对象关系映射文件)

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.icss.entity.User" table="aaa">
<id name="uid" column="UID" type="java.lang.Integer" length="11">
<!--主键生成策略-->
<generator class="increment">
</generator>
</id>
<!--usercode属性-->
<property name="uname" column="UNAME" type="java.lang.String" length="255">
</property>
<!--username属性-->
<property name="ubithday" column="UBITHDAY" type="java.util.Date">
</property>
<!-- <property name="age" formula="(select months_between(sysdate,birthday))">
</property>-->
</class>
</hibernate-mapping>

type属性:

4、创建主配置文件

<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property>
<!--配置数据库连接url-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/crm?characterEncoding=utf-8</property>
<!--数据库用户名-->
<property name="hibernate.connection.username">root</property>
<!--数据库密码-->
<property name="hibernate.connection.password">123456</property>
<!--配置数据库连接池-->
<property name="hibernate.connection.pool_size">1</property>
<!--配置数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--运行时输出sql语句-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql语句·-->
<property name="hibernate.format_sql">true</property>
<!--指定session 与当前线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>
<!--动态创建或更新表 /create、drop、update、-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--列出所有映射文件 -->
<mapping resource="com/hb/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

5、功能测试

public class Mytest {
@Test
public void test(){
// 实例化配置对象,加载配置文件 hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
// 创建会话连接工厂
SessionFactory sf = configuration.buildSessionFactory();
// 创建会话
Session session = sf.openSession();
// 开启事务
Transaction ts = session.beginTransaction();
// 操作 ts.commit();
session.close();
sf.close(); }
}

Hibernate常用操作

插入数据、根据主键查询数据、修改数据、删除数据、查询所有数据、

插入数据 通过Session对象 save方法

  1. save(Object object)

修改数据 通过Session的update方法

  1. update(Object object)

删除数据  通过Session的delete方法

  1. delete(Object object)

根据主键查询 通过Session的get或load

  1. get(Class clazz, Serializable id)

Object load(Class theClass, Serializable id

get和load的区别:

1.发送SQL的时机:

load这个方法采用了一个技术.lazy延迟加载(懒加载).真正使用这个对象的数据的时候.(对象的数据不包括主键).

get这个方法是立即检索.当执行session.get()方法的时候,马上发送SQL语句查询.

2.返回的对象:

load方法返回的是代理对象.

get方法返回的是真实的对象.

3.查询一个不存在的数据:

load方法抛异常:ObjectNotFoundException.

get方法抛异常:NullPointException.

Hibernate执行过程

三.配置说明

Configuration

Configuration 类负责读取主配置文件的信息。包括如下内容:

  1. 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
    • *.hbm.xml 文件)

创建 Configuration

    读取配置文件:Xml文件(hibernate.cfg.xml)

    Configuration cfg = new Configuration().configure();

SessionFactory接口

SessionFactory接口:Configuration对象根据当前的配置信息生成 SessionFactory 对象,因此SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。

获取SessionFactory的方式:

   Configuration cfg = new Configuration().configure();

   SessionFactory sf = cfg.buildSessionFactory();

SessionFactory作用:是生成Session的工厂

    Session session = sf.openSession();

注意事项:一般情况下一个应用中只初始化一个 SessionFactory 对象。

Session接口

Session接口:是应用程序与数据库之间交互操作的核心对象,是 Hibernate 运作的中心,所有持久化对象(javabean)必须在 session 的管理下才可以进行持久化(更新数据库)操作。

获取Session对象的方式:

Session session  = sessionFactory.openSession();

Session的主要方法简介:

取得持久化对象的方法: get()、load()

持久化对象保存,更新和删除:

save()、update()、saveOrUpdate()、delete()

开启事务:beginTransaction()

Transaction接口

Transaction接口 :是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)!代表一次数据库访问的最小操作,具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。

获取Transaction对象的方式:

  Transaction tx =session.beginTransaction();

常用方法:

  1. commit()提交相关联的session实例

使用Hibernate的7个步骤:                                                                                                                                                                                                                                                            hibernate的运行流程:   

Hibernate的对象有三种状态:

瞬时态:

瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联,该实体从未与任何持久化上下文联系过,没有持久化标识(相当于主键)。

瞬态实体的特征有:

与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。

持久态:

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

持久对象具有如下特点:

       1. 和session实例关联;

       2. 在数据库中有与之关联的记录

托管态:

当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

脱管对象具有如下特点:

1.  本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;

2. 脱管对象一定是由持久态对象转换而来

3. 脱管实体不再于Session关联

4. 脱管实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据

5. 脱管实体对象在数据库中有相应的数据记录(如果该记录没有被删除)

Hibernate 把对象分为 4 种状态:

持久化状态,

临时状态,

游离状态,

删除状态.

Session 的特定方法能使对象从一个状态转换到另一个状态。

01_Hibernate持久化的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. SQL Server-聚焦计算列或计算列持久化查询性能(二十二)

    前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...

  3. SQL Server-聚焦计算列持久化(二十一)

    前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...

  4. Lind.DDD.LindMQ~关于持久化到Redis的消息格式

    回到目录 关于持久化到Redis的消息格式,主要是说在Broker上把消息持久化的过程中,需要存储哪些类型的消息,因为我们的消息是分topic的,而每个topic又有若干个queue组成,而我们的to ...

  5. EQueue文件持久化消息关键点设计思路

    要持久化的关键数据有三种 消息: 队列,队列中存放的是消息索引信息,即消息在文件中的物理位置(messageOffset)和在队列中的逻辑位置(queueOffset)的映射信息: 队列消费进度,表示 ...

  6. Quartz.net持久化与集群部署开发详解

    序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...

  7. ASP.NET OWIN OAuth:refresh token的持久化

    在前一篇博文中,我们初步地了解了refresh token的用途——它是用于刷新access token的一种token,并且用简单的示例代码体验了一下获取refresh token并且用它刷新acc ...

  8. Workflow笔记3——BookMark和持久化

    BookMark 我们在平时的工作流使用中,并不是直接这样一气呵成将整个工作流直接走完的,通常一个流程到了某一个节点,该流程节点的操作人,可能并不会马上去处理该流程,而只有当处理人处理了该流程,流程才 ...

  9. java 的持久化和序列化的简单理解

    1.对象的持久化(Persistence) 对象持久化就是让对象的生存期超越使用对象的程序的运行期.将对象存储在可持久保存的存储介质上,在实际应用中,运用相应的对象持久化框架,将业务数据以对象的方式保 ...

随机推荐

  1. DIV+CSS网页布局常用的一些基础知识

    CSS命名规范 一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/I ...

  2. Balking Pattern不需要就不用做

    word自动保存功能,如果文档被修改了,后台线程每隔一段时间会自动执行保存功能,但是如果用户在自动保存之前用Ctrl+S手动保存呢?自动保存还会执行吗?答案是不会,因为这个操作时不需要重复做的. pu ...

  3. JS函数 有参数的函数 参数可以多个,根据需要增减参数个数。参数之间用(逗号,)隔开

    有参数的函数 上节中add2()函数不能实现任意指定两数相加.其实,定义函数还可以如下格式: function 函数名(参数1,参数2) { 函数代码 } 注意:参数可以多个,根据需要增减参数个数.参 ...

  4. Centos 6.5 python版本升级到2.7.8

    Centos6.5默认的 python版本是2.6 为了使用aliyuncli工具,直接用pip安装aliyuncli提示错误. 所以决定升级下python版本,但是yum依赖于python2.6,升 ...

  5. Qt Creator配置

    1.安装Git sudo apt install git 2.配置Git 用户和邮箱: git config --global user.name "xxx" git config ...

  6. java在使用equals的时候一种习惯帮忙隔离大部分空指针

    相同的一段代码: 所以,在平时编码的时候,尽量把需要比对的不为空的放在equal前面,比如判断 i 是否等于 1,那么使用 1.equals(i) 更为合适,在equals源码中 传入的是object ...

  7. EJB(Enterprise JavaBean)科普

    该文章是引用的,主要用于自己的学习,然后是记载免得忘记的时候到处乱找.结尾有引用地址. 到底EJB是什么?被口口相传的神神秘秘的,百度一番,总觉得没有讲清楚的,仍觉得一头雾水.百度了很久,也从网络的文 ...

  8. Python 函数与内置函数

    1.函数的基本定义 def 函数名称(参数) 执行语句 return 返回值 def : 定义函数的关键字: 函数名称:顾名思义,就是函数的名字,可以用来调用函数,不能使用关键字来命名,做好是用这个函 ...

  9. CentOS升级GDB

    需要先安装ncurses-devel和texinfo 如果不安装ncurses-devel,编译会出错 如果不安装texinfo或者版本太低,安装会出错 1.yum install -y ncurse ...

  10. Kindle电子书制作

    text.html: <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv=& ...