不喜勿喷..麻烦各位看到错误了评论一下..以便改正..
Hibernate
什么是Hibernate
Hibernate是一个开放源代码的orm(Object Relation mapping 对象关系映射) 框架,主要是对jdbc进行了轻量级的封装;
Hibernate与Ibatis的区别以及优缺点
Hibernate与ibatis的区别:
1、ibatas的sql语句需要自己手动写,而hibernate能够在程序运行时自动生成,hibernate还能自动创表;
2、iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比 Hibernate要大很多;例如修改了某个表里面的结构,hibernate只要修改映射文件和javaBean;而ibatis要一一去修改;
Hibernate:
Hibernate的优点:
1、SQL语句都被封装,开发效率高;
2、性能比较好,可以很好的映射各种关系型数据库,可移植性高;
Hibernate的缺点:
1、不是很灵活,不容易被控制;
2、对持久层数据封装过于完整,无法对SQL进行优化;
3、如果数据库的表过多,关系也很复杂,hibernate就会变得很难维护;
Ibatis:
Ibatis的优点:
1、使用较灵活,更好被控制;
2、易于学习,易于使用,通过文档和源代码,便可知晓它的设计思路和实现;
Ibatis的缺点:
1、sql需要自己写;
2、半对象关系映射,工具支持较少;
Hibernate的核心接口和作用
六大顶级接口:Session、SessionFactory、Transaction、Query、Criteria、ConfigurationSession:
主要是对持久化对象的操作和对数据库的访问,以及常见的SQL语句,需要注意的是session它的线程不是安全的;
SessionFactory:
主要是对session进行实例化,可以创建session对象,
Transaction:
主要是对事物的控制,这个接口是可选的,可以自己写事物
Query、Criteria:
主要是对数据库的各种查询访问,可以使用HQL和SQL这俩中语言;
Configuration:
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象;并且定位映射文档位置、读取配置,然后实例化SessionFactory;
Hibernate的三种状态
三种状态的简介:
Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
三种状态的区分:
持久态[持久化对象 po]:
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识;可以通过session中的delete来让它成为一个瞬时态
托管态[值对象 vo]:
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
瞬时态[值对象 vo]:
不和数据库的数据有任何关联关系,但是可以通过session中的save或者saveOrUpdate方法将瞬时态转为持久态
Java术语
Po(persistant object) 持久化对象
Po中应该不包含任何对数据库的操作
PoJo(plain ordinary java object) 简单无规则java对象
最基础的java bean类,里面只有属性字段以及get、set方法
Vo(value object) 值对象
业务层之间的数据传递,和PO一样也是仅仅包含数据而已
Bo(business object) 业务对象
通过调用数据访问对象中的方法,结合持久化对象和值对象对数据库进行处理
Dao(data access object) 数据访问对象
DAO中包含了各种数据库的操作方法,通常和持久化对象结合使用,通过它的方法,结合持久化对象对数据库进行相关的操作
dto(Data Transfer Object)数据传输对象
主要用于远程调用等需要大量传输对象的地方。
Load和get方法的区别相同点:
Get和load都是通过id来查询,并且查询出来是持久状态;
不同点:
如果找不到符合条件的记录,get方法返回null,而load方法抛出异常;
当数据不变时,get会查询一级缓存、二级缓存,若是在缓存中不存在,则会去查询数据库;
而load是查询一级缓存后,若是在一级缓存中没有找到对应数据,则会创建一个代理对象,然后根据这个代理对象id去查找二级缓存和数据库;
List 和iterator的区别
相同点:
他们查询出来都是结果集;
不同点:
返回的类型不一样,list()返回List, iterate()返回Iterator,
list对缓存只写不读,然而iterator却充分的利用到了写进去的缓存;
若是缓存区中没有记录,使用iterator访问数据库会出现N+1条查询语句,而list始终都是一条;
如果SQL语句不变同时数据也没被改变的情况下,list直接取的缓存而不用再连接数据库进行检索操
作;iterator方法用n+1此来获得所有数据信息同时放到缓存中,不管SQL语句变没变始终会发送一
条获得ID的SQL语句,然后根据ID查找缓存,如果没有则再发送一条SQL语句获得该对象;
三大常用查询方式
HQL
什么是HQL
Hql (Hibernate query language) 为hibernate提供了灵活的查询方式,和sql很相似,hql采用面向对象的查询方式;
Hql查询
HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点;
对象化查询Criteria方法:
面向对象操作,易读;
sql查询
关联关系
关联关系本质
关联关系是指对象模型在内存中的一个或者多个引用;
一对多关联
<many-to-one>会在多的一端加入一个外键,指向一的那一端。
使用:这个外键由<many-to-one>标签中的column属性定义,如果不写此属性,默认外键与实体的属性一致;
一对一关联
它是多对一关联映射的特例,也可以说是一个特殊的多对一;
使用:采用<many-to-one>标签,指定多的一端unique=true(对配置的唯一性约束字段进行唯一性检查),这样可以限制 多的一端的多重性为一。
多对多关联
它的映射需要借助于第三方表,也可以说是他们之间的中间表;
使用:<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致
缓存
内置缓存
Session的缓存是内置的,不能被卸载,也被称为Hibernate的一级缓存,内部是封装的一个map;
外置缓存
SessionFactory的外置缓存,借助于第三方插件(例如:jbossCache、EHCache)来进行工作;默认情况下是不启用的;
缓存级别
一级缓存:session
一级缓存是由Session提供的,所以它只存在于Session的生命周期中,一级缓存是由Session提供的,所以它只存在于Session的生命周期中,如果session缓 存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除;
二级缓存:sessionFactory
二级缓存是全局缓存;缓存可以简单的看成一个Map,通过key在缓存里面找value;
缓存范围
事务范围:
事务范围的缓存只能被当前的事务访问,而且每个事务都有各自的缓存空间,缓存内的数据通常采用相互关联的对象形式存在,事务范围的缓存生命周期是依赖于事务的生命周期,只有当事务结束时,缓存才会消失;
应用范围:
应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束;
集群范围:
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点
事务的隔离级别
Hibernate使用隔离级别:
在Hibernate的配置文件中可以显示的配置数据库事务隔离级别。每一个隔离级别用一个整数表示:
8 - Serializable 串行化
4 - Repeatable Read 可重复读
2 - Read Commited 可读已提交
1 - Read Uncommited 可读未提交
Serializable 串行化
使用串行化隔离级别后,必须等前一个事务结束后,这一个事务才能开始;
Repeatable Read 可重复读
当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行
Read Commited 可读已提交
它只读取已提交的数据,换句话说就是,任何未提交的数据它都会置之不理,直到数据提交为止;
Read Uncommited 可读未提交
一个事务读到另一个事务还没有提交的数据。
查询缓存
锁
锁的作用
保证某些数据在某个操作过程中不会被外界修改;
乐观锁:
乐观锁的原理:
读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一;
乐观锁的作用:
大多是基于数据版本(Version)记录机制实现;
悲观锁:
悲观锁的原理:
基于数据库的锁机制实现,适合于当前数据库的悲观锁不一定适合其他数据库,每一个数据库都有它自己的悲观锁;
悲观锁的作用:
它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态
度,当某些数据被悲观锁锁定后,这些数据做删除、修改不能进行;
怎样避免n+1问题
1、使用二级缓存可以避免n+1;
2、使用fetch="join",让它一次性加载数据,这样懒加载就失去了意义,也就不会出现n+1问题;
3、修改lazy 属性,lazy默认是true(true为懒加载);将它的属性改为:lazy="false",这样就不会出现n+1问题;biwpn
相关推荐
Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...
Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...
【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个压缩包包含了丰富的Hibernate学习资源,旨在帮助开发者深入理解和熟练掌握这一强大的...
《Hibernate-Extensions全面指南》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要...
【描述】中的"hibernate的jar包"指的是Hibernate框架的运行库文件,这些JAR文件包含了Hibernate的所有核心API、实现和依赖库,如Hibernate Commons Annotations、Hibernate EntityManager、Hibernate Core等。...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了Hibernate的基础jar包,这些jar文件是开发Hibernate应用所...
HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...
在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...
Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...
Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...
标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...
标题"Hibernate 中文api 等学习资料"暗示了这是一组针对Hibernate ORM框架的中文学习资源,包括API文档和其他指南,旨在帮助用户更好地理解和使用Hibernate。 描述中的"hibernate orm框架api中文文档,学习资料,...
包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....
Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者可以更加专注于业务逻辑而不是数据访问层的实现。本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之...
Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...
Hibernate 是一个著名的开源对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方式,使得在Java应用程序中操作数据库变得更加简单。这个“hibernate_3.2官方开发包”包含了所有你需要开发基于...
在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。当涉及到Hibernate项目时,为了使其正常运行,通常需要一系列的JAR(Java ...