前些天开始接触hibernate,想想以前直接用c3p0进行笨拙而繁杂的数据库操作就觉得生无可恋了,也正因如此,在刚刚接触hibernate的我,便强烈地喜欢上这种偷懒而优雅的面向对象式操作数据库的方法,下面进行一些简单的总结,主要是关系型数据库持久化思想以及hibernate一些常规的用法。

一、对象持久化(我觉得也可以理解为关系型数据的对象化)

  以前,我直接利用jdbc进行数据库操作时,总感觉一堆的sql拼接和set方法手动组装对象令人感觉无趣,这些机械性非常强的动作,很多时候让人不禁地怀疑人生,直到我知道还有对象持久化这种思想时,才感觉数据库操作变得有趣而优雅起来,咳咳,废话不多说,丑图说明持久化的思想想:

先上一张我以前字节利用jdbc操作数据库的流程丑图

然后,下面是一大坨无趣的jdbc操作代码(由于太无趣,我只能折叠起来了,相信没谁有心情看它):

public void doJdbc(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
//1,加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/atm","root","root"); //创建一个可向数据库发送SQL命令并返回结果的传送对象Statement
stmt = conn.createStatement();
//将sql命令通过传送对象Statement传送到数据库执行,并返回结果
String sql = "select * from account1";
rs = stmt.excuteQuery(sql);//excuteQuery()方法用于执行查询语句,返回结果表
//处理结果集
while(rs.next()){
String code = rs.getString("code");
int password = rs.getDouble("money"); //根据游标获取
// String code = rs.getString(1);
// String password = rs.getInt(2);
// double money = rs.getDouble(3);
System.out.println(code + password + money); }
}catch(Exception e){
e.printStack();
}finally{
try{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(Exception e){
e.printStack();
} }
}

  然后,hibernate或者说持久化思想又是如何处理这些困境的呢?先看它的思想:对象持久化

大概,从这个个人画的丑图中知道:hibernate将内存中的dto对象直接映射到数据库中对应的表,我们可以直接操作对应的dto对象便可达到操作数据库的效果,hibernate所封装的jdbc操作,对我们而言是透明的!

这想想就激动啊,这种思想直接将数据库的操作对象化,我们终于可以以更直观的面向对象思维来进行数据库的操作了,相比以前的在java中手动组装对象和sql语句的过程式jdbc操作,简直太爽啦,毕竟可以用面向兑现解决问题时,一切看起来都是那么地直观!

OK,对象持久化的大概思想估计也总结得差不多了,hibernate只是一个中间者,它会帮我们将对象持久化,而我们,只需要享受它带来的好处就行了。

二、hibernat持久化对象

  1、对象的持久化。首先,我们先认识hibernate的核心对象Session,在hibernate中,session对象是连接java对象和数据库的主要中间者,在java beans 和session关联起来后,对象中的修改都会相应地反映到数据库中(当然,前提是进行了事务的提交操作,这个稍后讨论),session和java bean对象的关系是类似于一个管理者和被管理者的关系,具体看下丑图:

大概,上图也说清楚了session是如何将普通对象持久化起来的:就是调用session的save或者saveOrUpdate(二者作用稍后讲),使得对象持久化起来,具体看代码例子:

//实例一:hibernate中对象的持久化方法
public void objPersistence(){
//创建session工厂对象
SessionFactory factory = new Configuration().configure().buildSessionFactory();
//创建sessio对象
Session session = factory.openSession();
//初始化一个普通java bean 对象
Person person = new Person();//这时,Person对象刚new出来,并没有和任何数据库进行关联
//调用session进行对象持久化
session.save(person);
//当然也可以这样持久化:session.saveOrUpdate(person); }

  通过持久化后,对象的修改便会反映到数据库中,具体请往下看;

  2、面相对象式地数据库修改操作。在上面中,当对象进行持久化之后,变可以针对持久化之后的对象进行操作了,而这些操作,会动态地反映到数据库中,具体看下面的例子代码:

public void objPersistence(){
//创建session工厂对象
//加载配置文件,这里配置文件的具体书写之后的博客会提到如何将数据库与对象映射起来
SessionFactory factory = new Configuration().configure().buildSessionFactory();
//创建sessio对象
Session session = factory.openSession();
//初始化一个普通java bean 对象
Person person = new Person();//这时,Person对象刚new出来,并没有和任何数据库进行关联
//调用session进行对象持久化
session.save(person);
//当然也可以这样持久化:session.saveOrUpdate(person);
//person对象已经持久化了,这时,我们可以直接通过操作对象便可以达到操作数据库的目的了
Transaction transaction = null;
try{
//首先,我们需要显式地开启事务(因为hibernate将自动提交的功能关掉了)
transaction = session.beginTransaction();
person.setAge(11);//这里对象person进行修改后,在transaction的commit动作发生之后会反映到数据库中去
//显式提交
transaction.commit();
}catch (Exception e) {
// TODO: handle exception
transaction.rollback();//发生异常,需要回滚事务
}finally{
session.close();//事务执行完必须释放session资源
} }

  这个例子展示了,当对象进持久化后,我们可以直接操作对象来对数据库进行操作,这是不是炒鸡美妙的事情?

OK,每篇博客不宜过长,(毕竟,我要尽量多水点东西来显得我的博客很多啊哈哈开个玩笑而已)这只是一片简单阐述一个思想——对象持久化思想的博客罢了,对于具体的其他持久化操作,这篇博客只是简单地进行了讲解,后面的博客会更详细地说到对象持久化之后该如何做以及相关的配置文件如何书写的问题,当然,只要你在看了这篇博客之后,大概知道,hibernate帮我们解决了什么问题以及体会到对象持久化的思想,那就够了!

Hibernate学习1--对象持久化的思想的更多相关文章

  1. Hibernate学习之对象持久化

    1.  对象持久化 对象的持久化就是把内存中对象形式的业务数据,转换成数据库中的关系数据形式的业务数据.广义理解,对象的持久化还包括内存与关系数据库之交换业务数据的各种操作. 2. 对象持久化模式 1 ...

  2. hibernate学习笔记之三 持久化的三种状态

    Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...

  3. 《精通Hibernate:Java对象持久化技术详解》目录

    图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...

  4. Hibernate学习2--对象的三种状态以及映射关系的简单配置

    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...

  5. hibernate学习之持久化对象

    Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...

  6. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  8. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  9. 怎么搭建Hibernate对象持久化框架?

    DBC:(Java Data Base Connectivity)java数据库连接 java.sql包提供JDBC API,可通过它编写访问数据库的程序代码.其中常用的接口和类包括下面内容: Dri ...

随机推荐

  1. 推荐一些优秀的SAP网站

    著名的SAP论坛:(人气比较旺,可以找到很多问题的回答) http://www.sapfans.com/ 著名的It专业网站的SAP部分:(查找部分资料) http://sap.ittoolbox.c ...

  2. NOI2014起床困难综合症

    Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...

  3. ubuntu和centos 编译安装nginx及常用命令

    转自http://www.cnblogs.com/piscesLoveCc/p/5794926.html 一. ubuntu安装 1. 安装依赖库 安装gcc g++的依赖库 ubuntu平台可以使用 ...

  4. python学习笔记之使用threading模块实现多线程(转)

    综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势 ...

  5. Eclipse Alt + / 快捷键失效

    需要重新设置快捷键.按快捷键ctrl+shirt+L,然后在按一下L.设置快捷键的对话框就出来了,然你将Word Completion移除,在将Content Assist 这个设置为alt+/.就可 ...

  6. POJ_2886 Who Gets the Most Candies? 【二分+树状数组】

    一.题目 POJ2886 二.分析 这个题目吧,开始没读懂,做的时候也没懂,WA的时候懂了.假设是第p个出圈的人有一个对应的因子个数$F(p)$,那么,题目求的就是这个$F(p)$最大的对应的人. 1 ...

  7. 【车联网系统】基于Python实现的现网全自动化测试方案

    前面写了几篇基于CANoe实现的仿真测试台架,属于半自动化测试方案.现出一个Python实现的车联网系统全自动化测试方案. 目录结构 1.-----------------------车联网系统组成 ...

  8. 安装notepad++之后鼠标右键无Edit with notepad++

    在鼠标右键上加入使用notepad++编辑 最近发现一个问题在安装完notepad++文本编辑器之后,在一个文本文件上右键有时候并没有出现“使用notepad++编辑的选项”,不用着急可以通过简单地修 ...

  9. 浅谈Cordova优缺点与环境部署(转载)

    浅谈Cordova优缺点与环境部署 作者:苏华杰 简介 Cordova是一个用基于HTML.CSS和JavaScript的,用于创建跨平台移动应用程序的快速开发平台.它使开发者能够利用iPhone.A ...

  10. ios 得到每周的星期一开始和星期天结束的日期

    得到每周 星期一零点(即本周的开始) 和星期天 24 点(即本周的结束和下一周的开始)的时间 NSDate *now = [NSDate date]; NSCalendar *calendar = [ ...