jdbc、hibernate、ibatis的区别?
Hibernate, Java/J2EE
jdbc:手动
手动写sql
delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象。
select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
ibatis的特点:半自动化
sql要手动写
delete、insert、update:直接传入一个对象
select:直接返回一个对象
hibernate:全自动
不写sql,自动封装
delete、insert、update:直接传入一个对象
select:直接返回一个对象
Hibernate如何实现数据表映射的继承关系?
Hibernate, Java/J2EE
1、两个表,子类重复父类的属性。
2、一个表,子类父类共用一个表
<class name=”Users” table=”users”discriminator-value=”Users”>
<discriminator column=”DISCRIMINATOR_USERTYPE”type=”string”/>
<subclass name=”admin” discriminator-value=”admin”>
<propertyname=”adminRemark” column=”admin_remark” type=”string” />
</subclass>
</class>
3、两个表,子类引用父类的主键,享用公共的字段或属性。
<class name=”Users”table=”users”>
<id name=”userid” column=”USERID”type=”string”>
<generator class=”assigned”/>
</id>
<property name=”pwd” column=”pwd”type=”string” />
<joined-subclass name=”Guest” table=”guest”>
<key column=”USERID”/>
<propertyname=”guestRemark” column=”guest_remark” type=”string” />
</joined-subclass>
</class>
批量删除
Query query=session.createQuery(”update”或”delete”);
query.executeUpdate();
Hibernate中Query对象的使用
Hibernate, Java/J2EE
1 个或多个属性查询:
Query query=session.createQuery(”select customername,customerid fromCustomer”)
List l=query.list();
For(int i=0;i<l.size();i++)
{
Obejct[] object=(Object[])l.get(i);
Object[0] object[1]
}
}
分组: “select count(*),productname from Product group byproductname order by productname”
取值与属性一样
配置的查询,在*.hbm.xml中
<query name=”sql”>
<![CDATA[
from Product where productid=:productid
]]>
</query>
Query query=session.getNamedQuery(sql);
联接1
”from Customer as customer join fetch customer.buySet”:将多的放到buySet属性中,得出的结是Customer有一个,Buy有多个
联接2
“from Customer as customer join customer.buySet”:得出的对象,customer与buy是1对1
子查询:
”from Customer as customer where (select count(*) fromcustomer.buySet)>1″
Hibernate中Criteria和DetachedCriteria的作用是什么?
Hibernate, Java/J2EE
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中数据表映射关系主要有什么类型?
Hibernate, Java/J2EE
one-to-many
inverse:主控方,外键的关系有谁控制
inverse=false 是主控方,外键是由它控制的
inverse=true 是被控方,外键与它没关系
要想实现主控方的控制必须将被控方作为主控方的属性
cascade:级联
主表增从表增
主表修从表修
主表删从表删
lazy:延迟
lazy=false:一下将所有的内容取出,不延时(常用)
lazy=true:取出部分内容,其余内容动态去取
通过get可以取出对方的所有内容
hibernate的核心类是什么,它们的相互关系是什么?重要的方法是什么?
Hibernate, Java/J2EE
Configuration
SessionFactory
Session如下方法
Save
load
Update
Delete
Query q=CreateQuery(“from Customer wherecustomerName=:customerName”)
beginTransaction
close
Transaction
Commit()
在myeclipse加入hibernate环境的全过程是什么?
Hibernate, Java/J2EE
1.Db-browers加入配置连接
2.新建工程
3.加入hibernate环境,指定*.hbm.xml及HibernateSessionFactory文件所在的位置
面试中常出现的两个Hibernate面试题及解答
Hibernate, Java/J2EE
1.在数据库中条件查询速度很慢的时候,如何优化?
1.建索引
2.减少表之间的关联
3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
自己去看http://www.mianwww.com/html/2009/02/2721.html
一些Spring和Hibernate的面试题(附答案)
Hibernate, Java/J2EE, Spring
1、 简述你对IoC(Inversionof Control)的理解,描述一下Spring中实现DI(Dependency Injection)的几种方式。
2、 Spring的Bean有多种作用域,包括:
singleton、prototype、request、session、global session、application、自定义
3、 简单描述Spring framework与Struts的不同之处,整合Spring与Struts有哪些方法,哪种最好,为什么?
4、 Hibernate中的update()和saveOrUpdate()的区别
5、 Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。
答案:
1、好莱坞原则€€€€不要打电话找我,我会打给你的。IoC将创建的职责从应用程序代码搬到了框架中。Spring对Setter注入和构造方法注入提供支持。(详见http://martinfowler.com/articles/injection.html,以及http://www.redsaga.com/spring_ref/2.0/html/beans.html#beans-factory- collaborators)
2、 除application(详见Spring framework 2.0 Reference的3.4节bean的作用域)
3、 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、 saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:
如果对象在该session中已经被持久化,不进行操作;
对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;
如果session中的另一个对象有相同的标识符抛出一个异常;
以上皆不符合则调用update()更新之。
5、 在context中定义DataSource,创建SessionFactoy,设置参数;DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。
在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(详见Springframework 2.0 Reference的12.2节Hibernate)
声明式事务需声明事务管理器,在context中设置指定属性,用确定和。
请你谈谈SSH整合
Hibernate, Java/J2EE, Spring, Struts
SSH:
Struts(表示层)+Spring(业务层)+Hibernate(持久层)
Struts:
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
Hibernate:
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
Spring:
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
Hibernate面试题:什么是SessionFactory?它是线程安全的么?
Hibernate, Java/J2EE
SessionFactory is Hibernates concept of a single datastore and isthreadsafe so that many threads can access it concurrently and request forsessions and immutable cache of compiled mappings for a single database. ASessionFactory is usually only built once at startup. SessionFactory should bewrapped in some kind of singleton so that it can be easily accessed in anapplication code.
SessionFactory sessionFactory = newConfiguration().configure().buildSessionfactory();
优化hibernate性能的几点建议
Hibernate, Java/J2EE
1、针对oracle数据库而言,Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100。Oracle数据库的JDBC驱动默认的FetchSize=15,设置Fetch Size设置为:30、50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存。
即在hibernate配制文件中进行配制:
1 <property name=”hibernateProperties”>
2 <props>
3 <prop key=”hibernate.dialect”>org.hibernate.dialect.Oracle9Dialect</prop>
4 <prop key=”hibernate.show_sql”>false</prop>
5 <!– Create/update the database tables automaticallywhen the JVM starts up
6 <prop key=”hibernate.hbm2ddl.auto”>update</prop> –>
7 <!– Turn batching off for better error messages underPostgreSQL
8 <prop key=”hibernate.jdbc.batch_size”>100</prop> –>
9 <prop key=”hibernate.jdbc.batch_size”>50</prop>
10 </props>
11 </property>Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。
2、如果是超大的系统,建议生成htm文件。加快页面提升速度。
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条以内。越少越好。
JDBC,Hibernate 分页怎样实现?
Hibernate, Java/J2EE
答:方法分别为:
1) Hibernate 的分页:
Query query = session.createQuery(”from Student”);
query.setFirstResult(firstResult);//设置每页开始的记录号
query.setMaxResults(resultNumber);//设置每页显示的记录数
Collection students = query.list();
2) JDBC 的分页:根据不同的数据库采用不同的sql 分页语句
例如: Oracle 中的sql 语句为: “SELECT * FROM (SELECT a.*, rownum r FROM
TB_STUDENT) WHERE r between 2 and 10″ 查询从记录号2 到记录号10 之间的
所有记录
关于hibernate的几个面试题
Hibernate, Java/J2EE
1)在hibernate 中,在配置文件呈标题一对多,多对多的标签是什么;
2)Hibernate 的二级缓存是什么;
3)Hibernate 是如何处理事务的;
答:1)一对多的标签为<one-to-many> ;多对多的标签为<many-to-many>;
2)sessionFactory 的缓存为hibernate 的二级缓存;
3)Hibernate 的事务实际上是底层的JDBCTransaction 的封装或者是JTA
Transaction 的封装;默认情况下使用JDBCTransaction。
State
No
State
Name
GD 广东
LN 辽宁
SD 山东
NMG 内蒙
Hibernate 有哪5 个核心接口
Hibernate, Java/J2EE
Configuration 接口:配置Hibernate,根据其启动hibernate,创建
SessionFactory 对象;
SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建
session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应
用的多个线程共享,是重量级、二级缓存;
Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,
避免多个线程共享同一个session,是轻量级、一级缓存;
Transaction 接口:管理事务;
Query 和Criteria 接口:执行数据库的查询。
如何优化Hibernate?
Hibernate, Java/J2EE
1. 使用双向一对多关联,不使用单向一对多
2. 灵活使用单向一对多关联
3. 不用一对一,用多对一取代
4. 配置对象缓存,不使用集合缓存
5. 一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰
说下Hibernate的缓存机制
Hibernate, Java/J2EE
1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2. 二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
Hibernate, Java/J2EE
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
Hibernate是如何延迟加载?
Hibernate, Java/J2EE
1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
hibernate数据查询的几种方式
Hibernate, Java/J2EE
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)
…………………………………….(具体的讲解详见查考书)
小结:
hql功能很强大,适合各种情况,但是动态条件查询构造起来很不方便.
criteria 最适合动态查询,但不太适合统计查询,qbe还不够强大.只适合简单的查询.
nativesql可以实现特定的数据库的sql.但是可移植性并不好.
针对web应用来说,大部分常规查询都是动态条件查询,所以首先criteria,并且h 3提供的detachedcriteria,可以在web层构造好detachedcriteria再进入session执行查询.但是涉及到统计查询和非常复杂的关联查询.criteria就无能为力了.这种情况下选择使用hql.最后如果涉及到使用某些数据库的特性的时候,就只有选择 nativesql了.
hql常用来进行实体检索.这个时候要注意返回的list中的元素是实体还是实体数组.如果hql进行实体属性查询,当查询两个以上的属性时,list中的元素就是属性数组了.
qbc最大的用途在与动态查询.它不会忽略配置文件中的预先抓取策略.
使用本地sql检索必须检索对象的所有属性.
Hibernate中:不看数据库,不看XML文件,不看查询语句,怎么样能知道表结构?
Hibernate, Java/J2EE
看表结构对应的类文件,比如UserInfo表对应的UserInfo.java文件