zoukankan      html  css  js  c++  java
  • Hibernate总结

    1、hibernate是什么?
      (1)用途:直接处理JavaBean,不再去处理SQL语句

      (2)在Javabean上实现一对多,或是多对多的关系。

      (3)数据移植

    MySql (limit) - Oracle (rownum) - MsSqlServer (top)

      什么是ORM:ORM就是利用描述对象(JavaBean)和数据库之间的映射的元数据,自动且透明地把Java应用程序
    中的对象持久化到关系数据库中的表。

      ORM本质上,是把数据从一种表示法转换为另一种表示法进行工作。但这意味着某些性能的损失。

    2、通过MyEclipse创建Hibernate项目。
      Hibername拥有自己的配置文件:classpath:hibernate.properties , classpath:/hibernate.cfg.xml
      创建了配置文件后,还需要创建一个读取配置文件的类

      Hibernate是如何来操作数据库中表的?
      1、hibernate必须要将表结构抽象成一个javaBean。
      2、用一个JavaBean和一个XML文件来完成从JavaBean到数据库的映射
      3、通过Session(Connection)类,它的save(JavaBean)即可以直接保存数据
      4、之前的Connection默认是自动提交事务的,但Session对Connection进行了封装,且不是自动提交事务的。
      5、hibernate是如何实现写入到表中的?有没有执行sql? - insert.如何才可以年到insert语句?
        通过配置,可以让hibernate告诉我们hibernate是如何执行的sql语句

        以下配置是否输出执行的Sql语句,默认为不输出
        <property name="hibernate.show_show_sql">true</property>
        以下设置美化一个sql语句
        <property name="hibernate.format_sql"><property>

    3、手工创建hibernate项目
      1、创建一个Java项目
      2、包。    hibernate是用dom4j来读取XML配置文件的
      3、创建一个Hibernate.properties或是hibernate.cfg.xml配置文件
      4、创建一个类:HibernateUtils, 此类中使用Configuration来读取上面的两个配置文件
      5、创建一个JavaBean和一个映射文件即*。hbm.xml文件,与数据库对应 --领域对象
      6、声明Stud类,调用session的save方法

    4、Hibernate的启动过程分析
      Hibernate的启动过程:
      Configuration 的构造方法先去读取classpath:hibernate.properties文件
      可选的调用:configure方法,读取classpath:hibernate.cfg.xml文件。
      通过buildSessionFactory方法返回一个SessionFactory - 成功。


    5、Hibernate的配置文件分析
      1)为什么Hibernate会读取两个配置文件:
      通常情况下,我们只提供一个配置文件,即:hibernate.cfg.xml文件。
      提供两个配置文件的情况是:
      在hibernate.properties文件中,配置数据连接,二级缓存,连接池等信息.
          在hibernate.cfg.xml中配置mapping元素以加载*.hbm.xml文件或是指定加载一个添加了注解的类。
     
      2)几个连接池配置选项的意思:
      hibernate.c3p0.timeout = 300
        指定超时周期,上例为300秒,在它之后闲置连接将从池中移除。
       hibernate.c3p0.max_statements = 50
        最多高速缓存50个预编译语句。高速缓存编译语句是利用hibernate获取最好性能的要素。
       hibernate.c3p0.max_size选项应该是必须的。

       什么是持久化:持久化是在应用程序开发中最基本的概念之一,一般是指利用SQL在关系数据库中存储数据(p3).
       数据比任何应用程序存在的都长久。

       3)SessionFactory与Session:
       SessionFactory是线程安全的,且能被共享。它生活在Hibernate的整个生命周期。
       Session不是线程安全的,生命周期非常短暂。

       4)一对多时只能使用接口类型:
      Hibernate需要用于集合类型属性的接口。因此必须使用java.util.Set或是java.util.List,而不是
      HashSet或是ArrayList. - 即 Set set = new HashSet(); 注意类型部分。

       5)主键生成策略:
       native:根据不同的数据库生成主键 - mysql = auto_increment ,sqlserver= identify ,oracle=sequence
        应该设置:increment 由hiberate来设置主键的自动增加。

       native对于本地在表上设置了主键生成策略的表生用有,如对于mySql来说,就是auto_increment.
       对于SqlServer来说就是identity,对于oracle来说是sequence,此种情况下,不会做select max工作。
       当你没有在表级别上设置自动增长策略时,对于主键使用native会抛出异常。
       
        increment
        设置主键的自动增长,此时hibernte会自动做一个select max的查询语句,然后再写到表中。
       即使你没有在表级别上设置自动增长策略也不会有错。

      以上所有生成器都是一个类,如:increment是类:org.hibernate.id.IncrementGenerator
       所有生成器,都是IdentifierGenerator的子类。

      每一个主键生成策略都是一个类:此类由hibernte生成。
      UUID - UUIDGenerator
      所有生成主键的策略都是IdentifierGenerator接口的子类。

       6)XML中的元数据
      任何一个ORM解决方案都应该提供一个人类可读的,易于手工编写的映射格式。
      目前最受欢迎的对象/关系元数据格式是XML.
       Hibernate的映射XML文件非常易读,并定义的有用的默认值。如果没有属性值,就在被映射类上通过反射来确定
        默认值。

       7)entry-name与name的区别与联系:
       entry-name与name两都必须存在一个,也可以同时存在。
      仅存在entry-name则是定义一个Map类型的实体。
      仅存在name则是定义一个JavaBean类型的实体。此时entry-name的值为类名。
      两者同时存在,entry-name的效力要强于name,意思是为JavaBean取一个实体名称。
        今后的关系等操作必须要通过指定实体名的方式引用。
      两都同时存在的情况经常用在,一个JavaBean映射多个表,此时必须要通过entry-name区分它们。

       8)使用XML数据-通过查询直接转换成XML数据
      Session s2 = Session.getSession(EntityMode.DOM4J);    //再次查询,将返回Dom4j的Element元素
      Element el = (Element)s2.get(Person.class,1);
       OutputFormat out = OutputFormat.createPrettyPrint();//格式化数据
       XMLWriter writer = new XMLWriter(System.err,out);//定义格式输出
       writer.write(el);//输出
       
        解决循环引用:
        在不需要引用的字段的hbm.xml文件上添加embed-xml=false可以防止循环引用。
        也可以定义成属性:通过在hbm.xml文件中添加node="@id"可以定义成属性。
        示例:
      <class name="Person" node="MyPerson">//修改了xml文件的元素
         <id name="id" node="@id"> //定义成属性
             ...
         <set name="cars" embed-xml="false">//防止引用子元素,循环引用
       </class>

       9)细粒度的领域模型
       Hibernate的一个主要目标是支持细粒度的领域模型,粗略地说,细粒度意味着类比表更多。

    6、Hibernate的CRUD及其他操作
      1、查询:
        以下查询方法:
        A:全部查询,使用Creteri(完全限定名-类名)进行查询
        B:全部查询,使用Query - 不执行SQL - 语句,执行的是HQL - Hibernate Query Language
        C: 全部查询,使用SQLQuery类,此类执行原生的SQL语句

      2、条件查询
        A:对于Crieria类,必须使用add方法设置条件
        B:对于Query类,应该使用?(点位符)或是命名(where id=:myId)和查询
        C:普通查询,使用?
     
      3、如果一个查询,它的条件不确定

  • 相关阅读:
    关系型数据库和非关系型数据库的区别
    总结篇3-python数据结构和算法
    总结篇2-python进阶
    总结篇1-python基础
    测试sql星级判定函数
    1、Anyproxy简介
    Python内置logging模块-- 日志
    python+ selenium 绕过浏览器检测
    python-selenium,解决 遇到阿里无痕登录验证
    seldom
  • 原文地址:https://www.cnblogs.com/qq809306794/p/3302470.html
Copyright © 2011-2022 走看看