hibernate面试点
1.谈谈你对hibernate的认识和理解
01.全自动的ORM框架
02.子项目
03.面向对象的思想来解决操作数据库
01.hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得程序员可以按照面向对象的思想来操控数据库中的数据 02.hibernate的核心接口有Configuration、SessionFactory、Session、Transaction、Query、首先由Configuration获取配置信息并做一切初始化的工作,接着通过SessionFactory创建SessionFactory,再通过SessionFactory创建Session,然后程序就可以使用Session完成增删改查操作,如果需要使用复杂一点的查询功能,则可以通过Session获取Query 03.hibernate的实体存在着,瞬时状态,持久状态,托管状态,(用new创建的实体对象属于瞬时状态,一般通过save()方法,saveOrUpdate()等方法转换成持久状态,而托管状态则通过close(),evicrt()等方法转换而成。) 04.hibernate的优缺点有: 001.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码 002.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 003.Hibernate使用Java反射机制而不是字节码增强程序来实现透明性。 004.Hibernate的性能好,映射灵活性比较出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
demo01
1.面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化。 2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库老保存大量对象信息。从Java程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功能来说,应该是一个很了不起的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要能比系统运行的其他功能来说,应该是一个很不起眼的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的jdbc代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工作。 3.通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即ObjectRelation Mapping),人们可以通过封装JDBC代码来实现这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。 4.使用Hivernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。 5.使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。 6.在应用Hibernate时,重点要了解Session的缓存原理,级联,延迟加载和hql查询
demo02
说说这类问题一般要和一个东西比较,说说他们的优点和缺点,hibernate就和JDBC比较,说说JDBC的优缺点,说说hibernate的优缺点,最后对比得出hibernate更好。 hiberante: 1.概念:ormapping 对象关系映射 01.操作数据库的框架,底层是通过jdbc操作数据库的 02.用面向对象的方式操作数据库 2.jdbc的缺点 01.代码太繁琐了 02.不是面向对象的数据库操作 03.资源关闭的代码也很繁琐,每次都得打开、关闭 04.没有做到数据缓存 05.移植性比较差 优点 因为是最底层的操作,所以效率比较高 3.hibernate 01.代码比较精简了 02.是面向对象的数据库操作 03.只需要关闭一个对象就可以了session 04.数据缓存,一级缓存,二级缓存,查询缓存 05.移植性比较好 缺点 01.程序员不能控制sql语句的生成,hibernate中有一个hql 02.如果一个项目对sql语句的优化要求特别高,不适合用hibernate 03.如果一张表的数据量特别大,不适合用hibernate
demo03
对于查询数据库的sql优化问题,这里有一个面试题,给你一个学生student表,叫你用各种方式查询出指定的学生信息
--方式一
select *
from student
where id in(2,3,4) --方式二
select *
from student
where id =2 or id=3 or id=4 --方式三
select *
from student
where id between 2 and 4 --方式四
select *
from student
where id>=2 and id<=4 --方式五
select *
from student
where id=2
union
select *
from student
where id=3
union
select *
from student
where id=4
这里有五种方式得出指定学生2,3,4的信息
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库。 工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SessionFactory 是用Hibernate的优点有: 1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2.Hiberante是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3.Hiberante使用Java反射机制而不是字节码增强程序来实现透明性。 4.Hibernate的性能好,映射的灵活性比较出色 。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 hibarnate的核心类有: Configuration、SessionFactory、Session
Demo04
它是ORM思想的一个实现,对JDBC进行了很好的封装,它通过配置使JavaBean对象和数据库表之间进行映射,并提供对增、删、改、查便利的操作方法,同时支持事务处理,它对数据库记录还提供了缓存机制,提高效率,它可以使程序员不用书写SQL,也不用关心数据库SQL之间的差异,它通过方言对数据库进行了很好的适配。 1.Hibernate的主配置文件为hibernate.cfg.xml,其中定义了数据源、连接池、缓存、事务、表生成策略等配置 2.通过*.hbm.xml映射配置文件,定义了JavaBean对象和数据库表之间的映射关系,还定了对象和对象之间的映射关系,包括:一对一、多对一、一对多、多对多 3.对于复杂查询和修改,Hibernate提供了Query对象进行支持,它可以使用HQL语句处理查询、修改、删除和分页。如果需要处理针对数据库相关的SQL,可以SQLQuery对象处理。 4.Hibernate可以集成到spring中,通过spring进行事务处理,事务的配置通常分两类,一种使AOP方式,一种使注释方式的声明式事务。 5.Hibernate从3版本后,支持JPA规范,可以不使用映射文件配置,而全部采用JPA注解方式进行对象和数据库表的映射,Hibernate还扩容了JPA规范。 6.Hibernate对常用的缓存技术做了封装,可以轻松的调用各种缓存框架。
Demo05
一、Hibernate使JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序访问代码,DAO接口的实现类,甚至可以使BMP里面的访问数据库的代码。从这个意义上说,Hibernate和EB不是一个范畴的东西,也不存在非此即彼的关系。 二、Hibernate是一个和JDBC密切关联的框架,所以Hiberante的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。 三、Hibernate不能用来直接和Entity Bean做对比,只有放在整个J2EE项目的框架中才能比较。并且及时是放在软件整体框架中来看,Hiberante也是作为JDBC的替代者出现的,而不是Entity Bean的替代者出现的,让我再列一次我已经列n次的框架结构: 传统的架构: 1.Session Bean <-> Entity Bean <-> DB 为了解决性能障碍的替代架构: 2.Session Bean <-> DAO <-> JDBC <-> DB 使用Hibernate来提高上面架构的开发效率的架构: 3.Session Bean <-> DAO <-> Hibernate <-> DB 就上面3个架构来分析: 1、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构1最差。 2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用Batch语句,调整PreparedStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。EB的架构效率会差的很远。 3、开发效率:在有JBuilder的支持下以及简单的项目,EB架构开发效率最高,JDBC次之,Hiberante最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率搞的惊人,JDBC次之,而EB架构很可能会失败 4、分布式,安全检查,集群,负载均衡的支持 由于有S做为Facade,3个架构没有区别
Demo06
2.主键生成策略 和 hbm2ddl
http://www.cnblogs.com/ayhq/p/5839070.html
http://blog.csdn.net/jndxjing/article/details/5914620
http://www.cnblogs.com/hoobey/p/5508992.html
http://blog.csdn.net/gongzi2311/article/details/58191208
http://www.linuxidc.com/Linux/2011-12/49206.htm
http://blog.csdn.net/duchao123duchao/article/details/47763491
http://blog.csdn.net/sivyer123/article/details/9154971
http://blog.csdn.net/duchao123duchao/article/details/47763491
http://www.cnblogs.com/tanzy114/p/4631809.html
3.get 和 load 的区别
http://blog.csdn.net/tftutu/article/details/6456060
http://blog.csdn.net/tftutu/article/details/6456060
http://www.cnblogs.com/xiaoluo501395377/p/3371776.html
http://blog.csdn.net/buhuikanjian/article/details/53186606
01.立即加载和延迟加载
02.1和2级缓存中查询
03.如果数据库中没有数据
04.load也可以立即加载
4.evict() 和clear() flush()
http://blog.csdn.net/z69183787/article/details/38403367
http://blog.csdn.net/wkcgy/article/details/6192839
http://www.csyor.com/703.html
http://jaeger.blog.51cto.com/11064196/1757270/
5.hibernate的缓存机制
1级缓存 session
2级缓存 sessionFactory -----> 查询缓存
http://jaeger.blog.51cto.com/11064196/1757270/
http://www.csyor.com/703.html
http://blog.csdn.net/wkcgy/article/details/6192839
http://blog.csdn.net/z69183787/article/details/38403367
6.hibernate三种状态,以及之间的转换
我们创建的对象,从数据库中获取的对象!
这些对象,在hibernate中的状态!
01.瞬时状态,没有 oid
Student stu = new Student();
02.持久状态
Student stu = (Student)session.get(Student.class,1);
03.游离状态 有oid
session.clear();
session.evict();
7.commit() 和 flush()的区别
commit() 是提交事务 永久
flush() 是清理缓存! 暂时
但是两者都能把数据同步到数据库!
01.commit执行之前,先执行flush
02.flush执行缓存清理
03.缓存清理,先 执行脏检查
04.什么脏检查和脏对象!
一个对象在被session管理的时候,会有一个快照保存在session中!
如果后续我们对这个对象的属性进行修改,那么在脏检查的时候,会拿我们这个修改
之后的对象和快照进行比对!我们这个对象发生了变化!那么这个对象就是脏对象!
这个脏对象会被保存到数据库中!
8.save() saveorupdate() update() merge()的区别
01.三种状态
02.状态之间的转换
03.merge不会改变对象的状态
9.openSession getCurrentSession 和 threadLocal<Session> 的区别
10. sql结构化语句的分类
11.HQL(hibernate查询语言) 不存在 表和字段! 面向对象的思想来解决数据库的问题!****
使用hql的步骤
12. list()和iterator()的区别
13.hibernate参数绑定的方式 绑定对象使用的方法 ***
动态参数绑定的理解
14.设计模式的六大原则 约定大于配置
15.投影查询 查询指定的字段!
16.关联映射
17. cascade属性 和 inverse 属性
18.OpenSessionInView模式的理解
19.迫切连接 (关键字)和非迫切连接的区别
20.criteria查询 *****
Criteria 是一个查询对象
如果我们的查询需要条件
那么就是需要一个Criterion对象!
通过Criteria.add(Criterion对象) 增加条件!
Criterion
Restrictions
Disjunction
Junction
Restrictions类中所有的方法都是 静态的!
返回值都是Criterion或者Criterion的实现类!
Disjunction继承了Junction!
Junction实现了Criterion!
所以在Criteria.add(条件)!条件可以是Restrictions
Disjunction
Junction中的任何一个!
投影查询 ,聚合函数等用
Projection 接口
Projections工具类,是Projection的实现类
ProjectionList中有一个add(Projection对象)
我们传递的是Projections.一系列方法!因为这些方法的返回值是Projection或者是Projection的实现类
hibernate面试点的更多相关文章
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- spring applicationContext.xml和hibernate.cfg.xml设置
applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- [原创]关于Hibernate中的级联操作以及懒加载
Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...
- hibernate的基本xml文件配置
需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
随机推荐
- BZOJ2245 [SDOI2011]工作安排 【费用流】
题目 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名 ...
- 【扩展kmp+最小循环节】HDU 4333 Revolving Digits
http://acm.hdu.edu.cn/showproblem.php?pid=4333 [题意] 给定一个数字<=10^100000,每次将该数的第一位放到放到最后一位,求所有组成的不同的 ...
- bzoj3196 二逼平衡树 树套树(线段树套Treap)
Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4697 Solved: 1798[Submit][Status][D ...
- Linux(10):期中架构(2)--- NFS存储服务 & 实时同步
1. 共享存储服务概念: # NFS是Network File System的缩写,中文意思是网络文件系统, # 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. 2. ...
- Mountaineers
Mountaineers 时间限制: 3 Sec 内存限制: 128 MB 题目描述 The Chilean Andes have become increasingly popular as a ...
- jsp、Html页面注释的种类
<!-- 这里面的注释在查看页面源代码时,依旧可以看到,另外页面加载时这里面注释的内容仍旧会编译 --> <%-- JSP中的注释,这里面的内容在查看页面源代码时,看不到这里面注释书 ...
- 手动实现jQuery的toggle()效果
有时候我们希望实现toggle()切换效果,但是切换的同时需要完成一些其他要做的事情.所以我们需要对jQuery的toggle()函数进行改造. 下面好test2()函数就是一个实现toggle效果的 ...
- AnyChart图表仪表控件在Flex环境下使用
AnyChart控件是一款当前流行的数据可视化解决方案,使客户可以创建交互地.生动的图表.实时仪表和地图.同时支持Flash和HTML5显示,控件提供极好的视觉外观和配色方案能够使客户根据不同的需求设 ...
- MongoDB_java连接MongoDB
java程序连接单机版的mongodb: 参考:http://www.runoob.com/mongodb/mongodb-java.html https://www.yiibai.com/mongo ...
- PXC小结
PXC使用到的端口号 3306 数据库对外服务的端口号(视具体情况而定) 4444 请求SST SST: 指数据一个镜象传输 xtrabackup , rsync ,mysqldump 4567 : ...