1.讲下什么是Hibernate?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,数据持久化
2.讲下什么是ORM?ORM组件有哪些?
对象关系映射
1)JDBC
2)Hibernate
3)MyBatis
4)SpringData
3.Hibernate和JDBC相比的优点是什么?缺点是什么?
jdbC:
缺点:
1、查询语句比较繁琐
注:因为使用jdbC查询语句的时候,要把数据封装在ResultSet中,而且读取里面的数据还要判断里面是否有内容。
2、在关闭资源的时候,本来就是在finally里面关闭资源,但是在finally代码块里面,还要进行try、catch,
3、jdbC没有实现数据的缓存,在面对需要不断向数据库发送请求的情况时,效率非常不乐观
4、sql语句的移植性不好,比如jdbC的分页跟Oracle是不一样的,如果把数据库改成Oracle,那么代码就要重写。
优点:
1、因为jdbC是原始的操作数据库的框架,所以其效率比较高
2、因为它是原始,所以封装的内容不多,可控性好;比如struts2框架,封装的内容 太多了,可控性差。
hibernate的缺点:
1、因为hibernate的操作数据库的代码是其内部生成的,所以程序员对sql语句不好把控
2、由于上面的原因,对于有庞大数据量的数据库(超过千万级别),也不适合使用hibernate,因为发出了sql语句会导致操作数据库的效率低
优点:、
1、操作简单,再也不用频繁的try,catch
2、hibernate实现了数据的缓存,并且有三级缓存分别是:一级缓存,二级缓存和查询缓存
3、因为hibernate是ormapping框架(object-relation mapping对象关系映射),并且ormapping是面向对象的,所以移植性也会比较好
4.如何搭建一个Hibernate的环境
4.环境搭建
1)导入jar包
2)配置文件
a)hibernate.cfg.xml
1)连接数据库的参数
2)Hibernate属性
3)映射文件的路径(以/为分隔符)
b)User.hbm.xml
1)命名:EntityName.hbm.xml
2)位置:和实体类放在一起
3)内容
a)<hibernate-mapping>
1)package:实体类的包名
2)<class>
a)name:对象名称
b)calss:表名称
c)<id>:id属性就用该标签修饰
1)name:对象中的属性名称
2)column:表中的列名称(如果name和column一样,column属性可以不写)
d)<property>:非id普通属性用该表示修饰
1)name:对象中的属性名称
2)column:表中的列名称(如果name和column一样,column属性可以不写)
5.说说hibernate的三种状态之间如何转换?
瞬时状态:transient,session没有缓存对象,数据库也没有对应记录
持久状态:persistent,session有缓存对象,数据库有对应的记录
托管状态:detached,session没有缓存对象,数据库也有记录
6.Hibernate中session有几种创建方式?都有那些区别?
1.openSession()每次创建新的session对象,getCurrentSession()使用现有的session对象 (类似单例模式)
2.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession()需要手动关闭(session.close()),如果使用openSession()后未关闭,多次创建后会导致线程池溢出。
7.Hibernate中有哪些缓存?都是如何配置的?(三个缓存都要说)
一级缓存
二级缓存
三级缓存
8.说说get&load的区别
load是懒加载机制,返回的是代理对象,只有id有值,其他没有值
get调用后会立马返回session 很积极
load:查询一个不存在的值会抛出异常
get:查询一个不存在的值会返回null
9.如何在控制台看到hibernate生成并执行的sql?
在Hibernate.cfg.xml配置里面加<property name="show_sql">true</property>
10.Hibernate中有几种检索方式?
11.说说save(),flush(),commit()方法调用后都做了什么?
save()只是保存数据
Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,
当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.
commit针对事物的
flush针对缓存的
12.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to-many、many-to-many、
13.Hibernate是如何延迟加载?
当Session上的load()方法加载一个实体时,会采用延迟加载。
(2)当Session加载某个实体时,会对这个实体的集合属性值采用延迟加载。
(3)当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载。
14.谈谈Hibernate中inverse的作用?
是否将对集合对象的修改反映到数据库中。
15.MySQL默认的事务隔离级别是多少?jdbc如何修改?Hibernate如何修改?
4
16.事务的特性有哪些?
特性:原子性,一致性,隔离性,持续性。
原子性:事物是数据库的逻辑工作单位,事物中包括的操作要么都做,要么都不做。
一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性:一个事务的执行不能被其它事物干扰。即一个事物内部的操作及使用的数据对其它并发事物是隔离的,并发执行的各个事物之间不能互相烦扰。
持续性:也称永久性,只一个事物一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
17.什么是脏读,不可重复读,幻读
1,脏度:读到了另一个事务没有提交的数据。
2,不可重复读:同一个事务进行多次读取期间另外一个事务进行修改,多次读取,数据不同
3,幻读:一个事务在修改表中的全部数据,另外一个事务在新增数据。
18.说说连接池的原理
项目做添加操作的时候,访问数据库,平时我们之前用的时候都是打开,数据用完了,就关掉,
现在我们连接池里面有很多空闲,我们用的时候,就已经创建好了,数据用完了,不要关,给下一个使用,
19.说说HQL和QBC,项目中都是怎么用的?
HQL语句操作的是po类,也就是实体类。hql通过映射文件,将类名和表名、类属性和表字段一一对应起来。
1.HQL
a)hibernate中的查询语言
b)它是面向对象的
c)功能
1)查询所有
2)查询单个对象
3)投影
a)支持调用构造器
b)显示单行单列用对象(字段的类型)
c)显示多行多列用list(字段的类型)
4)分页
a)起始的行数
b)显示的条数
5)绑定参数
a)按照索引从找,从0开始
b)按照名字(:anme)
6)模糊查询
7)排序
8)聚合函数
9)关联查询
1.QBC
a)也是一个查询语言和HQL类上,但是比HQL更加面向对
b)功能
1)查询全部
2)单个查询
3)条件查询
a)大于,小于。。。
4)离线查询
a)减少session占用时间
20.说说悲观锁和乐观锁?
悲观锁:改数据的时候总是认为别人会来修改自己的语句
修改之前就上锁,通过LockOptions.UPGRADE形成悲观锁
乐观锁:改数据的时候总是认为别人不会来修改自己的语句
通过版本号来实现的
在表中添加版本号字段
在属性添加版本号对象
在配置文件里面通过<Versoin>标签属性