您的位置:首页 > 其它

hibernate 总纲

2014-03-31 15:26 134 查看
什么是Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate框架的核心API和运行流程

1)Configuration

负责读取Hibernate.cfg.xml和hbm.xml映射描述文件,创建SessionFactory实例.

2)SessionFactory

负责创建Session对象,管理了预编译的SQL语句

3)Session

负责执行增加,删除,修改,查询操作.Session是对Connection的封装.

4)Query

负责执行HQL查询语句.

5)Transaction

负责事务控制,Hibernate必须使用代码控制事务,否则不会对数据库造成修改

5.Hibernate应用示例(对dangdang.d_user表操作)

1)引入Hibernate开发包+驱动开发包

hibernate3.jar

commons-collections-2.1.1.jar

commons-logging-1.0.4.jar

dom4j-1.6.1.jar

mysql-connector-java-5.1.6-bin.jar

cglib-2.1.3.jar

asm.jar

2)定义hibernate.cfg.xml主配置文件

<hibernate-configuration>

<session-factory>

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="connection.url">jdbc:mysql://127.0.0.1:3306/xgf</property>

<property name="connection.username">root</property>

<property name="connection.password">xgfdiao</property>

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="hbm2ddl.auto">update</property>

<property name="show_sql">true</property>

<property name="format_sql">true</property>

<mapping resource="mapping/Header.hbm.xml" />

</session-factory>

</hibernate-configuration>

3)定义持久类文件

<hibernate-mapping package="entity">

<class name="Header" table="header">

<id name="id" column="id" type="integer"><generator class="assigned"></generator></id>

<property name="hname" type="string"><column name="hname"></column></property>

<property name="address" type="string"><column name="address"></column></property>

<!-- 一对一映射 Product-->

<one-to-one name="sc" property-ref="he" cascade="all"><!-- 添加cascade="all"后,将同步两个表的数据操作 -->

</one-to-one>

</class>

</hibernate-mapping>

4)定义hbm.xml映射描述文件,在hibernate.cfg.xml,添加<mapping>元素.

<mapping resource="mapping/Header.hbm.xml" />

5)使用核心API进行操作

<span style="font-size:14px;">	private List find(String sql) {
List list = null;
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
//取得session
Session session = null;
try {
session = sessionFactory.openSession();
//开启事务
session.beginTransaction();
list = session.createQuery(sql).list();
//提交事务
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally {
if (session != null) {
if (session.isOpen()) {
//关闭session
session.close();
}
}
}

return list;
}</span>


6.Hibernate主键生成方式

1)内置的快捷名

a.identity : 如果数据库支持自动增长,设计表时指定该功能,适用于MySQL,SQL Server

b.sequence : 如果数据支持sequence,主键由sequence生成,适用于Oracle

c.native : 根据数据库类型,自动选择identity,sequence,hilo

d.increment : 发送select max(id) from table语句获取主键值

e.assinged : 忽略,需要在程序中指定主键值.

f.uuid : 根据UUID算法生成一个字符串类型的主键值,适用于主键类型为varchar类型

g.hilo : 采用高低位算法生成一个数值类型的主键值

h.foreign : 使用另一个相关联对象的属性值充当主键值,适用于一对一关系的数据表

2)自定义主键生成方式

a.编写主键生成器类,要实现IdentifierGenerator接口,在约定的generator方法中编写生成主键的逻辑

b.使用格式为<generator class="包名.类名">

7. Hibernate类型

在映射描述文件中,<property type="类型">,type属性可以指定Java类型,也可以指定Hibernate类型

*1)基本类型

integer,long,short,byte,double,float,character,boolean,yes_no,true_false

*2)字符串类型

string

*3)日期和时间

date,time,timestamp

4)大的数值类型(了解下BigDecaimal,BigInteger)

big_decimal,big_integer

5)java.sql.Clob,java.sql.Blob

clob,blob

Hibernate也允许自定义类型.

8.Hibernate中对象的状态

1)临时状态

刚new出来的对象 ,session.delete()方法后

2)持久状态

调用session的load(),get(),save(),update()方法后,该对象受Session管理,具有持久性的特征,Hibernate可以将持久对象的信息保存到数据库中.(持久性)

3)脱管状态

调用session的close(),clear()方法后,注意:临时和脱管状态的对象,可以随时被垃圾回收,不能与数据库同步.

9.高级映射

1)联合主键映射

2)组件映射

3)一对一映射

4)一对多映射

5)多对多映射

10.Hibernate高级特性以及性能优化

1)延迟加载

当程序执行getter方法获取时,才发送sql语句加载数据,延迟加载给程序带来好处,但是要避免session过早关闭问题

a. load()和get()两个方法区别

load()采用延迟加载机制,返回的是一个proxy代理对象

get()没有采用延迟加载,返回的是一个对象实例

b.Hibernate.initialize(user)

可以强制user对象实例化

c.hbm映射描述文件中,<class>,<property>,<set>等元素

都可以使用lazy属性,默认lazy="true",启用延迟加载,lazy="false"禁用延迟加载.

2)缓存机制

Hibernate每次查询先去缓存中查找,没有才去数据库查询.

a.一级缓存

Session级别的缓存,缓存load,get出来的单个对象.默认开启,使用同一个Session对象多次查询同一个User对象,只会发送一次SQL取数据库获取

b.二级缓存

SessionFactory级别的缓存.默认情况是关闭.

(1)首先在hibernate.cfg.xml中指定EhCache缓存策略

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

(2)在src下添加ehcache.xml配置文件

(3)在User.hbm.xml中添加<cache/>定义<cache usage="read-only"/>如果涉及更新,使用read-write

c.查询缓存

缓存HQL查询结果集,对相同的HQL查询语句,只去数据库查询一次.

(1)首先在hibernate.cfg.xml中启用查询缓存

<property name="hibernate.cache.use_query_cache">true</property>

(2)在query.list()执行之前,调用query.setCacheable(true);

d.缓存的清除

session.evict(user);//清除缓存中的指定对象

session.clear();//清除缓存的所有内容

sessionfactory.evict();//清除二级缓存中的指定对象

3)cascade级联操作

一对一:可以使用级联删除

4)query.list()和query.iterator()

(1)list将所有记录获取,放入list集合中

(2)iterator先将记录的主键获取,然后需要哪个记录,再根据主键条件去数据库查询.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: