01_Hibernate持久化
一.简介
思考:为什么使用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方法
- save(Object object)
修改数据 通过Session的update方法
- update(Object object)
删除数据 通过Session的delete方法
- delete(Object object)
根据主键查询 通过Session的get或load
- 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 类负责读取主配置文件的信息。包括如下内容:
- 运行的底层信息:数据库的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();
常用方法:
- 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持久化的更多相关文章
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- SQL Server-聚焦计算列持久化(二十一)
前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...
- Lind.DDD.LindMQ~关于持久化到Redis的消息格式
回到目录 关于持久化到Redis的消息格式,主要是说在Broker上把消息持久化的过程中,需要存储哪些类型的消息,因为我们的消息是分topic的,而每个topic又有若干个queue组成,而我们的to ...
- EQueue文件持久化消息关键点设计思路
要持久化的关键数据有三种 消息: 队列,队列中存放的是消息索引信息,即消息在文件中的物理位置(messageOffset)和在队列中的逻辑位置(queueOffset)的映射信息: 队列消费进度,表示 ...
- Quartz.net持久化与集群部署开发详解
序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...
- ASP.NET OWIN OAuth:refresh token的持久化
在前一篇博文中,我们初步地了解了refresh token的用途——它是用于刷新access token的一种token,并且用简单的示例代码体验了一下获取refresh token并且用它刷新acc ...
- Workflow笔记3——BookMark和持久化
BookMark 我们在平时的工作流使用中,并不是直接这样一气呵成将整个工作流直接走完的,通常一个流程到了某一个节点,该流程节点的操作人,可能并不会马上去处理该流程,而只有当处理人处理了该流程,流程才 ...
- java 的持久化和序列化的简单理解
1.对象的持久化(Persistence) 对象持久化就是让对象的生存期超越使用对象的程序的运行期.将对象存储在可持久保存的存储介质上,在实际应用中,运用相应的对象持久化框架,将业务数据以对象的方式保 ...
随机推荐
- mysql sql的分类、运算符、常用的数据类型
SQL (结构化查询语言)的分类 DML(数据操作语言),关键字 insert,update,delete, DCL(数据控制语言),控制权限,grand,revoke 授权,回收 DDL(数据定义语 ...
- JavaScript - DOM相关
DOM节点分类 ( node ) : 元素节点 ( element node ) 属性节点 ( attribute node ) 文本节点 ( text node) DOM的相关操作 : 1. 查询元 ...
- js对象 事件
对象 创建 var myObject = {};/* 声明对象字面变量*/ 添加值myObject.name="Jener";myObject.age=25; 代码格式 ...
- 如何清除本机DNS缓存
如何清除本机DNS缓存 在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其 解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成 ...
- Hdu-1452-Happy 2004-费马小定理推除法逆元+同余定理+积性函数
Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your ...
- 第十篇:javaScript中的JSON总结
参考网站:json中国,MDN json 一.必知基础 JSON 是JavaScript对象文字符号的一个子集,它可以自如的在JavaScript中使用.看下这个对象: var myJSONOb ...
- jq 图片上传前预览
html: <div class="form_upload"> <input type="file" id="uploadImg&q ...
- Django的日常-AJAX
目录 Django的日常-AJAX AJAX简介 AJAX与JQ的一个实例 AJAX与contentType AJAX传json格式 AJAX传文件 Django的日常-AJAX AJAX简介 首先A ...
- Python3 多线程编程 - 学习笔记
线程 什么是线程 特点 线程与进程的关系 Python3中的多线程 全局解释器锁(GIL) GIL是啥? GIL对Python程序有啥影响? 改善GIL产生的问题 Python3关于多线程的模块 多线 ...
- 使用virtualenv发布Python程序
客户环境不能上网,开始想把所有依赖包下载下来,进入客户环境进行安装.但为了避免出差,部署工作交给其他同事了,我想还是需要更简单的方式. 实验了一下virtualenv是可以的 1. 创建一个新的环境( ...