一.Hibernate概述
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
二.Hibernate开发初体验
一.Hibernate
hibernate是一款orm(object relationg mapping 对象关系映射)框架
hibernate操作数据库的时候,可以以面向对象的方式来完成.不需要书写SQL语句
二.hibernate框架的搭建
1.导包:required+数据库驱动包
2.创建数据库表和对应的实体类
3.导入约束:hibernate-mapping-3.0.dtd(orm元数据),hibernate-configuration-3.0.dtd(主配置)
4.书写orm元数据(对象与表的映射配置文件)
5.书写主配置文件
6.书写代码测试
三.配置文件详解
1.orm元数据配置:根元素,class元素,id元素,property元素
2.hibernate主配置:必选属性配置(5个),可选属性配置(3个),元数据引入配置
四.hibernate API
1.Configuration:创建Configuration对象,加载主配置,加载orm元数据,创建SessionFactory对象
2.SessionFactory:创建Session对象,创建线程绑定的Session对象
3.Session:数据库的增删改查,获得Transaction事务对象
4.Transaction:开启事务,提交事务,回滚事务
五.hibernate中的细节详解
1.实体类创建的注意事项
1.持久化类提供无参数构造
2.成员变量私有,提供共有get/set方法访问.需提供属性
3.持久化类中的属性,应尽量使用包装类型
4.持久化类需要提供oid.与数据库中的主键列对应
5.不要用final修饰class(如果被final修饰.将无法生成代理)
2.主键生成策略
assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.
identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
sequence: Oracle中的主键生成策略.
increment(了解): 主键自增.由hibernate来维护.每次插入前会先查询表中id最大值.+1作为新主键值.
hilo(了解): 高低位算法.主键自增.由hibernate来维护.开发时不使用.
native:hilo+sequence+identity 自动三选一策略.
uuid: 产生随机字符串作为主键. 主键类型必须为string 类型.
3.hibernate中的对象状态
瞬时状态:没有id,没有在session缓存中
持久化状态:有id,在session缓存中
游离|托管状态:有id,没有在session缓存中
4.hibernate缓存
hibernate存在缓存机制,依托于Session
hibernate缓存机制可以提高查询效率,减少不必要的修改语句发送
5.hibernate事务
1.事务特性:a 原子性,c 一致性,i 隔离性,d 持久性
2.事务并发问题:脏读,不可重复读,幻|虚读
3.事务的隔离级别:读未提交-1,读已提交-2,可重复读(mysql默认)-4,串行化-8
4.管理事务:业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.
5.管理事务的问题:在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成.我们要确保dao层和service层使用的使用同一个session对象
6.hibernate解决方式:确保使用同一个session对象的问题,hibernate已经帮我们解决了.我们开发人员只需要调用SessionFactory.getCurrentSession()方法即可获得与当前线程绑定的session对象.注意:调用getCurrentSession方法必须在主配置增加hibernate.current_session_context_class属性.并且通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.
6.hibernate中的批量查询
1.HQL查询-hibernate Query Language:有语句的面向对象的查询语言
使用场景:多表查询,但不复杂时使用
HQL查询:基本查询,条件查询(?号占位符,命名占位符),分页查询
2.Criteria查询:无语句的面向对象的查询语言
使用场景:单表条件查询
Criteria查询:基本查询,条件查询,分页查询,设置查询总记录数
3.原生SQL查询
使用场景:复杂的业务查询
原生SQL查询:基本查询,条件查询,分页查询
六.hibernate一对多|多对一关系
1.关系表达:数据库表中表达,实体对象中表达,orm元数据中表达
2.操作关联属性:通过关联属性表达一对多|多对一关系
3.级联操作:简化操作.一定要用,save-update,不建议使用delete.
4.关系维护:取消冗余多余的维护关系语句
七.hibernate多对多关系
1.关系表达:数据库表中表达,实体对象中表达,orm元数据中表达
2.操作关联属性:通过关联属性表达多对多关系
3.inverse属性
4.级联属性
八.hibernate查询总结
1.HQL语法:基础语法,排序,条件,分页,聚合函数,投影,多表查询
2.Criteria语法:基础语法,排序,条件,分页,统计,离线查询
3.查询优化
1.类级别查询:get方法:没有任何策略.调用即立即查询数据库加载数据,load方法: 应用类级别的加载策略
2.关联级别查询:集合策略,关联属性策略(为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.)
3.no-session问题解决: 扩大session的作用范围.
4.批量抓取