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、如果一个查询,它的条件不确定

posted on 2013-09-05 07:39  笨'小孩  阅读(316)  评论(0编辑  收藏  举报

导航