Hibernate学习1--对象持久化的思想
前些天开始接触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--对象持久化的思想的更多相关文章
- Hibernate学习之对象持久化
1. 对象持久化 对象的持久化就是把内存中对象形式的业务数据,转换成数据库中的关系数据形式的业务数据.广义理解,对象的持久化还包括内存与关系数据库之交换业务数据的各种操作. 2. 对象持久化模式 1 ...
- hibernate学习笔记之三 持久化的三种状态
Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...
- 《精通Hibernate:Java对象持久化技术详解》目录
图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...
- Hibernate学习2--对象的三种状态以及映射关系的简单配置
上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...
- hibernate学习之持久化对象
Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- 怎么搭建Hibernate对象持久化框架?
DBC:(Java Data Base Connectivity)java数据库连接 java.sql包提供JDBC API,可通过它编写访问数据库的程序代码.其中常用的接口和类包括下面内容: Dri ...
随机推荐
- [Maven实战-许晓斌]-[第二章]-2.2基于UNIX系统安装maven
>> >> >>3
- 三,PHP中错误日志display_errors与error_reporting配置
1,display_errors display_errors 错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利 ...
- 【FAQ】maven包引入版本引发的问题
pom.xml文件中的 dependency顺序可能会引起jar包版本不一致的问题,越上面越先引入进来
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- 如何 3D 打印一个密码锁
简评:这篇文章介绍怎么用 3D 打印机做一个密码锁,巧妙地利用机械结构的变化实现锁的功能,相当有趣! 3D 打印机非常适合打印静态物体.如果你够聪明,还可以打印出功能物件.如果你特别特别聪明,那你能做 ...
- iOS开发之动画中的时间(概况)
一.引言 在iOS开发中使用动画时,可以通过设置动画的duration.speed.begintime.offset属性,来设置动画的时长.速度.起始时间及起始偏移. 用一个简单的例子来说明各个参数的 ...
- CentOS6.9 ARM虚拟机扩容系统磁盘
由于扩容磁盘的操作非同小可,一旦哪一步出现问题,就会导致分区损坏,数据丢失等一系列严重的问题,因此建议:在进行虚拟机分区扩容之前,一定要备份重要数据文件,并且先在测试机上验证以下步骤,再应用于您的生产 ...
- mysql的联合索引的误解
https://www.zhihu.com/question/36996520 之前对于联合索引有一个误区, 假设 name,age为一个联合索引 5条索引记录 a 10 b 5 c 12 c 15 ...
- webpack---less+热更新 使用
最近尝试用less写界面,webpack进行打包,然后发现每次修改less时都需要重新执行webpack打包一下,于是就想到了webpack热更新这个功能. 一.使用less less是一门css预处 ...
- springAOP实现方法运行时间统计
aop的before和after,寻思分别在两个方法里获得当前时间,最后一减就可以了. 因此,今天就探讨了一下这个问题,和大家分享一下. 创建maven工程,引入spring的依赖包,配置好appli ...