81,谈谈你对SpringMVC的理解。
答:SpringMvc是基于过滤器对servlet进行了封装的一个框架,在web.xml文件中配置DispatcherServlet类;SpringMvc工作时主要是通过DispatcherServlet管理接收到的请求并进行处理。这是SpringMVC中的一个核心类。运行过程如下:
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
82、谈谈你对Hibernate的理解。
答:Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库。ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)
使用Hibernate的基本流程是:
配置Configuration对象;
产生SessionFactory;
创建session对象;
启动事务;
完成CRUD操作;
提交事务;
关闭session。
Hibernate优点:
>对 JDBC 访问数据库的代码做了封装,简化了数据访问层繁琐的重复性代码
>映射的灵活性, 它支持各种关系数据库, 从一对一到多对多的各种复杂关系.
>非侵入性、移植性会好
>缓存机制: 提供一级缓存和二级缓存
Hibernate缺点:
>无法对 SQL 进行优化
>框架中使用 ORM原则, 导致配置过于复杂
>执行效率和原生的JDBC 相比偏差: 特别是在批量数据处理的时候
>不支持批量修改、删除。
83,谈谈你对Spring的理解。
答:Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。Spring 提倡以“最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或者卸载 Spring。
Spring框架的作用:
①.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。
②.Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
③.Spring 能非常简单的帮我们管理数据库事务。
④.Spring 还提供了与第三方数据访问框架(如Hibernate、Mybatis)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。
⑤.Spring 还提供与第三方Web(如Struts1/2、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
⑥.Spring 能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)
84,谈谈Struts的优缺点
答:优点:
实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现;
丰富的标签库,大大提高了开发的效率;
Struts2提供丰富的拦截器实现;
通过配置文件,就可以掌握整个系统各个部分之间的关系;
异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理;
可扩展性高。
缺点:
获取参数稍显麻烦;
校验稍显繁琐;
越来越复杂,不灵活,学习成本高;
安全漏洞!这是最致命的。目前此框架基本已经被抛弃!
85,MyBatis与Hibernate有什么不同?
答:Mybatis不是一个完全的ORM框架。
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发。但缺点就是无法做到数据库无关性,如果需要支持多个数据库,则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
86,在hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决?
答:返回的是一个List这样的类型,你可以另外创建一个DTO然后通过循环,把Object[]中的每一个值,与dto中的字段对应,组成一个List的对象。举例说明:
有实体类People和Card,代表用户和卡片,其属性分别如下:
People:id,name,age
Card:id,num
现在通过查询取出People中的id,name和Card中的id,num。
此时得到的属性是4个,分别是People中的id,name和Card中的id,num
以上两个实体类都不能保存这4个属性。此时可以新定义一个类,假设叫PeopleCard,属性如下:
PeopleCard:peopleId,name,cardId,num
把从Hibernate中得到的List中的元素循环,取出Object[]中的相应的数据放入PeopleCard各个属性中。得到一个List集合。这个集合中就是你想要的数据集了。
87,介绍一下Hibernate的二级缓存
答:缓存就是把以前从数据库中查询出来和使用过的对象保存到内存中(一个数据库结构中),这个数据库结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存到缓存中,以便下次使用。
hibernate的session就是一种缓存,我们通常将其称为hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。
由于session代表一次会话过程,一个session与数据库连接相关联,所以session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正意义的缓存应用,才有较大的缓存价值。因此,hibernate的session这一级缓存作用并不明显,应用价值不大。
hibernate的二级缓存就是要为hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存,我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。
二级缓存是独立于hibernate的软件部件,属于第三方产品。多个厂商和组织都提供有缓存产品,例如EHCache和OSCake等等。在hibernate中使用二级缓存,首先就要在hibernate.config.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置这缓存产品自己的配置文件,最后配置hibernate中的哪些实体对象要纳入二级缓存的管理中。明白了二级缓存的原理和有了这个思路后,很容易配置起hibernate的二级缓存。
88,JDO是什么?
答:JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API。
JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。
说明:以上内容来自百度,因为现在基本不使用这种,所以大家了解一下就可以了。
89,Hibernate的一对多和多对一双向关联的区别?
答:一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同。
一对多关联映射是指在加载一的一端数据的同时加载多的一端的数据多对一关联映射是指在加载多的一端数据的同时加载一的一端的数据。如果是双向关联,则不论是加载一的一端数据还是加载多的一端的数据,都会把另一端的数据加载进来。这种方法建议少用,因为会产生大量的内存浪费。除非确实有这样的需要。
90,Hibernate是如何延迟加载?
答:Hibernate从数据库获取某一个对象数据、获取某一个对象的集合属性时,获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不从数据库加载真正的数据。而是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值,只有在真正的需要该对象的数据时才创建这个真实的对象,真正的从数据库中加载数据。这就是延迟加载。
当调用Session上的load()方法加载实体时,就会采用延迟加载。
当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载,会对这个实体所单端关联(one-to-one,many-to-one)的另一个实体对象采用延迟加载。