Hibernate经典知识:
1、Hibernate工作原理及为什么要用?
1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 hibernate的性能非常好,因为它是个轻量级框架。 1.它支持各种关系数据库,从一对一到多对多的各种复杂关系。 1).读取并解析配置文件 2).读取并解析映射信息,创建SessionFactory 3).打开Sesssion 4).创建事务Transation 5).持久化操作 6).提交事务 7).关闭Session 8).关闭SesstionFactory
|
2.什么是Hibernate延迟加载?
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
答:对象关系映射(Object—Relational Mapping,简称 ORM)是一种为了解决 面向对象与面向关系数据库存在的互不匹配的现象的技术; |
3.数据库,比如 100 用户同时来访,要采取什么技术解决?
答:可采用连接池。 |
4.什么是 ORM?
答:对象关系映射(Object—Relational Mapping,简称 ORM)是一种为了解决 面向对象与面向关系数据库存在的互不匹配的现象的技术; |
5.Hibernate 有哪 5 个核心接口?
Configuration 接口:配置 Hibernate,根据其启动 hibernate,创建SessionFactory 对象 SessionFactory 接口:初始化 Hibernate,充当数据存储源的代理,创建session 对象sessionFactory 是线程安全的. Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个 session,是轻量级、一级缓存; Transaction (tr?n‘z?k??n) 接口:管理事务; Query 和 Criteria([krai‘ti?ri?]) 接口:执行数据库的查询。 |
6.关于 hibernate: 【基础】
1)在 hibernate 中,在配置文件呈标题一对多,多对多的标签是什么; 2)Hibernate 的二级缓存是什么;
Hibernate 是如何处理事务的; 答: 1)一对多的标签为<one-to-many> ;多对多的标签为<many-to-many>;
2)sessionFactory 的缓存为 hibernate 的二级缓存;
3)Hibernate 的事务实际上是底层的 JDBC Transaction 的封装或者是 JTA Transaction 的封装;默认情况下使用 JDBCTransaction。 |
7.Hibernate 的应用(Hibernate 的结构)?【基础】
答: //首先获得 SessionFactory 的对象 SessionFactory sessionFactory = new Configuration().configure(). buildSessionFactory();
//然后获得 session 的对象 Session session = sessionFactory.openSession(); //其次获得 Transaction 的对象 Transaction tx = session.beginTransaction();
//执行相关的数据库操作:增,删,改,查
session.save(user); //增加, user 是 User 类的对象
session.delete(user); //删除 session.update(user); //更新
Query query = session.createQuery(“from User”); //查询 List list = query.list();
//提交事务
tx.commit();
//如果有异常,我们还要作事务的回滚,恢复到操作之前
tx.rollback();
//最后还要关闭 session,释放资源
session.close(); |
8.Hibernate的查询方式
本地SQL查询、Criteria、Hql |
9.说说在hibernate中使用Integer做映射和使用int做映射之间有什么差别
Integer?? code和int?? code;的区别:Integer是对象.???? code?? =?? null;?? 对象可以为空.? int?? 是普通类型,???? 不可能?? =?? null.????? 根据你的数据库code是可以空的,?? 故应该映射成Integer.? |
10.请说出Hibernate中持久化对象的生命周期以及各种状态直接的区别,并描述相互之间是如何转换的?
Hibernate中持久化对象的生命周期有临时态、持久态和游离态三种。 处于临时态的对象主键值为空,并且未与session关联,数据未保存到数据库中 处于持久态的对象与session关联起来,持久化后对象中的数据被保存到数据库中,并且主键值按照.hbm.xml文件中配置的生成方式生成相应的值 处于游离态的对象脱离了session的管理,是持久化后的一种状态,主键值按照.hbm.xml文件中配置的生成方式生成相应的值 当new一个新的对象时,该对象处于临时态 当该对象被当作session的参数使用的时候,该对象处于持久态 事务提交,session关闭后,该对象处于游离态 |
11.用Hibernate的session时要注意几点
1).在更新数据时,要用open() 2).使用完之后,要close(),这样连接池会回收该连接。 |
12.Spring和Hibernate的事务管理方式有什么不同?
hibernate的事务管理方式仅仅就是托管给JDBC(如果用JTA那么就是JTA),而JDBC的一切行为包括事务是基于一个connection的. spring也是调用hibernate中事务管理的API。hibernate的事务管理,一般是编程性的。 |
13.Hibernate如何获取指定主键id的某对象,请举例,并进行可能的优劣
比较 三种方式:get(),load()和find() Get()和load()是先在缓存中查找对象,如果找不到再去数据库中查询; Find()是无论何时都在数据库中查询对象。 |
14.请描述Hibernate中的缓存机制
第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。 第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。 |
15.Hibernate的二级缓存策略的一般过程如下:
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。 |
16.get与load区别
1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException; 区别2:load支持延迟加载,get不支持延迟加载。 |
s1.什么是重量级?什么是轻量级?【基础】
答:轻量级是指它的创建和销毁不需要消耗太多的资源,意味着可以在程序中经 常创建和销毁 session 的对象;重量级意味不能随意的创建和销毁它的实例,会 占用很多的资源. |
s2.事务处理?【基础】
答:Connection 类中提供了 3 个事务处理方法: setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动 提交事务,即为 true,通过设置 false 禁止自动提交事务; commit():提交事务; rollback():回滚事务。 |
s3.Java 中访问数据库的步骤?Statement 和 PreparedStatement 之间的区别?【基础】
答:Java 中访问数据库的步骤如下: 1)注册驱动;
2)建立连接;
3)创建 Statement;
4)执行 sql 语句;
5)处理结果集(若 sql 语句为查询语句);
6)关闭连接。
PreparedStatement 被创建时即指定了 SQL 语句,通常用于执行多次结构相 同的 SQL 语句。 |
s4.JDBC,Hibernate 分页怎样实现?【中等难度】
答:方法分别为: 1) Hibernate 的分页: Query query = session.createQuery("from Student"); query.setFirstResult(firstResult);
//设置每页开始的记录号 query.setMaxResults(resultNumber);
//设置每页显示的记录数 Collection students = query.list(); |
s5.如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多 2.不用一对一,用多对一取代
3.配置对象缓存,不使用集合缓 |
S2SH经典面试题:
Struts2面试题 struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。 核心控制器FilterDispatcher是Struts 2框架的基础, 包含了框架内部的控制流程和处理机制。 业务控制器Action和业务逻辑组件是需要用户来自己实现的。 用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件, 供核心控制器FilterDispatcher来使用。 Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同, 所以说Struts 2是WebWork的升级版本。基本简要流程如下: 1 、客户端初始化一个指向Servlet容器的请求; 2、 这个请求经过一系列的过滤器(Filter) (这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器, 这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 、接着FilterDispatcher被调用, FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4、如果ActionMapper决定需要调用某个Action, FilterDispatcher把请求的处理交给ActionProxy 5、ActionProxy通过Configuration Manager询问框架的配置文件, 找到需要调用的Action类 6、ActionProxy创建一个ActionInvocation的实例。 7、ActionInvocation实例使用命名模式来调用, 在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果 。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。 在表示的过程中可以使用Struts2 框架中继承的标签。 在这个过程中需要涉及到ActionMapper 9、响应的返回是通过我们在web.xml中配置的过滤器 Struts工作机制? 工作机制: 说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生 成动态的网页,返回给客户。 拦截器和过滤器的区别 1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。 struts1于struts2的比较 1、Action 类: 为什么要使用Struts2 Struts2 是一个相当强大的JavaWeb开源框架,是一个基于POJO的Action的MVC struts2有哪些优点? 1)在软件设计上Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计; 2)拦截器,实现如参数拦截注入等功能; 3)类型转换器,可以把特殊的请求参数转换成需要的类型; 4)多种表现层技术,如:JSP、freeMarker、Velocity等; 5)Struts2的输入校验可以对指定某个方法进行校验; 6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现 struts2是如何启动的? struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器; StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。 struts2框架的核心控制器是什么?它有什么作用? 1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。 2)作用: 负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径 不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。 可以通过常量"struts.action.extension"修改action的后缀,如: <constant name="struts.action.extension" value="do"/> 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 <constant name="struts.action.extension" value="do,go"/> struts2配置文件的加载顺序? struts.xml ——> struts.properties 常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值. struts.xml文件的作用:通知Struts2框架加载对应的Action资源 struts2常量的修改方式? 常量可以在struts.xml或struts.properties中配置,两种配置方式如下: 1)在struts.xml文件中配置常量 <constant name="struts.action.extension" value="do"/> 2)在struts.properties中配置常量(struts.properties文件放置在src下): struts.action.extension=do struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象? 方案一: HttpServletRequestrequest =ServletActionContext.getRequest(); HttpServletResponse HttpSession session= request.getSession(); ServletContextservletContext=ServletActionContext.getServletContext(); 方案二: 类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自动传入对应的域对象 struts2是如何管理action的?这种管理方式有什么好处? struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。 主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。 struts2中的默认包struts-default有什么作用? 1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中 把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。 2)struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。 3)通常每个包都应该继承struts-default包。 struts2如何对指定的方法进行验证? 1)validate()方法会校验action中所有与execute方法签名相同的方法; 2)要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写; 3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport), 如果系统 的fieldErrors包含失败信息,struts2会将请求转发到名为input的result; 4)在input视图中可以通过<s:fielderror/>显示失败信息。 5)先执行validateXxxx()->validate()->如果出错了,会转发<result name="input"/>所指定的页面,如果不出错,会直接进行Action::execute()方法 struts2默认能解决get和post提交方式的乱码问题吗? 不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。 请你写出struts2中至少5个的默认拦截器? fileUpload 提供文件上传功能 i18n 记录用户选择的locale cookies 使用配置的name,value来是指cookies checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。 chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。 alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 值栈ValueStack的原理与生命周期? 1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当Struts2接受一个请求时,会迅速创建ActionContext, ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。 请求来的时候,action、ValueStack的生命开始,请求结束,action、 ValueStack的生命结束; 2)action是多例的,和Servlet不一样,Servelt是单例的; 3)每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶; 4)ValueStack本质上就是一个ArrayList; 5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前请求的请求参数 request : 该 Map 中包含当前 request 对象中的所有属性 session :该 Map 中包含当前 session 对象中的所有属性 application :该 Map 中包含当前 application 对象中的所有属性 attr:该 Map 按如下顺序来检索某个属性: request, session, application 6)使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号; 7)注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value="name"/> 8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时使用的"$",而不是#或者%; ActionContext、ServletContext、pageContext的区别? 1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用; 2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用; 3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁, 生命周期是JSP四个域对象中最小的。 result的type属性中有哪几种结果类型? 一共10种: dispatcher struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若需要把控制权重定向到一个外部资源, 应该使用 redirect结果类型 redirect 把响应重定向到另一个资源(包括一个外部资源) redirectAction 把响应重定向到另一个 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream 拦截器的生命周期与工作过程? 1)每个拦截器都是实现了Interceptor接口的 Java 类; 2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化; 3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次; 5)struts2中有内置了18个拦截器。 为什么要用struts2 JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。 基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件 struts2的validate框架是如何运作的 在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。 说下struts2的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。 struts2如何完成文件的上传? 1、JSP页面: 1)JSP页面的上传文件的组件:<s: file name=”upload” />,如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的,即: name=“xxx”的值必须一样; 2)必须把表单的enctype属性设置为:multipart/form-data; 3)表单的方法必须为post,因为post提交的数据在消息体中,而无大小限制。 2、对应的action: 1)在 Action 中新添加 3 个和文件上传相关的属性; 2)如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文 件的文件名和文件类型,定义方式是分别是: jsp页面file组件的名称+ContentType, jsp页面file组件的名称+FileName 3)如果上上传多个文件, 可以使用数组或 List struts2学习总结 1:在action中定义的变量,在jsp页面中显示用:<s:property value="变量名" /> 2:在页面中实现自动增加的序号用iterator的statuts的index属性 eg: <s:iterator <s:property </s:iterator> 3:在action类中取得request和session对象的方法 Map session = 设置它们的值的方法 session.put("operation", 页面中取得它们的值: <s:property 4:页面中奇偶行样式不一样的控制方法: <tr class="<s:if test=‘#listStat.odd == true‘>tableStyle-tr1</s:if><s:else>tableStyle-tr2</s:else>"> 5:单选框和复选框的使用方法 1):可以设置默认选中值,注意list的值的设置,通过这种方式使key和value不一样,这种方法比较常用(checkboxlist or radio) <s:radio 2):这里的key和value的值是一样的(checkboxlist or radio) <s:checkboxlist 6:struts2 中的标签会生成类似由<tr><td></td></tr>构成的字串(具体什么标签生成什么,可以查看生成后的页面的源代码)如果不限制这些多余代码的生成,页面将变得无法控制,所以一般我们是不希望它生成多余的代码的,具体的设置方法如果,在struts.xml中统一配置 7:jsp页面中格式化日期的方法 <s:date name="unCarInsModificationInfo.createTime"format="yyyy-MM-dd" 8:默认情况下,当请求action发生时,Struts运行时(Runtime)根据struts.xml里的Action映射集(Mapping),实例化action对应的类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用 1)在classes/sturts.xml中新建Action,并指明其调用的方法 public String aliasAction() { 2)(比较常用) 访问Action时,在Action名后加上“!xxx”(xxx为方法名)。 9:Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。 10:在action类中取得web下某一文件夹物理路径(绝对路径)的方法 11:要想返回的页面不是一个直接JSP页面而是要先通过返回action中的方法读取相应的数据再返回到jsp页面,有两种方法 1)在struts.xml中这么设置 <result 2)在action中返回时直接调用这个方法即可 return findList(); 12:设置checkboxlist中默认值的方法 <s:checkboxlist 13:二级级连下拉框 <s:set name="foobar" 在Struts1.*中,要想访问request、response以及session等Servlet对象是很方便的,因为它们一直是作为形参在各个方法之间进行传递的,而在Struts2中我们就很难看到它们的芳踪了,因为我们获得表单中的值都是通过预先设置好了的get方法来得到的,那么如果有些参数我们必须通过request.getParametre或者session.getAttribute来得到,那么应该怎么做呢?按照Max的教程上的说法,可以分为两种:IoC方式和非IoC方式,如何理解这两种方式的区别呢?IoC是Spring里面的特征之一,字面意思是反转控制,说白了就是依赖注入,比方说类A依赖类B,那么就主动的给A注入一个类B的对象,下面看一下这两种方法的具体实现。 1.非Ioc方式 这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。 获得request对象: A.HttpServletRequest request B.ActionContext ct= ActionContext.getContext() HttpServletRequest (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST); 获得session对象: 在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。 A.Mapsession=ActionContext.getSession(); B.Mapsession=(Map)ActionContext.getContext().get(ActionContext.SESSION); 得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。 2.IoC方式 这种方式相对来说变化就比较少了,具体流程如下所示。 获得request对象: 第一步:让action实现ServletRequestAware接口 第二步:在action中声明一个HttpServletRequest类型的实例变量 第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。 privateHttpServletRequest publicvoid setServletRequest(HttpServletRequestrequest) this.request= request; } 获得Session对象(注意,此时的session是SessionMap类型): 第一步:让action实现SessionAware接口 第二步:在action中声明一个HttpServletRequest类型的实例变量 第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,如下所示。 Spring 面试题 Spring框架有哪些模块? Spring框架由七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,如下所示: (1)Spring 核心容器——IoC容器 (2) Spring AOP (3) SpringORM (4) SpringDAO (5) SpringWEB (6) Spring上下文(Context) (7) SpringMVC 为什么要使用Spring框架,它有什么优点? (1) 轻量级的框架 (2) 非侵入性的 (3) 可以整合其它的框架,比如Struts, Hibernate等 (4) 可以提供事务管理 Spring框架的工作机制是什么? (1) Spring MVC将所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。 (2) DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller。 (3) DispatcherServlet请请求提交到目标Controller。 (4) Controller进行业务逻辑处理后,会返回一个ModelAndView。 (5) Dispathcher查询一个或多个ViewResolver(视图解析器),找到ModelAndView对象指定的视图对象。 (6) 视图对象负责将结果返回给客户端。 怎么使用Spring配置事务 ? Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略。 声明式事务管理的配置方式,通常有以下4种: (1) 使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。 (2) 采用Bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。 (3) 采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。 (4) 采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事务代理的方式,效果非常不错,只是这种配置方式的可读性不如第3种方式。 请你谈谈SSH整合 SSH整合: (1) Struts(表示层)+ Spring(业务层)+ Hibernate(持久层) (2) Struts: Struts是一个表示层框架,主要作用是界面展示、接收请求和分发请求。 在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。 View:沿用 JSP,HTTP,Form,Tag,Resourse; Controller:ActionServlet,struts-config.xml,Action。 (3) Hibernate: Hibernate是一个持久层框架,它只负责与关系数据库的操作。 (4) Spring: Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。 在Spring框架中如何配置数据库驱动? 使用org.springframework.jdbc.datasource.DriverManagerDataSource数据源来配置数据库驱动。 示例: 在Spring框架中applicationContext.xml文件能不能改成其它文件名? ContextLoaderListener是一个ServletContextListener,在启动Tomcat应用服务器时,它会读取WEB-INF目录下的applicationContext.xml文件,初始化Spring配置。 如果你想改变applicationContext.xml文件的名字或改变它的存储位置,可以通过在web.xml文件中定义一个<context-param>元素来解决这个问题。 示例: <context-param> </listener-class> 如何在Web应用里配置Spring? 在/WEB-INF/web.xml文件中,加入如下内容: <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet> 在启动Web应用服务器(Tomcat)时,将加载/WEB-INF/applicationContext.xml文件中的内容。 在应用程序中,可以通过如下方式获取ApplicationContext实例 WebApplicationContextUtils.getWebApplicationContext Spring里如何定义Hibernate 添加hibernatemapping 文件到WEB-INF目录下的applicationContext.xml文件中。 示例: 解释一下Dependency Injection(DI,依赖注入)和IoC(Inversion of Control,控制反转)? 依赖注入DI是一种设计模式,通常也称作控制反转,尽管在技术上来讲,依赖注入是一个IoC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一种特殊的能力。例如,把一个数据库连接以参数的形式传到一个对象的构造函数里面而不是在那个对象内部自行创建一个连接。 控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖。 应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取它依赖的对象的引用,这个责任的反转。 Spring中的BeanFactory与ApplicationContext的作用有哪些? (1) BeanFactory负责读取Bean配置文档,管理Bean的加载和实例化,维护Bean之间的依赖关系,负责Bean的生命周期。 (2)ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: a. 国际化支持 b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”); c. 事件传递:通过实现ApplicationContextAware接口 (3) 常用的获取ApplicationContext的方法: FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创建,参数为配置文件名或文件名数组 ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件。 WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者 servlet来实现 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param> 如何在Spring中实现国际化? 在applicationContext.xml文件中配置一个bean: Spring中的核心类有那些,各有什么作用? BeanFactory:产生一个新的实例,可以实现单例模式。 BeanWrapper:提供统一的get及set方法。 ApplicationContext:提供Spring框架的实现,包括BeanFactory的所有功能。 什么是AOP,AOP的作用是什么? 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。 Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP,提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。 允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强。 使用Spring有什么好处? (1) Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其它的包含了J2EE特有APIs的 (2) Spring能消除在许多工程上对Singleton的过多使用。 (3) Spring能消除使用各种格式的属性定制文件的需要,在整个工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。 (4) Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。 (5) Spring被设计为让使用它创建的应用尽可能少的依赖于它的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 (6) 使用Spring构建的应用程序易于单元测试。 (7) Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 (8) Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。 (9) Spring为数据存取提供了一致的框架,不论是使用JDBC或O/Rmapping产品(如Hibernate)。 什么是Spring,它有什么特点? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 (1) 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布,并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 (2) 控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 (3) 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。 (4) 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。 (5) 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。 Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。 AOP里面几个重要名词概念的解释 (1) 切面(Aspect) 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 (2) 连接点(Joinpoint) 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring (3) 通知(Advice) 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。 (4) 切入点(Pointcut) 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。 (5) 引入(Introduction) 也被称为内部类型声明(inter-typedeclaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。 (6) 目标对象(TargetObject) 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。 (7) AOP代理(AOP Proxy) AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 (8) 织入(Weaving) 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其它纯Java AOP框架一样,在运行时完成织入。 spring工作机制及为什么要用? 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 为什么用Spring: {AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。 Hibernate 比较Hibernate的三种检索策略优缺点 1立即检索; 如何在控制台看到hibernate生成并执行的sql 在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql 设置为true hibernate都支持哪些缓存策略 Read-only: 这种策略适用于那些频繁读取却不会更新的数据,这是目前为止最简单和最有效的缓存策略 hibernate里面的sorted collection sorted collection是在内存中通过java比较器进行排序的 Hibernate工作原理及为什么要用? 原理: 为什么要用: 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: Hibernate的查询方式 Sql、Criteria,objectcomposition 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 Hibernate有哪几种查询数据的方式 3种:hql、条件查询QBC(QueryBy 谈谈Hibernate中inverse的作用 inverse属性默认是false,就是说关系的两端都来维护关系。 说说Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。 saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下: hibernate中对象的三种状态 瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。 瞬时态 由new命令开辟内存空间的java对象, eg. Person person =new Person(”amigo”, “女”); 如果没有变量对该对象进行引用,它将被java虚拟机回收。 瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。 持久态 处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。 当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。 持久对象具有如下特点: 1. 和session实例关联;n 2. 在数据库中有与之关联的记录。 脱管态 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。 脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。 脱管对象具有如下特点: 1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收; 2. 比瞬时对象多了一个数据库记录标识值。4RESA3ES Detached Object(游离对象)有什么好处 Detached Object(游离对象)可以传递到任何层直到表现层而不是用任何DTO(DataTransfer Objects). 然后你还可以重新把游离对象赋给另外一个Session. JDBC hibernate 和 ibatis 的区别 jdbc:手动 hibernate如何实现数据表映射的继承关系 1、两个表,子类重复父类的属性。 hibernate中Query对象的使用 1 个或多个属性查询: hibernate中Criteria和DetachedCriteria的作用是什么? Criteriac=session.createCriteria(Customer.class); DetachedCriteria产生时不需要session hibernate中数据表映射关系主要有什么类型? one-to-many hibernate的核心是什么,他们的相互关系是什么,重要的方法是什么 Configuration MyEclipse加入hibernate的全过程是什么 1.Db-browers加入配置连接 面试中常出现的两个hibernate面试题及答案 1.在数据库中条件查询速度很慢的时候,如何优化? 2.在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。 首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前所有关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前所有由本 SessionFactory构造的Session实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id进行查找,如果第一级缓存查找命中,且数据状态合法,则直接返回。 Hibernate的主键生成机制 1) assigned hibernate面试题:怎么得到一个Collection的大小而不用初始化它 Integer size = hibernate面试题:怎么得到查询结果的记录数而不用返回查询结果 Integer count = 什么是SessionFactory,她是线程安全么? SessionFactory isHibernates concept SessionFactorysessionFactory = new SessionFactory 是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存. 如何配置Hibernate? The configurationfiles ”hibernate.cfg.xml (alternatively can ” Mapping files(*.hbm.xml): These 优化hibernate性能的几点建议 1、针对oracle数据库而言,Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100。Oracle数据库的JDBC驱动默认的FetchSize=15,设置Fetch Size设置为:30、50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存。 即在hibernate配制文件中进行配制: 1 <property name=”hibernateProperties”> 3、不要把所有的责任推在hibernate上,对代码进行重构,减少对数据库的操作,尽量避免在数据库查询时使用in操作,以及避免递归查询操作,代码质量、系统设计的合理性决定系统性能的高低。 4、 对大数据量查询时,慎用list()或者iterator()返回查询结果, (1). 使用List()返回结果时,Hibernate会所有查询结果初始化为持久化对象,结果集较大时,会占用很多的处理时间。 (2). 而使用iterator()返回结果时,在每次调用iterator.next()返回对象并使用对象时,Hibernate才调用查询将对应的对象初始化,对于大数据量时,每调用一次查询都会花费较多的时间。当结果集较大,但是含有较大量相同的数据,或者结果集不是全部都会使用时,使用iterator()才有优势。 5、在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时方会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。 6、对含有关联的PO(持久化对象)时,若default-cascade=”all”或者 “save-update”,新增PO时,请注意对PO中的集合的赋值操作,因为有可能使得多执行一次update操作。 7、 对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解Hibernate的处理过程,尝试不同的方式,可以使得效率提升。尽可能对每个页面的显示,对数据库的操作减少到100—-150条以内。越少越好。 如何进行hibernate性能调优 大体上,对于HIBERNATE性能调优的主要考虑点如下: JDBC ,hibernate分页显示怎么实现? 答:方法分别为: Hibernate的应用(hibernate的结构) 答://首先获得SessionFactory 关于hibernate的几个面试题 1)在hibernate 中,在配置文件呈标题一对多,多对多的标签是什么; Hibernate的五个核心接口 Configuration 接口:配置Hibernate,根据其启动hibernate,创建 如何优化hibernate 1. 使用双向一对多关联,不使用单向一对多 说下hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 hibernate怎么实现类之间的关系 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 hibernate如何实现延迟加载 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) Hibernate数据查询的几种方式 1.使用主键id加载对象(load(),get()); 2.通过对象导航,比如通过stu.getTeam()得到team的实例; 3 使用hql; 4使用qbc(query by criteria) 5直接使用sql语句取得记录集; 一般都使用后面三种方式. 注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete) Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么能知道表的结构 看表结构对应的类文件,比如UserInfo表对应的UserInfo.java文件 S2SH部分 请你谈谈SSH整合 SSH: 综合面试题 1、 简述你对IoC(Inversion spring的IOC有三种注入方式 2、 Spring的Bean有多种作用域,包括: 3、 简单描述Spring Framework与Struts的不同之处,整合Spring与Struts有哪些方法,哪种最好,为什么? 答、 Spring是完整的一站式框架,而Struts仅是MVC框架,且着重于MVC中的C。Spring有三种方式整合Struts:使用 Spring 的 ActionSupport 类整合 Struts;使用 Spring 的DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor;将 Struts Action 管理委托给 Spring 框架,动作委托最好。(详见使用Spring 更好地处理Struts 动作) Spring 2.0新增一种方式:AutowiringRequestProcessor。(详见http://www.javaeye.com/topic/24239) 4、 Hibernate中的update()和saveOrUpdate()的区别 答、saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下: 如果对象在该session中已经被持久化,不进行操作; 对象的标识符属性(identifierproperty)在数据库中不存在或者是个暂时的值,调用save()方法保存它; 如果session中的另一个对象有相同的标识符抛出一个异常; 以上皆不符合则调用update()更新之。 5、 Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。 答、 在context中定义DataSource,创建SessionFactoy,设置参数;DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。 在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(详见Spring framework 2.0 Reference的12.2节Hibernate) 声明式事务需声明事务管理器,在context中设置指定属性,用确定和。
|