Hibernate

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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值