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文件中加入
在映射中也要显示的调用,
二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。
在程序中必须手动启用查询缓存: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工程师(程序员)面试题 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(控制反转,也称依赖注 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面试题汇总 ★ 表 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文档值得下载值得拥有---------------------------------------------- 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从数据库读取记录,并返回与之对应的实体对象。其区别在于: 电话面试 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程序员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"; 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 { 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标签之外,还有哪些标签? 注:这道题是京东面试官面试我时问的。 答:还有很多其他的标签, Hibernate (JAVA)面试题 一、简述Hibernate作用? O/R Mapping(对象关系映射) 将工作量降低95% 二、简述核心配置文件及作用? hibernate.cfg.xml:数据库的连接、批量处理、加载二级缓存驱动、显示sql *.hbm.xml:将一个表与类相映射、二级缓存的方式 三、简述核心接口、类组成及作用? 类: Configuration:读取hibernate.cfg.xml及*..hbm.xml文件 接口: SessionFactory:产生具体的session Session:做具体的操作 save update saveOrUpdate:有主键修改,没主键增加 delete load Transaction :事务处理 Transaction trans=session.beginTransaction(); https://www.wendangku.net/doc/111436342.html,mit(); trans.rollback(); Query:执行查询 //hql,类及属性是对象 Query query=session.createQuery("from Customer where customerid=:aa") query.setString("aa","aa") List list=query.list(); Validator:在做之前进行拦截,在处理之前进行校验 Lifecycle:拦截器,可以增加、修改、查询等之前触发,但其让数据类与hibernate 的藕合度增加,一般不用。 public class Users implements Validator,Lifecycle { } interceptor:拦截器,其比Lifecycle更加的优秀,不用每个数据类去实现一些接口,而是在产生session时将其注入到session中。其可以增加、修改、查询等之前触发,但其中的session不可以重用,可以用上一个session的connection,不用管事务,因为事务已被前一个session实现。 四、简述关联组成及作用? one-to-many: Hibernate外键关联,做多表链接查询出的字段如果没有实体bean与之相对应,该如何解决? Hibernate的sessionfactory和session的区别是什么?如何处理session线程不安全问题?Hibernate如何实现动态查询?DetachedCriteria与Criteria的区别是什么? Jdk1.6的新技术Annotation有什么特点和作用?大量应用在哪些领域,具体是如何做的举例 你对搜索引擎lucene的原理能讲述一下吗?他有那些常用的框架? Servlet的工作原理简单叙述,你知道监听是如何配置,具体的类中有哪些方法,具体可以干些什么?还有过滤也谈谈,平时开发常用来做什么 谈谈jsp include与include指令的区别,forward与sendredirect的区别? 既然你精通spring,请谈谈spring具体是如何管理实体bean,还有aop是什么?通常用来干些? 说说Struts1和Struts2的区别和对比,有缺点是什么? 谈谈你对Ajax的主要核心技术亮点是什么?能干哪些? 你常用的数据库连接池有哪些?他们各自的优缺点 你了解哪些java设计模式,谈谈你的思想和一些理解,至少五种 既然你精通Oracle数据库,请叙述下三范式以及数据库的存储过程和函数,具体是什么,能干些什么? 听说你还了解ejb,那你给我说说ejb的主要组建,和一些特性,优点。 你的简历中还提到了webservice,你能跟我说说什么是webservice,他常用的框架有哪些?知道应用服务器和web服务器的区别吗?假如有个项目页面有大量多的静态内容只有少数动态的更新信息,并且需要有大量的图片处理,这种服务器你如何搭建? 既然你还知道工作流,那你一定知道jbpm的的流程定义语言(jpdl),简单叙述下jBPM开发工作流的一般流程。 你精通使用tomcat,请你为我简单叙述一下tomcat如何基于JNDI技术配置数据库连接池?如果我想在一个测试项目中嵌入一个tomcat,不希望每次调试都重启加载这个项目,具体如何配置? 说实话,题都是些边界问题,挺变态的,试试看~ 1.Hibernate外键关联,做多表链接查询出的字段如果没有实体bean与之相对应,该如何解决? 没有遇到过这种方式,不过最保险的方法就是使用回调函数JDBC才处理,这样是绝对不会出错的,安全第一; 2.Hibernate的sessionfactory和session的区别是什么?如何处理session线程不安全问题? sessionfactory是一个数据源对应着一个sessionfactory,也就说他是属于二级缓存,如果是集群环境,他可以动态的配置使用这个数据源或者 不使用这个数据源,session是等于一次回话,也就是说是一级缓存,并且是由sessionfactory 创建的,再有sessionfactory是线程安全的,相反的 session不安全的; 一: 选择题 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. System、out、println(“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++; System、out、println(“i is “+i); } B、int j=3; while(j) { System、out、println(“ j is “+j); } C、int j=0; for(int k=0; j + k !=10; j++,k++) { System、out、println(“ j is “+ j + “k is”+ k); } D、int j=0; do{ System、out、println( “j is “+j++); if (j = = 3) {continue loop;} }while (j<10); 4、给出下面代码段, 哪行将引起一个编译时错误?( D ) 1) public class Test { 2) int n = 0; 3) int m = 0; 4) public Test(int a) { m=a; } 5) public static void main(String arg[]) { 6) Test t1,t2; 7) int j,k; 8) j=3; k=5; 9) t1=new Test(); (问答题+选择题(在55页)) 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没有任何关系,是一个全新的框架 Ibatis: ibatis和hibernate的区别 ibatis是在结果集与实体类之间进行映射 hibernate是在数据库与实体类之间进行映射 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate 可以在应用EJB的J2EE架构中取代CMP【CMP(Container-Managed Persistence)表示由EJB 容器来管理实体EJB 的持久化,EJB 容器封装了对象-关系的映射及数据访问细节】,完成数据持久化的重任。 一、基本功能 Hibernate作为数据持久化的中间件,足以让数据库在业务逻辑层开发中去冬眠。它通过可扩展标记语言(XML)实现了类和数据表之间的映射,使程序员在业务逻辑的开发中面向数据库而改为面向对象开发。使整个项目开发分工更加明确,提高了程序开发的效率。 configuration对象: Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要 获取一些底层实现的基本信息,其中几个关键属性包括: 1.数据库URL 2.数据库用户 3.数据库用户密码 4.数据库JDBC驱动类 5.数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。以上信息一般情况下由hibernate.cfg.xml或者hibernate.properties文件来配置,实现与不同数据库的连接。 Session对象: Session是持久层操作的基础,相当于JDBC中的Connection: 实例通过SessionFactory实例构建: Configuration config = new Configuration().configure(); SessionFactorysessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); 之后我们就可以调用Session所提供的save、find、flush等方法完成持久层操作。因此Session对象也封装了所有对数据库的操作来实现Hibernate对数据库的操纵功能,如: Save()方法实现增加和保存; Delete()方法实现数据的删除; Update()方法实现数据更新和修改; Find()方法实现数据的检索;…… Hibernate会根据不同的操作自动生成相应的SQL语句,从而实现了程序员对PO 对象的操作转化为对数据库关系表的操作。 二、使用步骤 DBA数据库管理员JAVA程序员架构师必看 一、技术问题部分(数据库部分) 1、表空间的管理方式有哪几种? 数据字典管理方式 本地文件管理方式 2、谈谈你对索引的理解? 索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据块的I/O次数,因此可以显著提高性能。 3、说说索引的组成? 索引列、rowid 4、分区表用过么?谈谈分区表的应用? 分区表在对表的DML的并行处理上有极大得优势,而且可以一部分设为只读,用在销售记录,医院处方等地方!! 5、你对分区表的理解?怎样截断分区表一个分区的记录? 一个分区表有一个或多个分区,每个分区通过使用范围分区、散列分区、或组合分区分区的行 分区表中的每一个分区为一个段,可各自位于不同的表空间中 对于同时能够使用几个进程进行查询或操作的大型表分区非常有用 alter table table_name truncate partition partition_name; 6、物理文件有哪几种?控制文件包含了什么信息? 1)数据文件2)控制文件3)日志文件 包含维护和验证有选举权据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个有选举权据库至少需要一个控制文件 7、表空间用完了如何增加? 三种种扩展方式: 1 增加数据文件alter tablespace name add datafile …路径? size 4M; 2 扩展数据文件大小alter database datafile …路径? resize 4M; 3 把数据文件设为自动增长 alter database datafile …路径? autoextend on next 1M max size 20M; 8、SGA包含几部分? Shared pool(共享池),DataBase Buffer Cache(数据缓冲区) Redo Log Buffer(重做日志缓冲区), Large Pool,大池,JAVA池。 9、DECODE函数的用法? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。还可以转化表结构! 10、DELETE和TRUNCATE的区别? 1、jsp和servlet的区别、共同点、各自应用的范围?? JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层. 2、cookie和session的作用、区别、应用范围,session的工作原理??? Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有限。 Session:保存在服务端,每一个session在服务端有一个sessionID作一个标识。存储的数据量大,安全性高。占用服务端的内存资源。 3、jstl是什么?优点有哪些?? JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。优点有: 1、在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。 2、简化了JSP和WEB应用程序的开发。 3、以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet 代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。 4、允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE 开发工具出现。 4、j2ee的优越性主要表现在哪些方面?MVC模式 a、J2EE基于JAVA技术,与平台无关 b、J2EE拥有开放标准,许多大型公司实现了对该规范支持的应用服务器。如 31.迭代器 Iterator 是什么? Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。 32.Iterator 怎么使用?有什么特点? Iterator 使用代码如下: List list = new ArrayList<>(); Iterator it = list. iterator(); while(it. hasNext()){ String obj = it. next(); System. out. println(obj); } Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException 异常。 33.Iterator 和 ListIterator 有什么区别? Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。 Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。 ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。 34.怎么确保一个集合不能被修改? 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。 示例代码如下: List list = new ArrayList<>(); list. add(“x”); Collection clist = Collections. unmodifiableCollection(list); clist. add(“y”); // 运行时此行报错 System. out. println(list. size()); 多线程 35. 并行和并发有什么区别? 并行:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。并发:多个处理器或多核处理器同时处理多个任务。 如下图: 并发和并行 Hibernate工作原理及为什么要用? 原理: 1. 读取并解析配置文件 2. 读取并解析映射信息,创建SessionFactory 3. 打开Sesssion 4. 创建事务Transation 5. 持久化操作 6. 提交事务 7. 关闭Session 8. 关闭SesstionFactory 为什么要用: * 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 * Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 * hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 * hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 Hibernate是如何延迟加载? * Hibernate2延迟加载实现:a)实体对象b)集合(Collection) * Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 说下Hibernate的缓存机制 * 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 * 二级缓存: a)应用及缓存 b)分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c) 第三方缓存的实现 Hibernate的查询方式 Sql、Criteria,object comptosition Hql: * 属性查询 * 参数查询、命名参数查询 * 关联查询 * 分页查询 * 统计函数 Hibernate 考试题 一.填空题: 1. 对象关系映射(ORM)的基本原则是:类型(class)映射(),属性(property)映射(),关联关系(association)映射(),类型的实例或对象(instance | object)映射()。 2. Hibernate应用通常由四个部分组成,它们是使用Hibernate API 的程序和(、、)。 3. Hibernate应用缺省的XML格式的配置文件名是(), 放置在()下;该配置文件的根元素是(),根元素的子元素是();配置数据库方言的属性名是();配置数据库连接的四种属性名是(、、、);配置映射资源的元素是(),如果映射用XML文件表示,用属性()表示,如果映射用标注(annotation)表示,用属性()表示。 4. Hibernate XML映射文件的根元素是();此根元 素下主要的子元素是();映射实体类中表示主键的属性的元素是();映射实体类中普通属性的元素是();映射一对一关联关系的元素是();映射多对一关联关系的元素是();表示多对多关系用集合元素,这些集合元素是();描述外键用元素(); 如果一个类型不是实体,但它是某个实体的组成部分,我们用元素()表示;在描述继承关系时,如果用一张表对应整个类层次结构子类型用元素()描述,如果每个子类型对应各自的表子类型用()描述,如果只有真正的可实例化的子类型才对应表则子类型可用元素()或元素()描述;代表双向关联关系时表示是否维护表中外键关系的属性名是();代表级联操作的属性名是();使用乐观锁时我们通常会在实体类型中增加一整型或日期型的属性,在影射文件中用元素(或)描述。 5. 在Hibernate XML影射文件中描述主键生成机制用元素(),其属性描述了主键的生成策略,至少写出三种策略名(、、)。 6. 在Hibernate XML影射文件中级连操作的属性值至少写出三Java工程师面试题(三大框架)
hibernate面试题
各公司Java面试题汇总
javaWeb面试题(含答案)讲课讲稿
6文思海辉JAVA面试问题
JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看
java高级工程师面试题及答案完整版
SSM面试题
Hibernate (JAVA)面试题
java-变态面试题
java高级工程师-面试题及答案
SSH框架面试题(自己+别人的试题)
Ibatis面试题
华为面试题(附答案)Oracle-DBA、JAVA架构师必看
JAVAWEB面试题(含答案)
java常见面试题二(基础)30道题
JAVA_ssh面试题及答案
Hibernate 考试题