文档库 最新最全的文档下载
当前位置:文档库 › hibernate面试题

hibernate面试题

hibernate面试题
hibernate面试题

1.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的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.Hibernate是如何延迟加载?

1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection)

2. Hibernate3 提供了属性的延迟加载功能

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

3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、

4.说下Hibernate的缓存机制

1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2. 二级缓存:

a) 应用及缓存

b) 分布式缓存

条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据

c) 第三方缓存的实现

5.Hibernate的查询方式

Sql、Criteria,object comptosition

Hql:

1、属性查询

2、参数查询、命名参数查询

3、关联查询

4、分页查询

5、统计函数

6.如何优化Hibernate?

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

2.灵活使用单向一对多关联

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

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

5.一对多集合使用Bag,多对多集合使用Set

6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////

答案二:

hibernate工作原理:

1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。

2、由hibernate.cfg.xml中的读取解析映射信息。

3、通过config.buildSessionFactory();//得到sessionFactory。

4、sessionFactory.openSession();//得到session。

5、session.beginTransaction();//开启事务。

6、persistent operate;

6、session.getTransaction().commit();//提交事务

7、关闭session;

8、关闭sessionFactory;

hibernate优点:

1、封装了jdbc,简化了很多重复性代码。

2、简化了DAO层编码工作,使开发更对象化了。

3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。

4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。

hibernate延迟加载:

get不支持延迟加载,load支持延迟加载。

1、hibernate2对实体对象和集合实现了延迟加载

2、hibernate3对提供了属性的延迟加载功能

hibernate延迟加载就是当使用session.load(User.class, 1)或者session.create Query()查询对象或者属性的时候

这个对象或者属性并没有在内存中,只有当程序操作数据的时候,才会存在内存中,这样就实现延迟加载,节省了内存的开销,从而提高了服务器的性能。

Hibernate的缓存机制

一级缓存:session级的缓存也叫事务级的缓存,只缓存实体,生命周期和ses sion一致。不能对其进行管理。

不用显示的调用。

二级缓存:sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的,也值缓存实体,生命周期和sessionFactory一致,可以进行管理。

首先配置第3放插件,我们用的是EHCache,在hibernate.cfg.xml文件中加入

true

在映射中也要显示的调用,

二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。

在程序中必须手动启用查询缓存:query.setCacheable(true);

优化Hibernate

1、使用一对多的双向关联,尽量从多的一端维护。

2、不要使用一对一,尽量使用多对一。

3、配置对象缓存,不要使用集合缓存。

4、表字段要少,表关联不要怕多,有二级缓存撑腰。

(1)一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选)

A)表对应类B)记录对应对象C)表的字段对应类的属性

(2)以下关于SessionFactory的说法哪些正确?(多选)

)一个SessionFactory对象对应一个数据库存储源。C)SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个

(3)Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪个元素映射orders属性?

A) B) C) D)<:property>

(4)元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,c asecade属性应该取什么值?(单选)

)save-update

(5)以下哪些属于Session的方法?

A)load()B)save()C)delete()D)update()E)open()F)close()

(6)以下程序的打印结果是什么?(单选)

1. tx = session.beginTransaction();

2. Customer c1=(Customer)session.load(Customer.class,new Long

(1));

3. Customer c2=(Customer)session.load(Customer.class,new Long

(1));

4. System.out.println(c1==c2);

5. https://www.wendangku.net/doc/111436342.html,mit();

6. session.close();

打印true

(7)以下程序代码对Customer的name属性修改了两次:

1. tx = session.beginTransaction();

2. Customer customer=(Customer)session.load(Customer.class,

3. new Long(1));

4. customer.setName(\"Jack\");

5. customer.setName(\"Mike\");

6. https://www.wendangku.net/doc/111436342.html,mit();

执行以上程序,Hibernate需要向数据库提交几条update语句?(单选)B,1

(8)在持久化层,对象分为哪些状态?(多选)

A)临时状态C)游离状态D)持久化状态

(9)对于以下程序,Customer对象在第几行变为持久化状态?(单选)

1. Customer customer=new Customer(); //line1

2. customer.setName(\"Tom\"); //line2

3. Session session1=sessionFactory.openSession(); //line3

4. Transaction tx1 = session1.beginTransaction(); //line4

5. session1.save(customer); //line4

6. https://www.wendangku.net/doc/111436342.html,mit(); //line5

7. session1.close(); //line6

A) line1 B)line2 C)line3 D)line4 E)line5 F)line6

(10)对于以下程序,Customer对象在第几行变为游离状态?(单选)

1. Customer customer=new Customer(); //line1

2. customer.setName(\"Tom\"); //line2

3. Session session1=sessionFactory.openSession(); //line3

4. Transaction tx1 = session1.beginTransaction(); //line4

5. session1.save(customer); //line4

6. https://www.wendangku.net/doc/111436342.html,mit(); //line5

7. session1.close(); //line6

)line6

(11)以下哪一种检索策略利用了外连结查询?(单选)

A)立即检索B)延迟检索C)迫切左外连结检索

(12)假设对Customer类的orders集合采用延迟检索策略,编译或运行以下程序,会出现什么情况(单选)

1. Session session=sessionFactory.openSession();

2. tx = session.beginTransaction();

3. Customer customer=(Customer)session.get(Customer.class,ne

w Long(1));

4. https://www.wendangku.net/doc/111436342.html,mit();

5. session.close();

6. Iterator orderIterator=customer.getOrders().iterator();

A)编译出错B)编译通过,并正常运行C)编译通过,但运行时抛出异常

(13)关于HQL与SQL,以下哪些说法正确?(多选)

A)HQL与SQL没什么差别B)HQL面向对象,而SQL操纵关系数据库C)在HQL与SQL中,都包含select,insert,update,delete语句D)HQL仅用于查询数据,不支持insert,update和delete语句

(14)事务隔离级别是由谁实现的?(单选)

A)Java应用程序B)Hibernate C)数据库系统D)JDBC驱动程序

(15)悲观锁与乐观锁,哪个具有较好的并发性能?(单选)

A)悲观锁B)乐观锁

答案:

(1)A,B,C (2)B,C (3)A (4)D (5)A,B,C,D,F (6)C (7)B (8)A,C,D (9)D (10)

F (11)C (12)C (13)B,D (14)C (15)B

Hibernate对象的三种状态是什么?

瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Valu e Object)。

瞬时态

由new命令开辟内存空间的java对象,

eg. Person person = new Person(”amigo”, “女”);

如果没有变量对该对象进行引用,它将被java虚拟机回收。

瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。

持久态

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

持久对象具有如下特点:

1. 和session实例关联;

2. 在数据库中有与之关联的记录。

脱管态

当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

脱管对象具有如下特点:

1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;

2. 比瞬时对象多了一个数据库记录标识值。

Detached Object(游离对象)有什么好处?

Detached Object(游离对象)可以传递到任何层直到表现层而不是用任何DTO(Data Transfer Objects). 然后你还可以重新把游离对象赋给另外一个Se ssion.

jdbc、hibernate、ibatis的区别?

jdbc:手动

手动写sql

delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象。

select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。

ibatis的特点:半自动化

sql要手动写

delete、insert、update:直接传入一个对象

select:直接返回一个对象

hibernate:全自动

不写sql,自动封装

delete、insert、update:直接传入一个对象

select:直接返回一个对象

Hibernate如何实现数据表映射的继承关系?

1、两个表,子类重复父类的属性。

2、一个表,子类父类共用一个表

3、两个表,子类引用父类的主键,享用公共的字段或属性。

批量删除

Query que ry=session.createQuery(”update”或”delete”);

query.executeUpdate();

Hibernate中Query对象的使用

1 个或多个属性查询:

Query query=session.createQuery(”select customername,customerid from Customer”)

List l=query.list();

For(int i=0;i

{

Obejct[] object=(Object[])l.get(i);

Object[0] object[1]

}

}

分组: “select count(*),productname from Product group by productname o rder by productname”

取值与属性一样

配置的查询,在*.hbm.xml中

from Product where productid=:productid

]]>

Query query=session.getNamedQuery(sql);

联接1

”from Customer as customer join fetch customer.buySet”:将多的放到buy Set属性中,得出的结是Customer有一个,Buy有多个

联接2

“from Customer as customer join customer.buySet”:得出的对象,customer与buy是1对1

子查询:

”from Customer as customer where (select count(*) from customer.buySe t)>1″

Hibernate中Criteria 和DetachedCriteria的作用是什么?

Criteria c=session.createCriteria(Customer.class);

//设置条件

c.add(Expression.ge(“字段名”,”值对象”))

ge:>=

gt:>

le:<=

lt:<

eq:=

//排序

c.addOrder(Order.asc(“字段名”))

//分页

c.setFirstResult(1)//从第2行开始提取

c.setMaxResults(5)//返回5行

DetachedCriteria产生时不需要session

DetachedCriteria dc= DetachedCriteria.forClass(Customer.class) Criteria c=Dc.getExecutableCriteria(session)

Hibernate中数据表映射关系主要有什么类型?

one-to-many

inverse:主控方,外键的关系有谁控制

inverse=false 是主控方,外键是由它控制的

inverse=true 是被控方,外键与它没关系

要想实现主控方的控制必须将被控方作为主控方的属性

cascade:级联

主表增从表增

主表修从表修

主表删从表删

lazy:延迟

lazy=false:一下将所有的内容取出,不延时(常用)

lazy=true:取出部分内容,其余内容动态去取

通过get可以取出对方的所有内容

hibernate的核心类是什么,它们的相互关系是什么?重要的方法是什么? Configuration

SessionFactory

Session如下方法

Save

load

Update

Delete

Query q=CreateQuery(“from Customer where customerName=:custom erName”)

beginTransaction

close

Transaction

Commit()

在myeclipse加入hibernate环境的全过程是什么?

1.Db-browers加入配置连接

2.新建工程

3.加入hibernate环境,指定*.hbm.xml及HibernateSessionFactory文件所在的位置

详细内容参见以前写的hibernate的第一个小例子

面试中常出现的两个Hibernate面试题及解答

1.在数据库中条件查询速度很慢的时候,如何优化?

1.建索引

2.减少表之间的关联

3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面

4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

[2.在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题?

解决方案一,按照Object[]数据取出数据,然后自己组bean

解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1 filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了。具体怎么用请看相关文档,我说的不是很清楚。

session.load()和session.get()的区别

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。

Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。

load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

Session在加载实体对象时,将经过的过程:

首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前所有关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前所有由本SessionFactory构造的Session 实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id 进行查找,如果第一级缓存查找命中,且数据状态合法,则直接返回。

之后,Session会在当前“NonExists”记录中进行查找,如果“NonExists”记录中存在同样的查询条件,则返回null。“NonExists”记录了当前Session实例在之前所有查询操作中,未能查询到有效数据的查询条件(相当于一个查询黑名单列表)。如此一来,如果Session中一个无效的查询条件重复出现,即可迅速作出判断,从而获得最佳的性能表现。

对于load方法而言,如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。

如在缓存中未发现有效数据,则发起数据库查询操作(Select SQL),如经过查询未发现对应记录,则将此次查询的信息在“NonExists”中加以记录,并返回null。

根据映射配置和Select SQL得到的ResultSet,创建对应的数据对象。

将其数据对象纳入当前Session实体管理容器(一级缓存)。

执行Interceptor.onLoad方法(如果有对应的Interceptor)。

将数据对象纳入二级缓存。

如果数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法。

返回数据对象。

Hibernate的主键生成机制

1) assigned

主键由外部程序负责生成,无需Hibernate参与。

2) hilo

通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

3) seqhilo

与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment

主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

5) identity

采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。

6) sequence

采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。

7) native

由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

8) uuid.hex

由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

9) uuid.string

与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。

10) foreign

使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。

这10中生成OID标识符的方法,increment 比较常用,把标识符生成的权力交给Hibernate处理.但是当同时多个Hibernate应用操作同一个数据库,甚至同一张表的时候.就推荐使用identity 依赖底层数据库实现,但是数据库必须支持自动增长,当然针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况下.可以选择用native 让Hibernate来帮选择identity,sequ ence,或hilo.

另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。

不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制

Struts,Spring,Hibernate面试题总结收藏

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的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.Hibernate是如何延迟加载?

1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection)

2. Hibernate3 提供了属性的延迟加载功能

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

3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、

4.说下Hibernate的缓存机制

1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2. 二级缓存:

a) 应用及缓存

b) 分布式缓存

条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据

c) 第三方缓存的实现

5.Hibernate的查询方式

Sql、Criteria,object comptosition

Hql:

1、属性查询

2、参数查询、命名参数查询

3、关联查询

4、分页查询

5、统计函数

6.如何优化Hibernate?

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

2. 灵活使用单向一对多关联

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

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

5. 一对多集合使用Bag,多对多集合使用Set

6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

7.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组件生成动态网页,返回给客户;

为什么要用:

JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件

8.Struts的validate框架是如何验证的?

在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。

9.说下Struts的设计模式

MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute ()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。

单例模式

Factory(工厂模式):

定义一个基类===》实现基类方法(子类通过不同的方法)===》定义一个工厂类(生成子类实例)

===》开发人员调用基类方法

Proxy(代理模式)

10.spring工作机制及为什么要用?

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 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。}

内置对象代表内容范围

request 触发服务调用的请求request

response 对请求的应答page

session 为请求的客户创建的session对象session

application 从servlet 配置对象获得的servlet 上下文(如在getServletConfig() ,getContext()的调用中)application

out 向输出流写入内容的对象page

pageContext 本JSP 的页面上下文page

page 实现处理本页当前请求的类的实例page

config 本JSP 的ServletConfig page

exception 表示JSP页面运行时产生的异常Page

?豆可可

Java工程师面试题(三大框架)

Java工程师(程序员)面试题 Struts,Spring,Hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理:1.读取并解析配置文件2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作6.提交事务7.关闭Session 8.关闭SesstionFactory 为什么要用:1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2.Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many 4.Struts1流程: 1、客户端浏览器发出HTTP请求。 2、根据web.xml配置,该请求被ActionServlet接收。 3、根据struts-config.xml配置,ActionServlet先将请求中的参数填充到ActionForm中,然后ActionServlet再将请求发送到Action 进行处理。 4、是否验证,需要验证则调用ActionForm 的validate方法,验证失败则跳转到input,成功则继续。 5、Action从ActionForm获得数据,调用javabean 中的业务方法处理数据。 6、Action返回ActionForward对象,跳转到相应JSP 页面或Action。 7、返回HTTP响应到客户端浏览器。 MVC设计模式:modal:“模型”也称业务逻辑,是正真完成任务的代码,相当与JavaBeanview:视图,其实就是显示界面,相当于JSPcontroller:控制器,他控制模型和视图的交互过程,相当于servletstruts1是基于MVC设计模式hibernate是基于ORM对象关系映射 5.struts是什么? struts1是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式struts2是基于webwork技术的框架,是sun和webwork公司联手开发的一个功能非常齐全的框架,struts2和struts1没有任何关系,是一个全新的框架 6.spring是什么? spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注

hibernate面试题

1.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的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2.Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4.说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c) 第三方缓存的实现

各公司Java面试题汇总

各公司Java面试题汇总 ★ 表 A 字段m ,n ,x ,y ,其中m,n 为number 类型,x 为字符类型,y 为日期类型 1 、创建表A 并且m 不能重复,n 初始值为0 ,m 、n 、y 不能为空 2 、修改表A 把n 的初始化值改为1 3 、查询表A 中m 大于500 并且y 为前一天的当前时间以前的所有数据 4 、查询表A 中x 字段共有多少种情况,并输出条数大于200 的情况的个数 5 、查询表A 中x 为空并且时间介于当前时间与前一天当前时间的所有数据 6 、往表A 中插入一条数据,令n 值为3,x 值为"xyz",y 值为200 7 年1 月1 日12 点12 分12 秒 7 、删除表A 中所有时间为整点的数据 8 、表B 与表A 有相同的数据结构,怎么样把表A 中的数据倒入表B 中 9 、数据库的锁,概念,形成原因,你所见过的所有数据库中的锁,锁的解决方案? -------------------------------------------------------------------------------------------------------------------- 1 、把“ ab ”“ ef ”“ ij ”“ cd ”“ gh ”放到List 里,然后对此List 快速排序,并打印结果 2 、表File 中有2 个字段file,vcFile,file 为1 的所相关的vcFile 的信息,用jdbc 连接数据库,并打印查询结果的第三条 4 、corba 对象里有一个void corbaPing() 怎样通过返回的一个空对象判断其状态? 5 、corb 中的COS 三种实现。 6 、WTS 的几种实现形, 文字描述即可,无需写代码。 7 、纯java 技术能否实现jmcp 协议? ----------------------------精品word文档值得下载值得拥有----------------------------------------------

javaWeb面试题(含答案)讲课讲稿

10、Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库。 工作原理: 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的性能好,映射的灵活性比较出色。它支持各种关系数据库,从一对一到多 对多的各种复杂关系。 11、hibernate的核心类是什么??重要方法是什么?? Configuration、SessionFactory Session如下方法 Save、 load、 Update、Delete Query q=CreateQuery(“from Customer where customerName=:customerName”) beginTransaction、close、Transaction、Commit() 12、session.load()和session.get()的区别 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

6文思海辉JAVA面试问题

电话面试 1、hibernate怎么配置的,lazy和list怎么设置 2、JDBC怎么用的,有那几部,具体的方式? 3、文件的读写,步骤和具体实现代码? 4、你用的排序方式有哪些,说出你最擅长的一种排序方式? 5、xml解析方式,schema Xml的解析方式有哪几种,怎么实现解析的? 6、private,protect,default,public权限修饰符是怎么设置权限的? 7、平时你关注java的那些技术? 8、Static 9、Throws throw区别 10、Jsp servlet区别 Jsp本质上就是一个severlet jsp可能更注重前台显示而severlet则是控制 Jsp有自己的内置对象severlet没有 Jsp运行速度没有severlet快 Jsp中有htnl的代码,而severlet只是java代码 11、log4j实现 12、Hibernate or配置 13、Class.forName作用,为什么用? 14、SAX与DOM的区别 视频面试整理 1、一种排序,写出来一共排序了多少次 2、说一下Hibernate 3、如果没有Hibernate你怎么实现这样的功能?并封装成实体类 4、SAX和DOM的区别 5、事物 6、是否用过集合类 7、Set和List的区别 8、线程 9、Insert update create表 10、前台滚动条是如何实现的 11、前台滚动条,比如两个客户端,一个收到90条,一个收到91条,怎样保证两个客户下一个取到的值分别是91条和92条。 12、如果没有ssh是否能写功能 13、IO 15、JS怎样实现5秒一刷新功能 16、SWING APPLET

JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看

-JAVA程序员JAVA工程师面试必看 JAVA面试题解惑系列(二)——到底创建了几个String对象? 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址:https://www.wendangku.net/doc/111436342.html, >>>转载请注明出处!<<< 我们首先来看一段代码: Java代码 1.String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。 我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?我们来看一下被我们调用了的String的构造器: Java代码 1.public String(String original) { 2. //other code ... 3.} 大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种: 1.使用new创建对象。 2.调用Class类的newInstance方法,利用反射机制创建对象。 我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。 这种方式是String特有的,并且它与new的方式存在很大区别。 Java代码 1.String str="abc"; 毫无疑问,这行代码创建了一个String对象。 Java代码 1.String a="abc"; 2.String b="abc";

java高级工程师面试题及答案完整版

j a v a高级工程师面试题 及答案 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]

一:选择题 1. 关于以下程序代码的说明正确的是( D ) 1.class HasStatic{ 2. private static int x=100; 3. public static void main(String args[ ]){ 4. HasStatic hs1=new HasStatic( ); 5. hs1.x++; 6. HasStatic hs2=new HasStatic( ); 7. hs2.x++; 8. hs1=new HasStatic( ); 9. hs1.x++; 10. HasStatic.x- -; 11. (“x=”+x); 12. } 13. } A、 5行不能通过编译,因为引用了私有静态变量 B、 10行不能通过编译,因为x是私有静态变量 C、程序通过编译,输出结果为:x=103 D、程序通过编译,输出结果为:x=102 2. 下列关于for循环和while循环的说法中哪个是正确的( B ) A.while循环能实现的操作,for循环也都能实现 B.while循环判断条件一般是程序结果,for循环判断条件一般是非程序结果C.两种循环任何时候都可替换 D.两种循环结构中都必须有循环体,循环体不能为空 3. 以下选项中循环结构合法的是( C ) A、while (int i<7) { i++; (“i is “+i); } B、 int j=3; while(j) { (“ j is “+j); } C、int j=0; for(int k=0; j + k !=10; j++,k++) { (“ j is “+ j + “k is”+ k); } D、 int j=0; do{ ( “j is “+j++); if (j = = 3) {continue loop;} }while (j<10); 4. 给出下面代码段, 哪行将引起一个编译时错误( D ) 1) public class Test {

SSM面试题

Mybatis常见面试题(转) 1、#{}和${}的区别是什么? 注:这道题是面试官面试我同事的。 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{https://www.wendangku.net/doc/111436342.html,}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于 param.getItem().getName()。 2、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签? 注:这道题是京东面试官面试我时问的。 答:还有很多其他的标签,,加上动态sql的9个标签, trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。 3、最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? 注:这道题也是京东面试官面试我时问的。 答:Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个