1.hibernate工作原理 为什么要用?
hibernate是 轻量级框架 映射灵活性很出色 支持各种关系数据库
一个基于jdbc的主流持久化框架,是一个优秀的orm实现 简化DAO层的编码工作
java反射机制 而不是字节码增强程序来实现透明性
读取并解析配置文件
读取并解析映射信息创建sessionfactory
打开session
创建事务transation
持久化操作
提交事务
关闭session
关闭sessionfactory
2.hibernate的并发机制 怎么去处理并发问题
session对象是非线程安全的对于单个请求,单个的工作单元,单个会话
通常只使用一次然后就丢弃
多个事务并发访问同一块资源回引发丢失更新,脏读,幻读,不可重复读
设置事务隔离级别
serializable cierlaizibao串行化 隔离级别最高
repeatable read 可重复读
read committed 已提交数据读
read uncommitted 未提交数据读 隔离级别最差
设置乐观锁和悲观锁
3.update和saveOrUpdate的区别
update()方法的对象必须是持久化的对象
saveorupdate()方法操作的对象可以使持久化也可以使没有持久化的对象
4.hibernate三种状态之间如何转换
瞬时状态save()时----session储存MAP持久化状态session.close()---游离状态
5.比较hibernate的三种检索策略优缺点
立即检索
优: 对应用程序完全透明
缺: select语句太多 可能会加载不需要访问的对象白白浪费许多内存空间
延迟检索
优:可以避免 执行多余的select语句 提高检索性能节省内存空间
缺:如果希望访问游离状态代理类实例必须保证他在持久化状态时已经被初始化
迫切左外连接检索
优:对应用程序完全透明 使用了外连接select语句数目少
缺:加载不需要访问的对象,白白浪费许多内存
6.支持哪些缓存策略
read-only 适用于那些频繁读取却不会更新的数据
read/write适用于需要被更新的数据 每个事务需要在session.close和session.disconnect()被调用
Nonstrict read/write:适用于那些经常读取但是极少更新的数据
Transactional: 完全事务化得缓存策略
7.sorted collection 和ordered collection 的区别
通过java比较器进行排序 通过order by 进行排序的
8.Hibernate中怎样实现类之间的关系?
many-to-one、one-to-many、many-to-many、
9.Hibernate是如何延迟加载?
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,
对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务
器的性能。
10、说下Hibernate的缓存机制
内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新
频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现
11、Hibernate的查询方式
Sql、Criteria,objectcomposition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
12、如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰
13、Hibernate有哪几种查询数据的方式
3种:hql、条件查询QBC(QueryBy Criteria)、原生sql (通过createSQLQuery建立)
14、谈谈Hibernate中inverse的作用
inverse属性默认是false,就是说关系的两端都来维护关系。
比如Student和Teacher是多对多关系,用一个中间表Teache
rStudent维护。Gp)i
如果Student这边inverse=”true”,
那么关系由另一端Teacher维护,就是说当插入Student时,
不会操作TeacherStudent表(中间表)。只有Teacher插入或
删除时才会触发对中间表的操作。所以两边都inverse=”true”
是不对的,会导致任何操作都不触发对中间表的影响;当两边都
inverse=”false”或默认时,会导致在中间表中插入两次关系。
17、Detached Object(游离对象)有什么好处
可以传递到任何层直到表现层而不是用任何DTO(DataTransfer Objects).
然后你还可以重新把游离对象赋给另外一个Session.
18、JDBC hibernate 和 mybatis 的区别
JDBC:
1,使用jdbc编程需要连接数据库,注册驱动和数据库信息
2,操作Connection,打开Statement对象
3,通过Statement对象执行SQL,返回结果到ResultSet对象
4,使用ResultSet读取数据,然后通过代码转化为具体的POJO对象
5,关闭数据库相关的资源
jdbc的缺点:
一:工作量比较大,需要连接,然后处理jdbc底层事务,处理数据类型,
还需要操作Connection,Statement对象和ResultSet对象去拿数据并关闭他们。
二:我们对jdbc编程可能产生的异常进行捕捉处理并正确关闭资源
Hibernate:
建立在若干POJO通过xml映射文件(或注解)提供的规则映射到数据库表上的
通过POJO直接操作数据库的数据,他提供的是一种全表映射的模型
Hibernate对JDBC的封装程度还是比较高的,我们已经不需要写SQL,只要使用HQL语言就可以了。
使用Hibernate进行编程有以下好处:
1,消除了代码的映射规则,它全部分离到了xml或者注解里面去配置。
2,无需在管理数据库连接,它也配置到xml里面了。
3,一个会话中不需要操作多个对象,只需要操作Session对象。
4,关闭资源只需要关闭一个Session便可
在配置了映射文件和数据库连接文件后,Hibernate就可以通过Session操作,非常容易,消除了jdbc带来的大量代码,大大提高了编程的简易性和可读性。Hibernate还提供了级联,缓存,映射,一对多等功能。
Hibernate是全表映射,通过HQL去操作pojo进而操作数据库的数据。
Hibernate的缺点:
1,全表映射带来的不便,比如更新时需要发送所有的字段。
2,无法根据不同的条件组装不同的SQL。
3,对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
4,不能有效的支持存储过程。
5,虽然有HQL,但是性能较差,大型互联网系统往往需要优化sql,而hibernate做不到。
Mybatis:
Mybatis是半自动的框架。之所以称它为半自动,是因为它需要手工匹配提供POJO,sql和映射关系
Mybatis需要提供的映射文件包含了一下三个部分:sql,映射规则,pojo。
Mybatis可以配置动态sql,解决了hibernate表名根据时间变化,不同条件下列不一样的问题,同时你也可以对sql进行优化,通过配置决定你的sql映射规则,也能支持存储过程,
所以对于一些复杂和需要优化性能的sql查询它就更加方便。
1)从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。
2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便.
3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。