token/>
第二步:
在struts.xml中添加如下配置token拦截器
/tokenTag.jsp
Hibernate
2.试述load()和get()的区别。
P223
1)当数据库中不存在对应的ID数据时,调用load()方法将抛出objectnotfoundexception异常,而get()方法将返回null。
2)Load()方法可以返回实体的代理类实例,而get()方法直接返回实体。
3)Load()方法可以在一级缓存和二级缓存中充分查找现有的数据,而get()方法只在一级缓存中进行查找,如没有发现就直接调用SQL在数据库中查找。
3.简述使用Hibernate完成持久化操作的3个准备和7个步骤。
三个准备如下:
1.需要的jar包;2.Hibernate配置文件;3.实体类和映射文件
七个步骤:
1.创建Congfigure对象。
读取并解析配置文件(相当于使用数据源(DataSource)获取连接前读取DataSource的配置文件):
Configurationconf=newConfiguration().configure();
2.读取并解析映射信息,创建SessionFactory(相当于创建了数据源(DataSource)对象),它是产生Session对象实例的工厂,它是唯一的。
:
SessionFactorysf=conf.buildSessionFactory();
3.创建Session对象,打开session(相当于JDBC获得数据库的连接):
Sessionsession=sf.openSession();
4.开始一个事务(增删改必须,查可选):
tx=sessionl.beginTransaction();
5.持久化操作:
session.save(user);
6.结束事务:
mit();
7.关闭session,释放数据库的链接:
session.close();
23.Hibernate继承映射有哪几种方式?
试对几种方式进行比较。
Hiberbate集合类型的映射、关联映射,组件映射
方式一:
整个的继承体系就用一张表、
建立关系模型原则:
描述一个继承关系只用一张表,也就是说子类所使用的表与父类相同
优缺点:
首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。
其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段notnull(非空),维护起来方便,只需要修改一个表,灵活性差,表中冗余字段会随着子类的增多而越来越多,在任何情况下,都只需处理一个表,对于单个对象的持久话操作只需要处理一个表
方式二:
每个子类一张表,存放子类所特有的属性
建立关系模型原则:
每个子类使用一张表,但这些子类所对应的表都关联到基类所对应的表中
优缺点:
这种设计方式完全符合关系模型的设计原则,且不存在冗余,
维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置,对于父类的查询需要使用左外链接,对于子类查询需要使用内链接,对于子类的持久话至少要处理两个表
方式三:
每个具体类一张表(union-subclass),保存是子类完整信息
建立关系模型原则:
每个具体类对应一张表,有多少具体类就需要建立多少个独立的表
优缺点:
这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题。
如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改,映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置,对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表,对于单个对象持久话操作只需要处理一个表
比较方面
每个具体类一张表
每个分层结构一张表
每个子类一张表
建立关系模型原则
每个具体类对应一张表,有多少具体类就需要建立多少个独立的表
描述一个继承关系只用一张表,也就是说子类所使用的表与父类相同
每个子类使用一张表,但这些子类所对应的表都关联到基类所对应的表中
关系模型的优缺点
这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题
缺点有二:
首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。
其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段notnull(非空)
这种设计方式完全符合关系模型的设计原则,且不存在冗余
可维护性
如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改
维护起来方便,只需要修改一个表
维护起来比较方便,对每个类的修改只需要修改其所对应的表
灵活性
映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置
灵活性差,表中冗余字段会随着子类的增多而越来越多
灵活性很好,完全是参照对象继承的方式进行配置
查询性能
对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表
在任何情况下,都只需处理一个表
对于父类的查询需要使用左外链接,对于子类查询需要使用内链接
维护性能
对于单个对象持久话操作只需要处理一个表
对于单个对象的持久话操作只需要处理一个表
对于子类的持久话至少要处理两个表
24.什么是Hibernate的并发机制?
怎么去处理并发问题?
并发问题的原因:
基本上都是因为没有设置好事务的隔离性所导致的,即一个事务在更新数据的过程中,另一个事务在不同时刻读取或操作了同样的数据,结果导致了各种问题。
并发带来的问题:
更新丢失、脏读、不可重复读、幻读
并发问题的解决方案——“加锁”
常用的锁类型:
共享锁、排它锁、更新锁(共享锁的一种特例,可提升为排它锁)
、意向锁(意向锁包括意向共享锁、意向排它锁等)
悲观锁在更新数据时把记录锁住,防止其他事务读写这个记录。
25、在持久化层,对象分为哪些状态?
如何转换?
在Hibernate应用中Java对象的状态:
1)临时状态(transient):
刚刚用new语句创建,还没有被持久化,不处于Session缓存中.处于临时状态的Java对象被称为临时对象
2)持久化状态(persistent):
已经被持久化,加入到Session缓存中.处于持久化状态的Java对象被称为持久化对象
3)游离状态(detached):
已经被持久化,但不处于Session缓存中.处于游离状态的Java对象被称为游离对象
26、试述HibernateSession接口中load()与get()、persist()与save()方法的区别。
get()方法与load()方法的区别:
获取失败时,处理方式不同
Hibernate没有查找到数据,get()方法返回null,而load()方法抛出ObjectNotFoundException。
因此,在代码编写上存在差别。
load()使用了延迟检索策略,load()方法可以返回实体的代理类实例,而get()永远只返回实体类
Load()方法可以在一级缓存和二级缓存中充分查找现有的数据,而get()方法只在一级缓存中进行查找,如没有发现就直接调用SQL在数据库中查找
persist()方法无返回值,而save()方法会返回保存对象的标识符。
persist()方法只能保存暂态和持久态的对象,如果试图保存其他状态的对象,Hibernate会抛出异常,而save()方法则可以保存任何状态的对象。
27、试述Query接口list()与iterate()区别。
list()方法与iterate()方法的区别:
1)执行查询不同:
list()方法直接运行查询结果所需要的查询语句,它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。
iterate()方法它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)
2)缓存的使用不同:
list()方法只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存。
iterate()方法则可以充分利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出。
3)对于结果集的处理方法不同:
list()方法一次获得所有的结果集对象,而且会初始化所有的结果集对象,如果结果集非常大会占据很多内存空间,甚至造成内存溢出。
iterate()方法不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象,因此在访问中可以控制缓存中对象的数量,以避免占用过多缓存。
13.如何优化Hibernate查询性能?
1.优化SQL语句:
HQL语句的书写方法、查询时所使用的查询方法、对象关联时所使用的抓取策略
2.使用正确的查询方法:
执行数据查询功能的基本方法有两种:
一种是得到单个持久化对象的get()方法和load()方法
另一种是Query对象的list()方法和iterate()方法。
在开发中应该依据不同的情况选用正确的方法。
3.抓取优化(fetch):
抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL或条件查询中声明。
4.使用二级缓存:
Hibernate只启用一级缓存,通过正确地使用二级缓存,往往可以获得意想不到的性能
11.试述Hibernate有哪些检索方式?
P227
1)导航对象图检索方式、2)OID检索方式
3)HQL检索方式:
HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念。
4)QBC检索方式:
QBC(QueryByCriteria)是一种纯面向对象查询方式。
5)本地SQL检索方式:
Spring:
1.请你谈谈SSH整合。
SSH:
Struts(表示层)+Spring(业务层)+Hibernate(持久层)
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
2.解释一下DI(DependencyInjection,依赖注入)和IoC(InversionofControl,控制反转)。
依赖注入DI是一个程序设计模式和架构模型,一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:
把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。
控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。
也可以说,依赖被注入到对象中。
所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
3.什么是AOP,AOP的作用是什么?
AOP意思是面向切面(方面)编程。
AOP是在实现业务处理阶段,降低代码(或模块)之间的耦合度。
AOP技术是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加辅助功能的技术。
它一般只适用于具有横切业务逻辑的应用场合,比如事务管理、日志管理、访问权限管理和性能监测管理等。
4.根据自己的理解谈谈以下几个概念:
切面(Aspect)、通知(Advice)、切入点(Pointcut)、织入(Weaving)。
切面(Aspect):
对象操作过程中的截面,指需要实现的交叉功能。
连接点(JoinPoint):
程序运行过程中的某个阶段点。
如某个方法调用,或者某个异常被抛出。
在这个阶段点插入切面。
通知(Advice):
在某个连接点所采用的处理逻辑,即切面的实际实现。
切点(PointCut):
一系列连接点的集合,指明Advice将在何时触发,即Advice应用在哪些连接点
织入(Weaving):
将切面应用到目标对象从而创建一个新的代理对象的过程。
5.描述一下spring中实现DI(dependencyinjection)的几种方式。
方式一:
接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。
方式二:
Type2IoC:
Setterinjection对象创建之后,将被依赖对象通过set方法设置进去
方式三:
Type3IoC:
Constructorinjection对象创建时,被依赖对象以构造方法参数的方式注入,Spring的方式
6.请介绍下spring中bean的作用域及生命周期。
Bean的作用域
singleton:
在每个SpringIoC容器中一个bean定义只有一个对象实例。
默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true”。
prototype:
每次从容器获取bean都是新的对象。
.request、.session、.globalsession
BeanFactory中Bean的生命周期:
定义Bean、初始化Bean、调用Bean(也就是使用Bean)、销毁Bean
7.如何使用Spring实现国际化?
1、导入Spring标签文件;2、配置Spring标签库和资源库;3、创建资源库文件;4、标签化JSP页面中的文字;5、创建资源文件。
8.举例说明使用XML方式配置AOP所使用的类、标签和属性。
Spring提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常见的一个。
该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。
XmlBeanFactory类将获取此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
config>
aspectid="aspectDemo"ref="aspectBean">
pointcutid="somePointcut"
expression="execution(*annoaop.Component.business*(..))"/>beforepointcut-ref="somePointcut"
method="validateUser"/>
beforepointcut-ref="somePointcu