1.作用:
*用于实现对数据库操作,功能等价于JDBC,MyBatis
*JDBC-->JdbcTemplate-->MyBatis-->Hibernate
*封装了SQL生成,参数设置,对象数据封装一系列工作
开发利用HibernateAPI实体对象操作,就可以实现对表记录操作
*特点:使用者-->实体对象===Hibernate===表
MyBatis:使用者-->实体对象===SQL+MyBatis===表
*是RM工具,实现对象和数据库映射,
程序员通过对对象操作完成对数据库操作
2.结构
*hibernate.cfg.xml
主配置文件,存储jdbc连接参数,框架参数
*实体类
用于跟表映射的,封装表记录
*映射描述hbm.xml
描述哪个类和哪个表对应,类属性和表字段对应
*开发包API
Session对象:负责对实体对象增删改查
Configuration:加载hibernate.cfg.xml配置文件,关联加载hbm.xml
SessionFactory:用于创建Session对象
Transaction:用于事务控制,默认关闭了自动提交
3.Hibernate对数据库操作方法有几种
1)HQL操作
Hibernate Quert Language Hibernate查询语言
*HQL与SQL相似,都具有sellect...from... where...having...group by...order by...
*HQL和SQL区别:
a.HQL是面向实体对象查询,SQL是面向表结构查询
b.在HQL中使用类名替代表名,使用竖向名替代字段名
c.HQL语句类名和属性名大小写敏感
d.HQL不支持select *,若需查询所有字段可省略select...
e.HQL语句不支持join...on中on子句(基于关联映射)
2)Criteria操作
Hibernate条件查询
*Criteria c=session.createCriteria(数据源);
*c.add(条件)
*c.addOrder(排序)
3)SQLQuery原生SQL操作
执行原始的SQL语句
*SQLQuery query=session.createSQLQuery(sql);
4.Hibernate主键处理
1)Hibernate在进行添加操作save时,可以为对象生成主键值
2)Hibernate提供了以下多种主键生成器
*identity
适合MySQL和SQLServer,
告诉Hibernate利用数据库递增生成主键值(注:建表要设置自动递增)
<generator class="identity"></generator>
*sequence
适合Oracle和DB2,利用序列生成一个主键值,然后执行insert操作,
<generator class="sequence">
<param name="sequence">emp_sql</param>
</generator>
(注:建表后,需要自己创建一个emp_seq序列)
*native
native会根据dialect方言参数选择identity或sequence
*uuid/hilo
可以采用uuid或hilo算法生成主键值
<generator class="uuid/hilo"></generator>
*increment
<generator class="increment"></generator>
*assigned
告诉hibernate忽略主键值生成,由程序员通过setXxx设置主键值
<generator class="assigned"></generator>
4.Hibernate框架特性
1)延迟加载(查询操作)
*在使用Hibernate一些操作时,方法执行了但是并没对数据库查询,
而是在使用对象.getXxx方法时才触发查询数据库操作
*涉及延迟加载操作的方法:
session.load,query.iterator,关联映射属性加载
*使用延迟加载时, 使用不当会遇到下面异常
org.hibernate.LazyInitializationException:
could not initialize proxy -
the owning Session was closed
原因:在session关闭后触发了延迟加载对象的getXxx方法,前面使用了延迟加载方法,但是过早关闭了session
*请求-->Action-->Service-->Dao(延迟加载)-->JSP
-->JSTL或EL显示数据(触发db加载)-->关闭session-->生成HTML流-->响应输出
2)一级缓存(默认开启)
*每个Session都会有一个缓存区,被称为一级缓存,以存储Session查询出的单个对象(Session独享)
*查询-->查询缓存区-->db
优点:第一次查db,其他次查缓存,减少对数据库访问次数
*手动管理缓存方法:session.evict(obj); //清除某一个对象
session.clear(); //清除所有的对象
session.close(); //清除对象并关闭session
session.flush(); //将缓存对象与数据库同步
3)二级缓存(默认关闭)
*每个SessionFactory都会有一个缓存区,被称为二级缓存,
可以存储多个Session查出的单个对象(跨Session共享)
*使用过程:
a.引入ehcache.jar,添加一个src/ehcache.xml
b.在hibernate.cfg.xml中开启二级缓存
c.在User.hbm.xml中添加<cache>元素
*手动管理方法:sessionFactory.evict(User.class); //清除某一个对象
sessionFactory.evict(User.class,主键值); //
4)查询缓存(默认关闭)
*一级和二级缓存只能缓存单个对象,查询缓存可以缓存结果集
*使用过程:
a.首先开启二级缓存
b.在hibernate.cfg.xml中开启查询缓存
c.在执行查询query.list()之前,调用query.setCacheable(true)
5.Hibernate关联映射
1)一对多关联 <one-to-many>
2)多对一关联 <many-to-one>
3)其他 <one-to-one> <many-to-many> <subclass>
*用于实现对数据库操作,功能等价于JDBC,MyBatis
*JDBC-->JdbcTemplate-->MyBatis-->Hibernate
*封装了SQL生成,参数设置,对象数据封装一系列工作
开发利用HibernateAPI实体对象操作,就可以实现对表记录操作
*特点:使用者-->实体对象===Hibernate===表
MyBatis:使用者-->实体对象===SQL+MyBatis===表
*是RM工具,实现对象和数据库映射,
程序员通过对对象操作完成对数据库操作
2.结构
*hibernate.cfg.xml
主配置文件,存储jdbc连接参数,框架参数
*实体类
用于跟表映射的,封装表记录
*映射描述hbm.xml
描述哪个类和哪个表对应,类属性和表字段对应
*开发包API
Session对象:负责对实体对象增删改查
Configuration:加载hibernate.cfg.xml配置文件,关联加载hbm.xml
SessionFactory:用于创建Session对象
Transaction:用于事务控制,默认关闭了自动提交
3.Hibernate对数据库操作方法有几种
1)HQL操作
Hibernate Quert Language Hibernate查询语言
*HQL与SQL相似,都具有sellect...from... where...having...group by...order by...
*HQL和SQL区别:
a.HQL是面向实体对象查询,SQL是面向表结构查询
b.在HQL中使用类名替代表名,使用竖向名替代字段名
c.HQL语句类名和属性名大小写敏感
d.HQL不支持select *,若需查询所有字段可省略select...
e.HQL语句不支持join...on中on子句(基于关联映射)
2)Criteria操作
Hibernate条件查询
*Criteria c=session.createCriteria(数据源);
*c.add(条件)
*c.addOrder(排序)
3)SQLQuery原生SQL操作
执行原始的SQL语句
*SQLQuery query=session.createSQLQuery(sql);
4.Hibernate主键处理
1)Hibernate在进行添加操作save时,可以为对象生成主键值
2)Hibernate提供了以下多种主键生成器
*identity
适合MySQL和SQLServer,
告诉Hibernate利用数据库递增生成主键值(注:建表要设置自动递增)
<generator class="identity"></generator>
*sequence
适合Oracle和DB2,利用序列生成一个主键值,然后执行insert操作,
<generator class="sequence">
<param name="sequence">emp_sql</param>
</generator>
(注:建表后,需要自己创建一个emp_seq序列)
*native
native会根据dialect方言参数选择identity或sequence
*uuid/hilo
可以采用uuid或hilo算法生成主键值
<generator class="uuid/hilo"></generator>
*increment
<generator class="increment"></generator>
*assigned
告诉hibernate忽略主键值生成,由程序员通过setXxx设置主键值
<generator class="assigned"></generator>
4.Hibernate框架特性
1)延迟加载(查询操作)
*在使用Hibernate一些操作时,方法执行了但是并没对数据库查询,
而是在使用对象.getXxx方法时才触发查询数据库操作
*涉及延迟加载操作的方法:
session.load,query.iterator,关联映射属性加载
*使用延迟加载时, 使用不当会遇到下面异常
org.hibernate.LazyInitializationException:
could not initialize proxy -
the owning Session was closed
原因:在session关闭后触发了延迟加载对象的getXxx方法,前面使用了延迟加载方法,但是过早关闭了session
*请求-->Action-->Service-->Dao(延迟加载)-->JSP
-->JSTL或EL显示数据(触发db加载)-->关闭session-->生成HTML流-->响应输出
2)一级缓存(默认开启)
*每个Session都会有一个缓存区,被称为一级缓存,以存储Session查询出的单个对象(Session独享)
*查询-->查询缓存区-->db
优点:第一次查db,其他次查缓存,减少对数据库访问次数
*手动管理缓存方法:session.evict(obj); //清除某一个对象
session.clear(); //清除所有的对象
session.close(); //清除对象并关闭session
session.flush(); //将缓存对象与数据库同步
3)二级缓存(默认关闭)
*每个SessionFactory都会有一个缓存区,被称为二级缓存,
可以存储多个Session查出的单个对象(跨Session共享)
*使用过程:
a.引入ehcache.jar,添加一个src/ehcache.xml
b.在hibernate.cfg.xml中开启二级缓存
c.在User.hbm.xml中添加<cache>元素
*手动管理方法:sessionFactory.evict(User.class); //清除某一个对象
sessionFactory.evict(User.class,主键值); //
4)查询缓存(默认关闭)
*一级和二级缓存只能缓存单个对象,查询缓存可以缓存结果集
*使用过程:
a.首先开启二级缓存
b.在hibernate.cfg.xml中开启查询缓存
c.在执行查询query.list()之前,调用query.setCacheable(true)
5.Hibernate关联映射
1)一对多关联 <one-to-many>
2)多对一关联 <many-to-one>
3)其他 <one-to-one> <many-to-many> <subclass>