Hibernate

一.Hibernate简介

1.什么是Hibernate

  • 面向对象的数据访问层框架
  • 功能类似于MyBatis

2.与MyBatis的区别

1)MyBatis

  • 面向SQL: 自己写SQL
  • 对jdbc封装的较轻,更灵活

2)Hibernate

  • 面向对象: 自动生成SQL
  • 对jdbc封装的较重,对基本的CRUD操作更方便

3.Hibernate使用步骤

  1. 导包: hibernate-core,javassist,jdbc
  2. 配置主配置文件: hibernate.cfg.xml
  3. 开发实体类
  4. 配置映射关系文件: *.hbm.xml
  5. 调用Hibernate API,执行CRUD操作

二.Hibernate基础语法

1.ID生成方式

  1. sequence: 根据序列生成ID,用于oracle

    <generator class="sequence">
        <param name="sequence">序列名</param>
    </generator>
    
  2. identity: 自动生成ID,用于其他数据库

    <generator class="identity"></generator>
    
  3. native: sequence和identity二选一

    <generator class="native">
        <param name="sequence">序列名</param>
    </generator>
    

2.创建连接

    Configuration cfg = new Configuration();
    cfg.configure("hibernate.cfg.xml");
    SessionFactory sf = cfg.buildSessionFactory();
    Session session = sf.openSession();

3.根据ID查询

    session.get(Emp.class, 1)
    session.load(Emp.class, 1)

4.增删改

    Session session = null;
    Transaction tx = null;
    try {
        session = HibernateUtil.getSession();
        tx = session.beginTransaction();
        session.save(e);
        tx.commit();
    } catch (HibernateException e) {
        tx.rollback();
    } finally {
        session.close();
    }

5.HQL查询

    String hql = "from Emp where empno>3";
    Query query = session.createQuery(hql);
    List<Emp> list = query.list();

三.Hibernate高级特性

1.关联映射

1)什么是关联映射

  • 多张表之间有关联关系
  • 在映射文件中配置好它们的关系
  • Hibernate会依据此关系,在访问一张表时,自动访问其关联的表

2)有哪些关联映射

  • 一对多关联
  • 多对一关联
  • 多对多关联
  • 一对一关联

3)有哪些关联操作

  • 增,删,改,查

4)案例:一对多关联查询(部门与员工)

  • 在部门对象中增加集合属性,以存储关联的员工数据

    private Set<Emp> emps;
    
    public Set<Emp> getEmps() {
        return emps;
    }
    public void setEmps(Set<Emp> emps) {
        this.emps = emps;
    }
    
  • 在映射文件中配置此集合属性

    <set name="emps" lazy="false">
        <key column="deptno"></key>
        <one-to-many class="cn.tedu.entity.Emp"/>
    </set>
    
  • 查询部门,看看集合属性的值

    Dept dept = (Dept) session.get(Dept.class, 1);
    Set<Emp> set = dept.getEmps();
    System.out.println(set);
    
  • 对应关系
    这里写图片描述

2.延迟加载

1)什么是延迟加载

  • 推迟数据加载的时机,什么时候用,就什么时候加载

2)哪些地方采用了延迟加载机制(面试题)

  • 关联查询时,对关联数据的加载
  • session.load()
  • query.iterate()

3)延迟加载的实现原理

  • CGLIB动态代理技术

4)延迟加载的作用

  • 什么时候使用数据,就什么时候查询
  • 如果用户没有使用该数据,则不查询,减少一些查询次数,减少开销

3.一级缓存

1)什么是一级缓存

  • 也叫session级缓存
  • 只能缓存实体对象数据
  • 是在session对象中缓存数据,该数据可以被使用同一个session的其它查询复用

2)如何使用一级缓存

  • 一级缓存默认开启,且不可关闭
  • 直接使用session查询数据,数据会自动缓存到此session对象上

3)如何从一级缓存中移除数据

  • 移除一个数据: session.evict(obj)
  • 移除所有数据: session.clear()

4.对象状态

1)Hibernate对象的状态

  • Hibernate对象有3种状态: 临时态、持久态、游离态
  • Hibernate通过状态来管理对象,不同状态的对象有不同的处理机制

2)三种状态的关系

这里写图片描述

3)每种状态的特征

临时态
  • 临时态对象未经过持久化,未与session关联
  • 临时态对象可以被垃圾回收
持久态
  • 持久态对象进行了持久化,已与session关联
  • 持久态对象存在与session(一级)缓存中
  • 持久态对象能自动更新到数据库,更新是在调用session.flush()时

commit()的底层调用了session.flush()

游离态
  • 游离态对象进行过持久化,但已与session解除了关联
  • 游离态对象可以被垃圾回收

5.二级缓存

1)什么是二级缓存

  • 也叫SessionFactory级缓存
  • 只能缓存对象数据
  • 是在SessionFactory中缓存数据,该数据可以由所有session共用

2)二级缓存使用步骤

导包
  • 搜ehcache
开启二级缓存
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.provider_class">
      包名.EhcacheProvider
    </property>
指定哪个对象可以使用二级缓存
  • 在此对象的映射文件内

    <cache usage="read-only"/>
    
注意
  • 一定要保证只创建一个SessionFactory

补充一:jsp处理请求和Ajax处理请求的区别?

1.使用jsp处理请求的流程

这里写图片描述

2.使用Ajax处理请求的流程

这里写图片描述

3.归纳

  • 后者彻底将HTML和Java解耦,更利于团队开发及配合

补充二:缓存的执行过程

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值