hibernate 总纲

什么是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先将记录的主键获取,然后需要哪个记录,再根据主键条件去数据库查询.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值