欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate知识梳理

程序员文章站 2022-03-02 10:21:06
...

《概念介绍回顾》

JavaEE三层结构
    1.web层:(视图) --struts2
    2.service层:(业务逻辑) --spring
    3.dao层:(数据访问) --hibernate

MVC思想
   model:模型
   view:视图
   control:控制器 

ORM思想
   Object Relational Mapping  对象关系映射
      1.hibernate使用orm思想,对数据库进行crud操作
      2.让实体类和数据库进行一一对应  
            实体类名和表名对应
            属性名和表字段名对应
      3.不需要操作数据库表,而是操作表对应的实体类对象

《hibernate框架基本操作》

1.导入相应jar包
2.实体类--也叫持久化类
3.映射配置文件 实现类库映射关系  
4.核心配置文件 

《实现添加操作》

(1)是否生成表
(2)表中是否有数据

Configuration:
    加载核心配置文件

SessionFactory*
    (1)使用configuration对象创建sessionFactory对象,
             在这过程中,它会根据核心配置文件中的配置,将表创建出来

    (2)但创建sessionFactory对象,这个过程特别消耗资源,

    (3)解决方案--写工具类
       --使用静态代码块实现,它在类加载的时候执行,且只执行一次
                   这就保证了一个项目只创建一个sessionFactory对象

Session*
    1.调用session中的各个方法,实现crud操作
        -添加和修改    
            save();
            update();
            saveOrUpdate();

        -删除     
            delete();

        -根据id主键查询--返回一条数据 即 一个对象   
            get()和load();

        -条件查询  
            createCriteria();

        -操作数据库对象
            createQuery();createSQLQuery();

    2.最大特点--单线程对象
        -session对象不能和别人共用,只能自己用
        (通俗的说,一个软件就是一个进程,它里边的各个功能,就称为线程,
           每个功能在同一时间只能操作一次,叫单线程)
        -如何保证session是绝对的单线程对象呢?
            hibernate实现与本地线程绑定session
            (1)在核心配置文件中配置
            (2)调用SessionFactory中的方法
            (3)若是使用此种方法,则最后  session资源不需要我们手动关闭

Transaction:
    提交:commit();
    回滚:rollback();

《实体类(持久化类)编写规范》

1.私有属性
2.公有get/set方法、无参构造器、toString方法
3.要求有一个属性 作为唯一值--泛指id值
4.数据类型使用相应的包装类

《主键生成策略》

1.native--整数类型,根据使用的数据库,自动适应  
    (但是eclipse工具有问题,这个没效果  我目前只能用identity)
2.uuid--使用此种主键生成策略,实体类id属性必须是字符串类型

《实体类对象状态-概念》

  -瞬时态:对象里边没有id值,对象与session没有关联--添加操作
  -持久态:对象里边有id值,对象与session有关联--id查询
  -托管态:对象里边有id值,对象与session没有关联

《hibernate的缓存》

1.一级缓存
    >> 默认就是打开的
    >> 使用范围  是session范围(从session创建 到session关闭)
    >> 存储的数据 必须是持久态数据

  验证方式:
    第一步 根据id查询(此时是进入数据库查) 
         输出对象,观察控制台会出现select语句
         说明是进入数据库查的
    第二步 再次根据id查询(此时就是进入一级缓存里查) 
         输出对象,但控制台没有出现数据库查询语句,
         这就说明第二次查询是从一级缓存中查的

      特性:在根据id进行修改的时候,
                  因为有一级缓存的存在, 底层会自动去更新库表
                  所以我们不写session.update方法,也可以实现修改功能


2.二级缓存
    >> 可以用Redis技术替代
    >> 默认不打开
    >> 使用范围 是sessionFactory范围(整个web项目)

《Hibernate事物规范写法》

1.代码结构
    try{
        加载文件、sessionFactory、session
        开启事物
        curd操作
        提交事物
    }catch(Exception){
        e.printStackTrace();--输出异常
        回滚事物
    }finally{
        关闭资源
    }

《Hiernate的api使用》

Query对象查询所有记录*
    1.hql语句: hibernate query language(hibernate查询语言)

    2.hql与sql语句的区别:
           使用sql操作表和字段
           使用hql操作实体类和属性

    3.查询所有 hql语句写法:
         from 实体类名称

    4.Query对象使用
         -调用session中的方法 创建Query对象
         -调用Query对象中的方法得到结果(返回的是list集合)

Criteria对象查询
    该对象不用写hql语句,创建对象,直接调用方法(返回的是list集合)

SQLQuery对象查询
    该对象需要写sql语句,
    创建对象,
    调用方法(返回的是list数组)
    升级优化:把返回的数组转换为对象的形式
相关标签: 个人理解