Hibernate
1、是什么?
①. Hibernate是一个ORM(Obeject relation mapping)框架,它对JDBC进行了轻量级的封装,位于项目的持久层。
②. Hibernate使用ORM技术将对关系数据库中的表的操作转化成对JAVA对象的操作。
2、为什么?
①. 使程序员专心业务层,而不必考虑用了什么数据库,让数据库管理员负责数据库的管理
②. 分层更清晰,耦合度减小
③. 通用性强,试程序更换数据库变的更容易
④. 对象化,程序员写业务层的时候,操作的都是Java对象,这样更直观、方便
⑤. 性能保证,hibernate可以针对不同的数据库,使用最优的sql语句
⑥. 鲁棒性,hibernate使程序更健壮。
3、怎么用?
Ø 学会hibernate API
Ø Hibernate核心配置文件hibernate.cfg.xml
Ø 对象关系映射文件XXX.hbm.xml
i. 写POJO(Plain ordinary java object简单java对象),相对于EJB来说的。
①. 有一无参的构造函数
②. 有一个主键和若干其它属性
③. 每个属性都有get和set方法
④. 属性一般都是private
ii. 对应每个POJO编写相对应对象关系映射文件。文件名:POJO名.hbm.xml
iii. 编写hibernate.cfg.xml文件,该文件配置了连接数据库的一些参数。
iv. 使用hibernate
n SessionFactory接口的方法openSession()和getCurrentSession()有什么区别?
①. openSession()每次获取新的Session实例
②. getCurrentSession()是获得当前线程下绑定的Session,不会新建Session实例
③. 通过getCurrentSession()获得的session,在事务提交或回滚时会自动关闭session。
④. 使用getCurrentSession()获得的session,要在hibernate.cfg.xml中加一个配置项,将session与线程绑定:<property name="current_session_context_class">thread</property>
⑤. 使用getCurrentSession()获得的session,必须启用事务。
n Session接口的方法有哪些?
①. sava():保存一个对象,即添加一条记录
②. delete():删除一个对象
③. get()、load():查询一个对象
u 它们有什么区别?
1) 如果查询不到,get()返回null,而load()返回异常ObjectNotFoundException
2) get()会立即向数据库发出SQL查询,而load方法会延迟查询(在用的时候才向数据库发出SQL查询),通过修改配置文件XXX.hbm.xml可以取消延迟加载(设置class的属性lazy=’false’)。
3) 如果确定数据库中有某对象,那用load(),相反用get()
④. update():修改一个对象
⑤. createQuery(“hql语句”):创建一个Query对象
⑥. createCriteria(类.class):创建一个Criteria对象
n Query接口的方法有哪些?
①. List():以list的形式返回查询结果
n Criteria接口的方法有哪些?
n Hibernate3和hibernate4有什么区别?
①. Hibernate3:
②. Hibernate4:
4、开发hibernate项目的步骤(国内一般是这么做的)
①. 建立数据库
②. 引入hibernate的jar包
③. 编写hibernate.cfg.xml文件
④. 编写pojo类
⑤. 编写对象关系映射文件:[pojo名].hbm.xml
⑥. 测试
5、使用Myeclipse自动生成domain类和mapping文件
6、HQL(Hibernate query language)
一种面向对象的查询语言,操作的直接目标是对象,不是表,支持多态。
①. 查询
1) 查询所有字段
fromObject
2) 查询部分字段
selectname,sex from Object
②. 详细
a) 若查询单一的记录,则用uniqueResult()函数,若查询结果>=2,则用list()函数
b) distinct去除重复记录
c) 如果有筛选条件,写在where字句里
d) 也可以使用in、not in关键字
e) 支持聚集函数avg(),sum(),min(),max(),count(*),count(….)
f) 支持group by…having分组查询
g) 支持order by排序
附件:
示例代码L1
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="com.cl.domain">
<!--name指定POJO,table指定表-->
<classname="Employee" table="employee">
<idname="id" type="java.lang.Integer">
<generatorclass="native"></generator>
</id>
<propertyname="name" type="java.lang.String">
<columnname="name" length="64"></column>
</property>
</class>
</hibernate-mapping>
示例代码L2
<!DOCTYPEhibernate-configuration PUBLIC
"-//Hibernate/Hibernate ConfigurationDTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<propertyname="connection.driver_class"> </property>
<propertyname="connection.url"> </property>
<property name="connection.useUnicode"></property>
<propertyname="connection.characterEncoding"> </property>
<propertyname="connection.username"> </property>
<propertyname="connection.password"> </property>
<property name="dialect"></property>
<property name="show_sql"></property>
<propertyname="hbm2ddl.auto"> </property>
<!--加载对象关系映射文件-->
<mapping resource="pojo1.hbm.xml"/>
<mapping resource="pojo2.hbm.xml"/>
</session-factory>
</hibernate-configuration>
示例代码L3
publicclass HibernateUtil {
private static final SessionFactorysessionFactory;
static {
try {
sessionFactory = newConfiguration().configure().
buildSessionFactory();
} catch (Throwable ex) {
System.err.println("InitialSessionFactory creation failed." + ex);
throw newExceptionInInitializerError(ex);
}
}
public static SessionFactorygetSessionFactory() {
return sessionFactory;
}
}
示例代码L4
publicclass HibernateUtil {
private static final SessionFactorysessionFactory = buildSessionFactory();
private static SessionFactorybuildSessionFactory() {
try {
Configurationcfg = new Configuration().configure();
StandardServiceRegistryBuildersrb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
StandardServiceRegistrysr = srb.build();
returncfg.buildSessionFactory(sr);
}
catch (Throwable ex) {
System.err.println("InitialSessionFactory creation failed." + ex);
throw newExceptionInInitializerError(ex);
}
}
public static SessionFactorygetSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
returngetSessionFactory().openSession();
}
}