Hibernate总结

  • hibernate的引出:
    • crm:客户关系管理
    • javaEE开发的三层架构:客户层, WEB层 ,业务逻辑层, 持久层
      • 客户层: html css js
      • WEB:servlet jsp
      • 业务逻辑:javaBean spring
      • 持久层: JDBC Hibernate Mybatis DbUtils SpringJDBC模板

  • Hibernate概述
    • 概念:开源的持久层的ORM框架
    • ORM:对象关系映射;利用描述对象与数据库表之间的映射的元数据,自动持久化对象。
      • orm分为4级:hibernate属于4级,完全面向对象,mybatis 属于2级 dbutils属于1级
    • 优势:
      • 对JDBC进行了轻量级封装,减少内存消耗
      • 基于JDBC,简化了DAO层(data access object)编码工作;
      • 映射灵活,处理一对一,一对多多种关系;
      • 可扩展性强,开放源码

  • 文件包内容
    • hibernate-release-5.0.7.Final
      • documentation 存放相关文档
      • lib存放依赖的JAR包
      • project 存放源代码

  • Hibernate框架的搭建
    • 1.导包
      • required下的9个jar包
      • 驱动包:mysql-connector-java-5.1.7-bin.jar
    • 2.创建数据库,准备表,实体
    • 3.书写orm元数据
      • 文件名称 Xxxxx.hbm.xml
      • 导入约束 1 设置catelog location key type:url key:在libary找以dtd结尾mapping的;
      • 复制代码头
      • orm元数据
        这里写图片描述
    • 4.书写主配置文件 hibernate.cfg.xml
<hibernate-configuration>
    <session-factory>
         <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- 数据库url -->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
         <!-- 数据库连接用户名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 数据库连接密码 -->
        <property name="hibernate.connection.password">1234</property>
        <!-- 数据库方言
            不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
            sql99标准: DDL 定义语言  库表的增删改查
                      DCL 控制语言  事务 权限
                      DML 操纵语言  增删改查
            注意: MYSQL在选择方言时,请选择最短的方言.
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 将hibernate生成的sql语句打印到控制台 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
        <property name="hibernate.format_sql">true</property>
        <!-- 
        ## auto schema export  自动导出表结构. 自动建表
        #hibernate.hbm2ddl.auto create      自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
        #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
        #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
        #hibernate.hbm2ddl.auto validate    校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 引入orm元数据
            路径书写: 填写src下的路径
         -->
        <mapping resource="cn/itheima/domain/Customer.hbm.xml" />

    </session-factory>
</hibernate-configuration>
   - 5.书写代码测试
//测试Hibernate框架
public class Demo {

    @Test
    //保存客户
    public void fun1(){
        Configuration conf = new Configuration().configure();
        SessionFactory sessionFactory = conf.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //----------------------------------------------
        Customer c = new Customer();
        c.setCust_name("google公司");
        session.save(c);//执行保存
        //----------------------------------------------
        tx.commit();
        session.close();
        sessionFactory.close();
    }
}

  • hibernate的API详解
  • Configuration 配置对象主要用于Hibernate框架加载映射文件
Configuration config = new Configuration().configure(); 
//configure("xml文件位置"),默认为src下
  • SessionFactory Session工厂对象:接口负责Hibernate的初始化和建立Session对象。他在hibernate起到缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的数据放入,还保存对数据库配置的映射关系,维护二级缓存。
//SessionFactory 的获得
SessionFactory sessionFactory = config.bulidSessionFactory();
  - 特点 线程安全的,他的同一个实例能够供多个线程共享;
  - 重量级的,不能随意的创建和销毁他的实例;
  - 由于这特点,一般一个项目中只需要一个sessionfactory 只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。
  - 因此在实际使用中,会抽取一个HibernateUtils工具类。
public class HibernateUtils {
    private static SessionFactory sf;

    static{
        //1 创建,调用空参构造
        Configuration conf = new Configuration().configure();
        //2 根据配置信息,创建 SessionFactory对象
         sf = conf.buildSessionFactory();
    }

    //获得session => 获得全新session
    public static Session openSession(){
                //3 获得session
                Session session = sf.openSession();

                return session;

    }
    //获得session => 获得与线程绑定的session
    public static Session getCurrentSession(){
        //3 获得session
        Session session = sf.getCurrentSession();

        return session;
    }
    public static void main(String[] args) {
        System.out.println(HibernateUtils.openSession());
    }

}
  • Session

    • 获得方法2种:openSession();直接创建新的session实例,用完需要调用close()方法关闭。 getCurrentSession();一个绑定线程的。提交或者回滚自动关闭。
    • session是轻量级的,线程不安全,软件架构是应避免多个线程操作一个session,它有一个缓存,一级缓存,存放当前工作单元加载的对象。

    • session中的方法:
      save();update();saveOrUpdate(); 增加修改
      delete();
      get(Customer.class,1l)和load();
      createQuery();和createSQLQuery();数据库操作对象;
      createCriteria()条件查询;

    • Transaction 封装了事务
      获得事务:session.getTransaction(); session.beginTransaction();建议用这个开启并操作事务;
      Transcation transaction = session.beginTransaction();
      transaction.commit();
      transaction.rollback();


  • Hibernate中的实体编写规则:
    1.持久化类需要提供无参构造方法
    2.持久化类的属性需要私有,提供getset方法;
    3.属性使用包装类的类型:例如double和Double 如果忘记输入会出现null,为零则为0,double则都是0区分不开。
    4.要有唯一标识OID与表的主键对应。
    5.不要用final修饰,因为hibernate有延迟加载机制,这个机制会产生代理对象,产生代理对象是字节码的增强技术,其实就是产生当前类的一个子对象,如果用final修饰就不能产生子类,延迟加载会失效。
  • 主键生成策略
    主键类型:
    1.自然主键,把具有业务含义的字段作为主键。例如customer中可以将name作为主键,不能为null,不允许重名,不允许修改。
    2.代理主键 ,不具有业务含义字段作为主键,通常为整数类型。
    主键生成策略:
    1.代理主键
    identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
    sequence: Oracle中的主键生成策略.
    hilo(了解): 高低位算法.主键自增.由hibernate来维护.开发时不使用.
    native:hilo+sequence+identity 自动三选一策略.
    increment(了解): 主键自增.由hibernate来维护.每次插入前会先查询表中id最大值.+1作为新主键值.
    uuid: 产生随机字符串作为主键. 主键类型必须为string 类型.

    2.自然主键
    assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入。

  • Hibernate持久化类的三种状态

    • 1.瞬时态 transient 没有id,没有在session缓存中
    • 2.持久态 persistent 没有id,没有在session缓存中
    • 3.游离态 datached 有id,没有在session缓存中
      这里写图片描述
      详细说明在文档。我们希望同步到Hibernate 中的数据为持久态。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值