【SSH之旅】一步步学习Hibernate框架(一):关于持久化
在不引用不论什么框架下,我们会通过平庸的代码不停的对数据库进行操作,产生了非常多冗余的可是又有规律的底层代码,这样频繁的操作数据库和大量的底层代码的反复书写极大的浪费了程序人员的书写。就在这样一种情况下,Hibernate框架应运而生了。
事实上Hibernate封装的就是Model模型中的model,封装的这部分又叫持久层。在这层中对对象进行加入、删除、更新、查询等操作就叫做持久化。
持久化的对象有三种状态:Transient Objects、Persist Objects、Detached Objects。
Transient Objects:
使用new操作初始化的对象不会被立马持久化。其状态时瞬时的,不被Session管理,此时,也没有不论什么跟数据库相关联的行为,即数据库中没有这个记录,仅仅要不被其它对象引用,他们的状态将会丢失,并由垃圾回收机制回收。
在下面情况下对象处于此状态:
(1) 当通过new语句刚创建了一个对象,不和数据库中的不论什么记录相应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为暂时对象。对于游离对象,delete()方法从数据库中删除与它相应的记录;对于持久化对象。delete()方法从数据库中删除与它相应的记录。而且把它从Session的缓存中删除。
Persist Objects:
持久实例是不论什么具有数据库标识的实例。它有持久化管理器Session统一管理。持久化实例在事务中进行操作的。其状态在事务结束时同数据库进行同步。
当事务提交时。通过运行SQL的insert、update、delete语句把内存中的状态同步到数据库中。
Session的很多方法都可以触发Java对象进入持久化状态,比方说Session的save()把暂时对象转变为持久化对象。load()或get()返回的对象处于持久化状态。find()返回的List集合中存放的都是持久化对象。update()、saveOrUpdate()和lock()使游离对象转变为持久化对象。
Detached Objects:
Session被关闭后,持久化对象就变成离线对象。离线表示这个对象不再与数据库保持同步,不再受管理。
当调用Session的close()时,Session的缓存被清,缓存中的全部持久化对象都变为游离对象。evict()可以从缓存中删除一个持久化对象,使它变为游离状态。
实例分析:
项目结构:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFuZGFuem1j/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
hibernate.cfg.xml文件:
配置数据库信息和生成的表的
<!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>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<property name="hibernate.connection.username">zhudan</property>
<property name="hibernate.connection.password">1221</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="zhudan/hibernate/User.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
User.hbm.xml文件:
须要映射的表的配置。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="zhudan.hibernate.User" table="T_User">
<id name="id" column="UserID">
<generator class="uuid"/>
</id>
<property name="name" column="UserName"></property>
<property name="password" column="PassWord"></property>
<property name="createTime" column="CreateTime"></property>
<property name="expireTime" column="ExpireTime"></property>
</class>
</hibernate-mapping>
HibernateUtils类:
读取前面配置的hibernate.cfg.xml,建立SessionFactory、Session,关闭Session等。
package zhudan.hibernate; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport; public class HibernateUtils { private static SessionFactory factory; static{
try{
//读取hibernate.cfg.xml
Configuration cfg=new Configuration().configure();
//建立SessionFactory
factory=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}
} //获取Session
public static Session getSession(){
return factory.openSession();
} //关闭Session
public static void closeSession(Session session){
if(session!=null){
if(session.isOpen()){
session.close();
}
}
} //SessionFactory
public static SessionFactory getSessionFactory(){
return factory;
}
}
ExportDB类:映射表。将hbm.xml生成相应的ddl。
package zhudan.hibernate; import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport; public class ExportDB {
public static void main(String[] args){
//读取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
SchemaExport export=new SchemaExport(cfg);
export.create(true, true);
}
}
SessionTest类:
package zhudan.hibernate; import java.util.Date; import org.hibernate.Session;
import org.hibernate.Transaction; import junit.framework.TestCase; public class SessionTest extends TestCase {
public void testSave1(){
Session session=null;
//开启事务
Transaction tx=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//Transient状态
User user=new User();
user.setName("zhudan");
user.setPassword("zhudan");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//被session管理。persistent状态。当对象属性改变的时候
//清理缓存(脏数据)的时候,会和数据库同步
session.save(user);
//更新上一条数据
user.setName("fanglin1");
session.update(user);
//提交事务
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//detached状态
}
}
在这个样例中,当New一个User对象时,状态是Transient Objects,此时数据库中没有这条数据,不被Session管理,当在运行保存时。状态改变为Persist Objects,此时,数据中存在当前数据,被Session管理,一旦事务被提交。运行完此语句后。状态更改为Detached
Objects,此时数据库中存在此数据。被Session管理。
总结:
持久化封装了数据訪问细节。为大部分业务逻辑提供了面向对象的接口,降低了数据库訪问次数,添加了应用程序的运行速度,使其不依赖于底层数据库和上层业务逻辑实现,更换数据库时也仅仅是改动配置文件而不用改动代码。重用性大大提高。
【SSH之旅】一步步学习Hibernate框架(一):关于持久化的更多相关文章
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
这篇博客是hibernate学习的第一篇,主要简介hibernate框架,之后简单说一下hibernate的文件夹结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hiberna ...
- 深入浅出学习Hibernate框架(二):JDBC基础操作
上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...
- 深入浅出学习hibernate框架(三):java的反射机制
上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...
- 【SSH之旅】一步步学习Struts1框架(二):Struts实例
从上篇博客能够看到,事实上Struts1框架就是封装了一些页面的转向.数据类型的转换,去除冗余的if else推断.除了这些,事实上还封装了一些我们寻经常使用的JSTL标签库,文件上传等等. 以下看怎 ...
- (转) Hibernate框架基础——操纵持久化对象的方法(Session中)
http://blog.csdn.net/yerenyuan_pku/article/details/52761021 上一篇文章中我们学习了Hibernate中java对象的状态以及对象的状态之间如 ...
- hibernate框架学习笔记6:事务
MySQL的事务.JDBC事务操作: 详细见这篇文章:比较详细 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔离级别: ...
- JAVA框架之Hibernate框架的学习步骤
首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3 ...
- Hibernate框架(未完待续······)
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...
- Hibernate框架(一)——总体介绍
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的 ...
随机推荐
- 321 Create Maximum Number 拼接最大数
已知长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,直观地表示两个自然数各位上的数字.现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中 ...
- centos安装composer以及使用国内镜像
下载composer.phar文件 curl -sS https://getcomposer.org/installer | php 将composer.phar移动到环境变量中并且更名为compos ...
- 如何下载 Nginx (windows 版本)并且简单的使用
官网地址:http://nginx.org/ 进到官网 我这里下载的是 稳定版的 windows版本. 开始我们的简单测试 步骤一:找到nginx的压缩包,(随意找个地方)解压 步骤二:进入conf文 ...
- 在ubuntu系统下下载和卸载skype
1.下载 sudo apt-get install skypeforlinux 2.卸载 sudo apt remove skypeforlinux
- TCP简要讲解
TCP被称为面向连接.面向流,可靠的传输层协议.它与UDP最大的不同在于它是可靠性的,所以需要可靠传输的时候就需要用到TCP,如果需要快速传输则选择UDP. TCP的连接又称为3次握手. 1).客 ...
- Win32子窗口的创建
本文主要是在一个主窗口下创建一个子窗口.主窗口有一个菜单,菜单下只有设置一个选项,点击设置选项,弹出设置界面,点击设置界面关闭则关闭.我在开发的时候遇到两个问题,第一就是一点设置关闭就整个应用都关了, ...
- linux共享库的版本控制
前几天看到一篇介绍linux共享库版本控制及使用的文章,觉得不错,这里就与大家分享一下. 1. Linux约定 经常看到Linux中,共享库的名字后面跟了一串数字,比如:libperl.so.5.18 ...
- 我的liunx开发环境的配置之路
相信有不少人和我一样,虽然是做纯linux开发,但并不排斥windows,并且喜欢在windows下面的使用各种好用的工具来让linux的编程工作变得更加方便.实际上每一个系统都有他的过人支持,win ...
- Java_Web三大框架之Hibernate 入门(一)
一.Hibernate简介: Hibernate作者——Gavin King Hibernate创始人 < Hibernate in action >作者 EJB 3.0的Entity b ...
- Linux Shell 小知识
${} ——变量替换 通常 $var 与 ${var} 没有区别,但是用 ${} 会比较精确的界定变量名称的范围. name='Ace' echo "result1: my name is ...