大家好,我是IT修真院成都分院第7期的JAVA学员龚剑飞,一枚正直纯洁善良的java程序员。
今天给大家分享一下,一个比较好用的ORM框架————Hibernate。
1.背景介绍
先介绍下背景
Hibernate是什么?
Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开始准备冬眠了。其实对于对象来说就是持久化。
ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)。
Hibernate的产生背景:
大多数应用程序都需要处理数据。Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法。有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将其表示为对象的方法。手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用整个应用程序的很大一部分开发工作量。
Gavin King开发hibernate的动机有两个:发现CMP太烂;赢得对老板的争执。Gavin King当时没有任何用SQL开发数据库的经验,Gavin King开发hibernate的第一件事是去街上买了本SQL基础的书
2.知识剖析
执行流程
Configuration接口:负责配置并启动Hibernate
SessionFactory接口:负责初始化Hibernate
Session接口:负责持久化对象的CRUD操作
Transaction接口:负责事务
Query接口和Criteria接口:负责执行各种数据库查询
3.常见问题
如何操作Hibernate?
4.解决方案
来给大家演示一下基本操作
5.编码实战
6.扩展思考
Mybatis同样也是非常流行的ORM框架,主要着力点在于 POJO 与 SQL 之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO 。相对Hibernate“O/R”而言,Mybatis 是一种“Sql Mapping”的ORM实现。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。
7.参考文献
CSDN博客
8.更多讨论
问:hibernate和mybatis的主要区别是什么?
答:hibernate更重,一些简单的语句不用自己写。
MyBatis要轻量化一些,sqlmapper是必须自己写的
问:讲一下orm
对象关系映射,其实就是把JAVA代码中的一个类,和数据库中的一张表相对应
问:load()和get()的区别
load是延迟加载,get是立即加载。
问:hibernate的全自动体现在什么方面
体现在如果你只用简单的语句,是不用自己写的
问:说下Hibernate的缓存机制
evit(Object obj)将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象。
clear()将一级缓存中的所有持久化对象清除,释放其占用的内存资源。
contains(Object obj)判断指定的对象是否存在于一级缓存中。
flush()刷新一级缓存区的内容,使之与数据库数据保持同步。
try{/*开启一个事务*/tx=session.beginTransaction();/*从数据库中获取id="402881e534fa5a440134fa5a45340002"的Customer对象*/Customer customer1= (Customer)session.get(Customer.class, "402881e534fa5a440134fa5a45340002");
System.out.println("customer.getUsername is"+customer1.getUsername());/*事务提交*/tx.commit();
System.out.println("-------------------------------------");/*开启一个新事务*/tx=session.beginTransaction();/*从数据库中获取id="402881e534fa5a440134fa5a45340002"的Customer对象*/Customer customer2= (Customer)session.get(Customer.class, "402881e534fa5a440134fa5a45340002");
System.out.println("customer2.getUsername is"+customer2.getUsername());/*事务提交*/tx.commit();
System.out.println("-------------------------------------");/*比较两个get()方法获取的对象是否是同一个对象*/System.out.println("customer1 == customer2 result is "+(customer1==customer2));
}
customer1== customer2 result istrue
undefined_腾讯视频
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~我的邀请码:13869506,或者你可以直接点击此链接:http://www.jnshu.com/login/1/13869506
网友评论