【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框架我们就可以不再编写重复的 ...
随机推荐
- distpicker三级联动,动态改变省市信息
一.引入3个js文件 <script type="text/javascript" src="js/distpicker.data.js">< ...
- 大圆那些事 LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别 LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY ...
- hdu2026(water~~)
http://acm.hdu.edu.cn/showproblem.php?pid=2026 #include<iostream> #include<stdio.h> #inc ...
- 关于static函数在类中的定义和使用
刷题的时候遇到了这样一个问题:平时经常使用 sort()函数, 对结构体进行排序, 但是在类中使用时会出现 这样的错误提示:“Solution::cmp”: 函数调用缺少参数列表:请使用“&S ...
- Spring Cloud (5) 分布式配置中心
Spring Cloud Config 在分布式系统中,由于服务数量很多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,使用Spring Cloud ...
- 通过yum命令搭建lamp环境(centos6.5)
centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...
- Android 微信SDK图片分享(checkArgs fail, thumbData is invalid)
微信官网给的Demo中.图片的分享例子他是这么描述的: String url = "http://pic2.nipic.com/20090506/1478953_125254084_2.jp ...
- Android的HttpUrlConnection类的GET和POST请求
/** * get方法使用 */ private void httpGet() { new Thread() { @Override public void run() { //此处的LOGIN是请求 ...
- ArcGIS Android工程迁移到其他电脑不能打开的问题
问题描述:当我把已经做好的ArcGIS Android工程想在其他电脑运行时,总是会提示报错.而报错的地方,正是出现在下面这条语句上. compile 'com.esri.arcgisruntime: ...
- jQuery——事件操作
事件绑定 1.简单事件绑定 $("button").click(function () {})//可重复绑定,不会被层叠 2.bind():不推荐使用 $("button ...