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 ...
随机推荐
- 让子类使用父类的Logger
参考博客:https://blog.csdn.net/zx1323/article/details/71262613 1.让子类使用父类的Logger,这是一种语法思路,可以减少代码臃肿. 2.使用的 ...
- 北航软院2013级C#期末考试部分考题解答
博主注:本渣渣水平有限,文中若有不对的地方敬请指出,谢谢. 本文中大部分图片来自老师的PPT,感谢邵老师,想要的可以点击右边QQ联系我:) 一.选择题 2.Wrong statement? A.dou ...
- Hibernate 使用注释书写配置文件
Hibernate 使用注释 Hibernate使用注释有个好处就是我们不需要建立.hbm.xml文件,直接在实体类中添加注解就可以完成往数据库中进行数据操作 配置文件:hibernate.cfg.x ...
- for ++i i++
study from: https://zhidao.baidu.com/question/339305815.html 处理方式的不同,速度上的微妙不同 有些高手能喜欢用++i,速度上快一点
- css属性详解和浮动
一.CSS属性组成和作用 属性:属性值 1)每个css样式都必须由两部分组成:选择符和声明 注:声明又包括属性和属性值 2)css属性:属性是指定选择符具有的属性,他是css的核心,css2共有150 ...
- 【笔记】Django的视图
[笔记]Django的视图 Python Django Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应 ...
- nginx如何设置禁止访问文件或文件夹
目标: 1. 根目录 webroot: 2. 设置目标文件 /webroot/proj/deny.txt 不能访问: 做法: 1. 设置 nginx.conf ,添加一个“location”段落: 2 ...
- windows使用putty向远程服务器传送文件
一.问题产生 对于远程服务器,我习惯把文件写好后直接上传到服务器,也有很多方法可以做到,我现在比较习惯使用putty自带的pscp直接去传. 二.解决办法 1.首先在本地下载的putty文件下看是否有 ...
- [蓝桥杯][2016年第七届真题]路径之谜(dfs)
题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡. 城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到东南角. ...
- kamctl start
尽管没有吃饭,胃酸,九点半,,,还是挺高兴的.只截图不说话. 这个问题弄得我好烦啊.几个小时...网罗了国外几个论坛都没有解.我还没有想到这就不是问题,,,多试多试 再看看moni 也没什么意思,就是 ...