SSH原理总结

Hibernate工作原理及为什么要用:

原理:

hibernate,通过对jdbc进行封装,对 java类和 关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的jdbc + sql操作数据的方式,从而使开发人员可以用更多精力进行对象方面的开发

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory

3.打开Sesssion

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory

为什么要用:

1.    对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2.    Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

3.    hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

什么是Hibernate延迟加载

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

Hibernate中类之间的关联关系有几种(如:一对多、多对多的关系)

many-to-one、one-to-many、many-to-many、 one-to-one

Hibernate的缓存机制

一、hibernate一级缓存

(1)hibernate支持两个级别的缓存,默认只支持一级缓存;

(2)每个Session内部自带一个一级缓存;

(3)某个Session被关闭时,其对应的一级缓存自动清除;

二、hibernate二级缓存

(1) 二级缓存独立于session,默认不开启;

题目5: Hibernate的查询方式

本地SQL查询、Criteria、Hql

优化Hibernate

1.使用双向一对多关联,不使用单向一对多

2.不用一对一,用多对一取代

3.配置对象缓存,不使用集合缓存

Struts工作机制?为什么要使用Struts?

工作机制:

Struts的工作流程:

在web应用启动时就会加载初始化ActionServlet,ActionServlet从

struts-config.xml文件中读取配置信息,把它们存放到各种配置对象

当ActionServlet接收到一个客户请求时,将执行如下流程.

-(1)检索和用户请求匹配的ActionMapping实例,如果不存在就返回请求路径无效信息;

-(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;

-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;

-(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;

-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;

-(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;

-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

为什么要用:

1. JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱。

2. 基于Struts开发的应用:

不用再考虑公共问题

专心在业务实现上

结构统一,易于学习、维护

新手也可写出好程序

为什么要用spring

Spring是一个轻量级的IOC和AOP框架。

IOC(控制反转)意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转

AOP(面向切面),它将那些影响多个类的行为封装到可重用的模块中,面向对象是把问题从同类事物中抽象出来,面向切面是把问题从不同类问题中抽象出来。

1. hibernate中get()与load()区别

 请注意如果没有匹配的数据库记录,load()方法可能抛出无法恢复的异常(unrecoverable exception)。如果类的映射使用了代理(proxy),load()方法会返回一个未初始化的代理,直到你调用该代理的某方法时才会去访问数据库。若你希望在某对象中创建一个指向另一个对象的关联,又不想在从数据库中装载该对象时同时装载相关联的那个对象,那么这种操作方式就用得上的了。如果为相应类映射关系设置了batch-size,那么使用这种操作方式允许多个对象被一批装载(因为返回的是代理,无需从数据库中抓取所有对象的数据)。如果你不确定是否有匹配的行存在,应该使用get()方法,它会立刻访问数据库,如果没有对应的行,会返回null。

判断:使用save/persist一个对象时,便立即向数据库发送执行insert sql语句?

1) persist把一个瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间。

2) persist"保证"当它在一个transaction外部被调用的时候并不触发一个Sql Insert,这个功能是很有用的。

3) save会立即执行Sql insert,不管是不是在transaction内部还是外部.

指出一下代码哪里错误使用了Hibernate。

背景简介:Board是一个实体类,id是它的主键,name和description是他的两个属性。BoardDao是Board实体的数据访问对象,BoardBo是业务对象,用户提交变更Board对象的请求,由Struts的BoardAction接收,调用BoardBo处理。HibernateUtil.currentSession()用于返回当前请求的Session对象。

//数据访问层代码:BoardDao.java

publicBoardloadBoard(Longid){

Sessionsession=HibernateUtil.currentSession();

returnsession.load(Board.class,id);

}

publicvoidupdateBoard(Boardboard){

Sessionsession=HibernateUtil.currentSession();

session.update(board);

}

//业务对象层代码:BoardBo.java

privateBoardDaoboardDao;

publicvoidupdateBoard(Longid,Stringname,Stringdescription){

Boardboard=boardDao.loadBoard(id);

board.setName(name);

board.setDescription(description);

boardDao.updateBoard(board);

}

//Web控制器代码:BoardAction.java

privateBoardBoBoardBo;

publicActionForwardexecute(

ActionMappingmapping,

ActionFormform,

HttpServletRequestrequest,

HttpServletResponseresponse)throwsException{

Stringid=request.getParameter("id");

Stringname=request.getParameter("name");

Stringdescription=request.getParameter("description");

boardBo.updateBoard(id,name,description);

returnmapping.findForward("update-success");

}

public void updateBoard(Board board) {

Session session = HibernateUtil.currentSession();

Transaction t=session.beginTransaction();

session.update(board);

t.commit();

}

简单叙述一下Spring中BeanFactory与ApplicationContext的差别

使用BeanFactory从xml配置文件加载bean:

importorg.springframework.beans.factory.xml.XmlBeanFactory;

importorg.springframework.core.io.FileSystemResource;

publicclassXmlConfigWithBeanFactory{

publicstaticvoidmain(String[]args){

XmlBeanFactoryfactory=newXmlBeanFactory(newFileSystemResource(

"build/beans.xml"));

}

}

使用ApplicationConText从xml配置文件加载bean:

publicclassXmlConfigWithApplication{

publicstaticvoidmain(String[]args){

ApplicationContextapplication=newClassPathXmlApplicationContext(beans.xml"));

application.getBean("BeanName");

}

}

简而言之,BeanFactory提供了配置框架和基本的功能, 而 ApplicationContext为它增加了更强的功能,这些功能中的一些或许更加接近J2EE并且围绕企业级应用。一般来说,ApplicationContext是 BeanFactory的完全超集,任何BeanFactory功能和行为的描述也同样被认为适用于ApplicationContext

相对于BeanFactory而言,ApplicationContext 提供了以下扩展功能.

(a) 国际化支持 (b) 资源访问

(c) 事件传播 (d) 多实例加载

2. 写一段程序,使用springAPI读取classpath下的一个xml文件,并解析

(1)Resource resource=new ClassPathResource("appcontext.xml");

BeanFactory factory=new XmlBeanFactory(resource);

(2)ClassPathXmlApplicationContext appcontext=new ClassPathXmlApplicationContext("appcontext.xml");

BeanFactory factory=(BeanFactory)appcontext;

在hibernate中使用Integer做映射和使用int做映射之间有什么差别

Integer code和int code;的区别:

Integer是对象. code = null; 对象可以为空.

int 是普通类型, 不可能 = null.

根据你的数据库code是可以空的, 故应该映射成Integer.

你没理由hbm.xml里写Integer, 类里却写int

(1)使用Spring如何简化了Hibernate编码?

通过org.springframework.orm.hibernate3.support.HibernateDaoSupport类支持数据库操作,且封装了事务.

public class AccountDAO extends HibernateDaoSupport implements IAccountDAO{

(2)Spring如何与Struts集成?

<xml version="1.0" encoding="UTF-8">

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

<data-sources />

<form-beans >

<form-bean name="regForm" type="demo.form.RegForm" />

</form-beans>

<global-exceptions />

<global-forwards />

<action-mappings >

<action

attribute="regForm"

name="regForm"

path="/reg"

scope="request"

type="org.springframework.web.struts.DelegatingActionProxy">

<forward name="ok" path="/ok.jsp" />

</action>

</action-mappings>

<message-resources parameter="demo.ApplicationResources" />

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />

</plug-in>

</struts-config>

如何使用Spring2.0实现声明式事务?

<!--通用事务管理器-->

<bean id="TransactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

<!--声明一个通知,用以指出要管理哪些事务方法及如何管理-->

<tx:advice id="txAdvice" transaction-manager="TransactionManager">

<tx:attributes>

<!-- 对get/load/search开头的方法要求只读事务 -->

<tx:method name="get*" propagation="SUPPORTS"

read-only="true" />

<tx:method name="load*" propagation="SUPPORTS"

read-only="true" />

<tx:method name="search*" propagation="SUPPORTS"

read-only="true" />

<!-- 对其它方法要求事务 -->

<tx:method name="*" propagation="REQUIRED" />

</tx:attributes>

</tx:advice>

<!--声明一个config,用以将通知和目标业务类关联起来-->

<aop:config>

<!-- 添加事务支持,因为前面配置的transactionManager是专对Hibernate的事务管理器-->

<aop:pointcut id="bizMethods" expression_r_r="execution(* demo.*.*(..))" />

<!-- 织入 -->

<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />

</aop:config>

(4)依赖注入的好处是?

程序可扩展性更强;

利于并行开发;

(5)Spring怎么实现依赖注入?

<xml version="1.0" encoding="UTF-8">

<beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="userdao" class="demo.dao.UserDAO"/>

<bean id="usermanager" class="demo.biz.UserManager">

<property name="userdao" ref="userdao"/>

</bean>

</beans>

(6)“面向方面编程”的好处是?

将程序中涉及的公共问题集中解决

(7)和SQL相比,HQL有哪些特点?

HQL是面向对象的查询语言。select Fw表示查询Fw对象

(8)如何配置单向多对一关联?

<class name="Jd" table="TBL_JD">

<id name="jdid" column="jdid" type="long">

<generator class="identity" />

</id>

<property name="jdname" column="jd" type="string" />

<many-to-one name="qx" class="Qx" column="qxid" />

</class>

(9)如何配置单向一对多关联?

<class name="Qx" table="TBL_QX">

<id name="qxid" column="qxid" type="long">

<generator class="native" />

</id>

<property name="qxname" column="qx" type="string" />

<set name="jds" >

<key column="qxid" />

<one-to-many class="Jd" />

</set>

</class>

(10)如何配置双向一对多关联?

<class name="Jd" table="TBL_JD">

<id name="jdid" column="jdid" type="long">

<generator class="identity" />

</id>

<property name="jdname" column="jd" type="string" />

<many-to-one name="qx" class="Qx" column="qxid" />

</class>

<class name="Qx" table="TBL_QX">

<id name="qxid" column="qxid" type="long">

<generator class="native" />

</id>

<property name="qxname" column="qx" type="string" />

<set name="jds" >

<key column="qxid" />

<one-to-many class="Jd" />

</set>

</class>

初步学习者使用。

转载于:https://www.cnblogs.com/chenyq/p/5342110.html

Hibernate面试总结相关推荐

  1. Hibernate面试问题与解答

    Hibernate面试问题与解答 Hibernate是Java应用程序中使用最广泛的ORM工具之一.它在企业应用程序中用于数据库操作.所以我决定写一篇关于的帖子 hibernate面试问题,在面试前刷 ...

  2. hibernate面试问题_Hibernate面试问答

    hibernate面试问题 Hibernate is one of the most widely used ORM tool for Java applications. It's used a l ...

  3. java面试要点---Hibernate面试系统知识点复习,hibernate原理,缓冲---随时更新

    1.Hibernate基础 1.1. Hibernate用来做什么 * Hibernate是开源的.用亍封装数据访问层的组件,我们称乊为数据访问层框架(戒持久层框架). 乊前我们通过JDBC/SQL语 ...

  4. Hibernate中保存与持久性以及saveOrUpdate之间的区别

    保存与保存或更新与持久保存在Hibernate中 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hiberna ...

  5. 休眠面试问答-最终清单

    这是有关Hibernate Framework的一些最重要问题的摘要,可能会要求您在访谈中回答! 您无需担心下一次面试的机会,因为Java Code Geeks在这里为您服务! 您可能会被问到的大多数 ...

  6. hibernate保存失败_Hibernate:保存与保存并保存或更新

    hibernate保存失败 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hibernate中get和load ...

  7. 近5年133个Java面试问题列表

    2019独角兽企业重金招聘Python工程师标准>>> Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接 ...

  8. Hibernate教程

    Hibernate教程 最近我写了很多hibernate教程.Hibernate是当前市场上最好的Java ORM工具之一.所以这篇文章就像是hibernate教程和示例的所有帖子的索引.您可以按顺序 ...

  9. Hibernate常见面试题

    在Java J2EE方面进行面试时,常被问起的Hibernate面试问题,大多都是针对基于Web的企业级应用开发者的角色的.Hibernate框架在Java界的成功和高度的可接受性使得它成为了Java ...

最新文章

  1. windows10+Python3-如何安装numpy和matplotlib包
  2. 实现在Windows下安装Lighttpd的方法
  3. [网络安全提高篇] 一一五.Powershell恶意代码检测 (3)Token关键词自动提取
  4. 某聊天工具消息记录数据库文件解密逆向分析
  5. 自己实现JSON、XML的解析 没那么难
  6. gradle引入子module配置_原创 | 看完此文,你对Gradle的理解又升级了
  7. Docker折腾手记-安装
  8. 暑期训练日志----2018.8.10
  9. 报错, liquibase.exception.ValidationFailedException: Validation Failed
  10. .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
  11. SQL Server 阻塞原因分析
  12. C++程序的构成和书写形式
  13. 【链接】Eclipse的Debug调试技巧
  14. 微型计算机中央处理器又称为,微处理器又称为什么
  15. @click.stop作用(阻止点击事件继续传播,即阻止事件冒泡)
  16. 怎样理解ZBrush中的2.5D绘画
  17. 【Git】报错处理:fatal: detected dubious ownership in repository at .....Set the environment variable GIT_T
  18. python智力问答游戏代码,python实现智力问答测试小程序
  19. deepCopy:1 Uncaught SyntaxError: Identifier ‘xxx’ has already been declared
  20. Word中如何创建自动编号的标题?

热门文章

  1. ktv数据表设计 1216
  2. ado.net 格式 1201
  3. 单选框 RadioButton 1130
  4. dj鲜生-27-登陆装饰器-使用django内置的登陆装饰器
  5. jquery-ajax-jsonp-360搜索引擎的联想词获取
  6. 获取某个地址的utxo的三种方法
  7. [小技巧]快速生成验证码
  8. INNODB自增主键的一些问题 vs mysql获得自增字段下一个值
  9. linux文件目录与管理
  10. IOS 文本文字下面添加下划线