什么是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进行操作
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先将记录的主键获取,然后需要哪个记录,再根据主键条件去数据库查询.
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91758 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!