Hibernate系列(一)概述

一.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.批量抓取

猜你喜欢

转载自blog.csdn.net/bestmy/article/details/81055195