Hibernate Spring 面试题

###1. 关于PreparedStatement和Statement具体区别 (1) PreparedStatement是预先编译的语句,而Statement则不是预先编译的,在DBMS中处理管理中Statement是要进行语法、语义校验的,而PreparedStatement则不要。 (2) PrepareStatement中执行的SQL语句中是能够带参数的,而Statement则不能够。 好比: PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00); pstmt.setInt(2, 110592); pstmt. executeUpdate(); (3) 当处理批量SQL语句时,这个时候就能够体现PrepareStatement的优点,因为采用Cache机制,则预先编译的语句,就会放在Cache中,下次执行相同SQL语句时,则能够直接从Cache中取出来程序员

###2. 说出数据链接池的工做机制是什么? J2EE 服务器启动时会创建必定数量的池链接,并一直维持很多于此数目的池链接。客户端程序须要链接时,池驱动程序会返回一个未使用的池链接并将其表记为忙。若是当前没有空闲链接,池驱动程序就新建必定数量的链接,新建链接的数量有配置参数决定。当使用的池链接调用完成后,池驱动程序将此链接表记为空闲,其余调用就可使用这个链接。spring

###3. Hibernate工做流程及为何要用? 工做流程: 1.读取并解析配置文件 2.读取并解析映射信息,建立SessionFactory 3.打开Sesssion 4.建立事务Transation 5.持久化操做 6.提交事务 7.关闭Session 8.关闭SesstionFactory数据库

为何要用:编程

  1. 对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。
  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。很大程度的简化DAO层的编码工做。
  3. Hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。
  4. Hibernate性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。

###4. Hibernate是如何延迟加载?设计模式

  1. Hibernate2 延迟加载实现:a)实体对象 b)集合(Collection)
  2. Hibernate3 提供了属性的延迟加载功能

当Hibernate在查询数据的时候,数据并无存在与内存中,当程序真正对数据的操做时,对象才存在于内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提升了服务器的性能。浏览器

###5. Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体如今表与表之间的关系进行操做,它们都对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many缓存

###6. 说下Hibernate的缓存机制安全

  1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事务级缓存
  2. 二级缓存: a) 应用级缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c) 第三方缓存的实现

###7. Hibernate的查询方式 Sql、Criteria、object comptosition Hql:服务器

  1. 属性查询
  2. 参数查询、命名参数查询
  3. 关联查询
  4. 分页查询
  5. 统计函数

###8. 如何优化Hibernate?session

  1. 使用双向一对多关联,不使用单向一对多
  2. 灵活使用单向一对多关联
  3. 不用一对一,用多对一取代
  4. 配置对象缓存,不使用集合缓存
  5. 一对多集合使用Bag,多对多集合使用Set
  6. 继承类使用显式多态
  7. 表字段要少,表关联不要怕多,有二级缓存撑腰

###12. Spring MVC工做机制及为何要用? 1.Spring mvc将全部的请求都提交给DispatcherServlet,它会委托应用系统的其余模块负责对请求进行真正的处理工做。 2.DispatcherServlet查询一个或多个HandlerMapping,找处处理请求的Controller。 3.DispatcherServlet将请求提交到目标Controller。 4.Controller进行业务逻辑处理后,会返回一个ModelAndView。 5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。

为何用: AOP让开发人员能够建立非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用AOP后,公共服务(好比日志、持久性、事务等)就能够分解成方面并应用到目标对象上,同时不会增长目标对象的对象模型的复杂性

IOC容许建立一个能够构造对象的应用环境,而后向这些对象传递它们的协做对象。正如单词倒置所代表的,IOC就像反过来的JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每个对象都是用其协做对象构造的。所以是由容器管理协做对象(collaborator)。

Spring即便一个AOP框架,也是一IOC容器。 Spring最好的地方是它有助于您替换对象。有了Spring,只要用JavaBean属性和配置文件加入依赖性(协做对象)。而后能够很容易地在须要时替换具备相似接口的协做对象。

Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了建立、配置和管理 bean 的方式,如图 1 所示。

组成 Spring 框架的每一个模块(或组件)均可以单独存在,或者与其余一个或多个模块联合实现。每一个模块的功能以下:    核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。    Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。    Spring AOP:经过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。因此,能够很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。经过使用 Spring AOP,不用依赖 EJB 组件,就能够将声明性事务管理集成到应用程序中。    Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不一样数据库供应商抛出的错误消息。异常层次结构简化了错误处理,而且极大地下降了须要编写的异常代码数量(例如打开和关闭链接)。Spring DAO 的面向 JDBC 的异常听从通用的 DAO 异常层次结构。    Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部这些都听从 Spring 的通用事务和 DAO 异常层次结构。    Spring Web 模块:Web 上下文模块创建在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。因此,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工做。    Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。经过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。    Spring 框架的功能能够用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象能够在不一样J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。    控制反转模式(也称做依赖性介入)的基本概念是:不建立对象,可是描述建立它们的方式。在代码中不直接与对象和服务链接,但在配置文件中描述哪个组件须要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一块儿。    在典型的 IOC 场景中,容器建立了全部对象,并设置必要的属性将它们链接在一块儿,决定什么时间调用方法。

面向方面的编程,即 AOP,是一种编程技术,它容许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。    AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在全部方法和 Java 类中才能实现日志功能。在 AOP 方式中,能够反过来将日志服务模块化,并以声明的方式将它们应用到须要日志的组件上。固然,优点就是 Java 类不须要知道日志服务的存在,也不须要考虑相关的代码。因此,用 Spring AOP 编写的应用程序代码是松散耦合的。    AOP 的功能彻底集成到了 Spring 事务管理、日志和其余各类特性的上下文中。    IOC 容器 Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一块儿使用。这个包一般不是由用户直接使用,而是由服务器将其用做其余多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,容许经过名称建立和检索对象。BeanFactory 也能够管理对象之间的关系。

BeanFactory 支持两个对象模型。    单态 模型提供了具备特定名称的对象的共享实例,能够在查询时对其进行检索。Singleton 是默认的也是最经常使用的对象模型。对于无状态服务对象很理想。    原型 模型确保每次检索都会建立单独的对象。在每一个用户都须要本身的对象时,原型模型最适合。    bean 工厂的概念是 Spring 做为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。    BeanFactory 接口    由于 org.springframework.beans.factory.BeanFactory 是一个简单接口,因此能够针对各类底层存储方法实现。最经常使用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。    清单 1. XmlBeanFactory BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));    在 XML 文件中定义的 Bean 是被消极加载的,这意味在须要 bean 以前,bean 自己不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称便可,如清单 2 所示。    清单 2. getBean() MyBean mybean = (MyBean) factory.getBean("mybean");    每一个 bean 的定义均可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

###13. Struts是否线程安全的,不是怎么处理使它安全. 不安全. 解决方法:

  1. 采用单线程方式 在JSP文件中加上,使它以单线程方式执行,这时仍然只有一个实例,全部客户端的请求以串行方式执行.这样会下降系统的性能.
  2. 对函数加synchronized进行线程同步,JSP仍然以多线程方式执行,可是也会下降系统性能.
  3. 采用局部变量代替实例变量

###14. Struts中文乱码怎么处理 一、 全部HTML/JSP页面所有采用UTF-8编码 二、 客户端浏览器彻底支持UTF-8编码

###15. Hibernate最常遇到一种异常 空指针(ObjectNotFoundExceptio).

###16. Hibernate session 的 get()和load()有什么区别 1. 若是未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException2. load方法可返回实体的代理类实例,而get方法永远直接返回实体类3. load方法能够充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取

###17. Hibernate延长加载

  1. 实体对象的延迟加载 ,在set中指定lazy=true 这样只有实际加载与对象相关联的集合对象的时候,再经过session从数据库中加载实际的数据集
  2. 属性延迟加载,在property节点中声明lazy=true 还须要借助Hibernate类加强器对POJO类的二进制Class文件进行强化处理.

###18. Hibernate中事务怎么处理 Hibernate有三种事务:1. JDBC 2. JTA事务 3. CMT事务;在这三种事务中,JDBC事务是默认的。 这就意味着若是未设置hibernate.properties文件中的hibernate.transaction_factory的键值,beginTransaction将返回一个JDBC事务。 虽然一个会话中能够包含多个事务,但并不须要人为地对这些事务进行分割,而是由会话中的一些方法对多个事务进行管理的。下面将详细描述这些方法: commit()方法是提交事务的方法。在这方法在内部调用了会话对象的save()方法。当调用这个方法时,若是这个事务已经被初始化,那么这个事务将成功提交。

相关文章
相关标签/搜索