JAVA编程免不了和数据库打交道,那么如何高效便捷地操做数据库,也是一个须要而对的问题,原生的基于JDBC的方式固然是很是低效,并且要写一大堆无用的模板代码,不值得选取。好在咱们不须要重复的造轮子,目前已经有不少优秀的ORM框架可供使用了,常见的好比Hibernate, Mybatis,TopLink等,JAVA EE3.0规范中提出的JPA,一样也是十分的好用,因此有时面试官也会问一下些和这个相关的面试题,下面整理一些我的遇到,或者网上常常看到的一些面试题 。html
1、什么是JPA,为何要有JPA?java
JPA的全称是Java Persistence API, 即JAVA 持久化API,是EJB 3.0 的专家推出,做为 JSR-220的一部分,简单点来讲能够理解为是一个JAVA的标准规范,这个规范为对JAVA对象的持久化制定了一些标准的接口,也能够说,面试
JPA是一个标准的ORM(对象关系映射)规范。数据库
那么为何要有JPA呢?时下ORM框架不少,不一样的ORM框架相互之间并不兼容。SUN也意识到了,对于JAVA对象的持久化是一个重要的内容,提出这个规范,一方面是为了简化EJB中对于对象持久化的操做,另外一方面,也但愿经过制定统一规范,达到一统ORM标准的目的。编程
JPA虽然是为EJB服务,但并不对JAVA对象有特别的要求,它能够是一个普通的POJO,仅此而已。该规范主要包括三部份内容,即ORM映射元数据,标准接口API,以及查询语言。缓存
要注意的是JPA只是一个接口规范,而不是实现,具体实现由各供应商来完成,目前的话,Hibernate,TopLink,OpenJPA都很好地实现了JPA接口。session
要基于JPA操做数据库,须要有一个persistence.xml配置文件,具体的几个关键类是EntityManagerFactory, EntityManager, 经过EntityManager的实例,咱们能够对JAVA对象进行操做,如persist, merge, remove, createQuery等。mybatis
2、Hibernate并发
Hibernate多是最经常使用的ORM框架了,总体表现上来看仍是比较优秀。不得不提一下他的创始人:Gavin King,听说他是由于没法所爱EJB1.1的臃肿的模式代码而要寻求改变,而在写Hibernate以前,作的第一件事,竟然是先去买了一本SQL基础的书。这也说明,要成功,一是要想法,二是,立刻作手去作。框架
要进行Hibernate开发,我以为有几个点是须要了解的,一是配置文件,默认的hibernate.cfg.xml,和对象对应的配置文件,如User.hbm.xml。另外和JPA相似,Hibernate中也有几个重要的对象,如Configuration, SessionFactory, Session, Transaction, Query, Criteria. 只要知道它们如何使用,创建一个DEMO工程即是一件很简单的事了。下面说一个几个常见的问题:
2.1 建立SESSION有哪两种方式,它们有什么区别?
Hibernate里的Session对象主要负责对对象进行CRUD操做,建立Session有两种方式,第一种是openSession,另一种是getCurrentSession.
第一种方式下,老是会新建一个会话,当会话结束后,须要手动进行关闭以释放资源,而getCurrentSession则会和当前线程关联,若是当前线程没有,则新建一个,若是有,则取当前的,这个的特色是不须要手动关闭,当事务提交后,就自动关闭了,并且再调用其关闭接口反而会报错。不过这种方式须要咱们在配置文件中设置下面这一项
thread
其底层应该是基于ThreadLocal实现的。一般状况下,咱们使用这一种便可。
2.2 LOAD和GET有什么区别?
load和get都是从数据库中查询指定主键的记录。参考网上的资料,整理以下:
相同点:都会先查找session缓存,若缓存中有,则直接返回。
不一样点:load认为数据库中必定是有这条记录的,因此若不存在,则先会建立一个代理对象,当真正使用这个对象
的数据时,才会再去查询二级缓存和数据库,这就是所谓的延迟加载。若查不到,则返回ObjectNotFoundException。而对于get来讲,则会直接依次查找二级缓存和数据库,查不到的话,则直接返回null.
2.3 Hibernate中的主键类型主要有哪几种?
对于自增型的数据库,使用identity,如MYSQL,对于序列化的主键,使用Sequence,如Oracle。若是不清楚,能够用native.
2.4 Hibernate中的缓存机制?专业java培训认为主要分为两类缓存,即所谓的一级缓存和二级缓存。一级缓存是session级别的,也是强制使用的,咱们无需过多的关心也没法干预其使用。当咱们用Session对Java对象进行crud操做时会用到,好比添加,是先将对象放到 一级缓存中,这个时候信息并未入库,而是在缓存中,当调用了commit以后再入库的。
二级缓存位于sessionFactory的级别,也就是说,同一sessionFactory下,二级缓存中的对象,是能够被全部的session共享的,但这个缓存基于外部缓存组件,须要手动配置和开启。常见的有EHCache。
因为被session共享,因此就存在并发的问题,因此,二级缓存,只适合存储那些不常常修改,非重要数据,偶尔或几乎不会产生并发的数据。
查询的时候,会先查缓存,再查数据库,更新的时候,也会先更新缓存,再更新数据库。
Hibernate中还有一类缓存叫作查询缓存,只有查询的时候才起做用,这一类通常用途不是太大。
3、 Mybatis
mybatis的前身是ibatis,源于 Apache的一个开源项目。一样的,这是一个ORM框架,不过这个框架最大的特色有三点,一是面向接口编程,二是能够在配置文件中定义SQL语句,三是支持动态SQL,这是其独特的一面。
在网上找了一下,相关的面试题很少,说一下我遇到的吧
3.1 Mybatis中#和$的区别?
这两个均可以做为占位符,不过#{}里的占位符,mybatis会加以处理,相似于普通SQL中的?,这样的话能够避免SQL注入的问题。
而 $ 则是原样输出,没法避免SQL注入的问题,一般状况下,咱们优先使用#,但若是有的时候,咱们就是要传一个字段名进去,那么使用$,好比 order by \${id}
3.2 Mybatis和Hibernate比较?
相同点就不说了,说一下主要区别:
1. mybatis手写SQL,而hibernate提供映射机制,开发人员无需关心
2. mybatis控制更细粒度,但可移植性差,hibernate开发DAO很简单,可移植性好
3. mybatis容易上手学习,hibernate难度稍大
4. hibernate提供了面向对象的SQL语句HQL,也能使用普通的SQL,但mybatis只能使用普通的SQL。
以上是我的总结的对这三个框架的一些理解,后续若再遇到相关的面试题,再补充上来