Hibernate基础知识

1.Hibernate程序开发的步骤

 如何开发一个hibernate程序

  Hibernate程序运行过程图解

 

  * 建立java工程

  * 引入相关的jar包

            * hibernate的相关jar包
                    hibernate-distribution-3.5.6-Final\lib\required\*.jar
                    hibernate-distribution-3.5.6-Final\hibernate3.jar             
                     hibernate-annotations-3.4.0.GA\lib\test\slf4j-log4j12.jar
                    hibernate-annotations-3.4.0.GA\lib\test\log4j.jar       
             * junit测试的jar包
                       junit-4.8.2.jar         
             * mysql的驱动jar包
                      mysql-connector-java-5.1.10-bin.jar   

   

  *创建表

          CREATE TABLEcustomers
                               (
                                 id         INT PRIMARY KEY,
                                 NAME       VARCHAR(12),
                                 age          INT,
                                 des          TEXT
                               )                            

   * 创建表对应的javaBean

            public class Customer {
                                         privateInteger id;
                                         privateString name;
                                         privateInteger age;
                                         privateString des                                             
               }         

   * 创建表和javaBean的映射文件Customer.hbm.xml 该文件和javaBean放置在同一个目录下  

     * 该映射文件的规范在hibernate3.jar包下org.hibernate下hibernate-mapping-3.0.dtd
        * 配置如下
          <?xmlversion="1.0" encoding="UTF-8"?>
                               <!DOCTYPEhibernate-mapping PUBLIC
                                   "-//Hibernate/Hibernate Mapping DTD3.0//EN"
                                  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
                                <hibernate-mapping>
                                  <!-- class标签建立javaBean和表之间的映射-->
                                  <classname="cn.itcast.primer.Customer" table="customers">
                                     <!-- 用id来映射表中的主键 -->
                                     <id name="id"type="integer">
                                       <column name="id"/>
                                       <!-- 配置主键的生成策略-->
                                       <generatorclass="increment"/>
                                     </id>
                                 
                                     <!-- property建立javaBean中的属性和表中列的对应关系
                                          type="string":string表示的是hibernate的类型,该类型是java类型和sql类型之间的桥梁
                                          java中的类型:Stringname;  sql中的类型:varchar(255):
                                          type="string":  string(唯一)对应的是hibernate中的一个类org.hibernate.type.StringType
                                                               映射一个sql的varchar类型到java的String类型
                                      -->
                                     <property name="name"type="string">
                                         <!--column定义表中的列 sql-type表示表中列的类型  -->
                                         <column name="name"/>
                                     </property>
                                    
                                      <property name="age"type="integer">
                                         <column name="age"/>
                                     </property>
                                    
                                     <property name="des"type="string">
                                         <column name="des"/>
                                     </property>
                                         
                                  </class>
                                </hibernate-mapping>
  

  * 创建hibernate的配置文件hibernate.cfg.xml,放置在src下        

           * 该映射文件的规范在hibernate3.jar包下org.hibernate下hibernate-configuration-3.0.dtd
             * 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/HibernateConfiguration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
      <propertyname="hibernate.connection.username">root</property>
      <propertyname="hibernate.connection.password">root</property>
      <propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
     
      <!-- 配置数据库的方言,让hibernate知道连接的是哪个数据库-->
      <propertyname="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  
     <!-- 配置利用javaBean和映射文件生成数据库中的表
           hibernate.hbm2ddl.auto值
              * create:执行时,先查找该表是否存在,如存在先删除表,在创建表
             * none:不能创建表,只能往表中插入数据,如表不存在抛出异常,默认值
              * update:执行时,
                          情况一:
                                先查找该表是否存在,如果表存在,直接插入,如果表不存在,先创建表,再插入数据.
                          情况二:
                                先查找该表是否存在,如果表存在,但表的结构不一样,要修改表的结构
      -->
     <propertyname="hibernate.hbm2ddl.auto">update</property>
     
      <!-- 显示hibernate生成的sql语句-->
      <propertyname="hibernate.show_sql">true</property>
  
      <!-- 显示格式化得sql语句 -->
      <propertyname="hibernate.format_sql">true</property>
     
   </session-factory>
</hibernate-configuration>

 
 * 定义App类测试          
             
                               publicstatic void main(String[] args) {
                                             //加载hibernate的配置文件hibernate.cfg.xml文件
                                                      Configuration config=new Configuration();
                                                    
                                                      //默认加载类路径下的/hibernate.cfg.xml文件
                                                config.configure();
                                                  
                                              //加载映射文件
                                                //方法一
                                               //config.addResource("cn/itcast/primer/Customer.hbm.xml");
                                                     
                                                //方法二(使用该方法加载映射文件,要求1:映射文件和Customer.java文件必须在同一个目录下
                                                                              //2  映射文件和Customer.java文件文件的名称相同)
                                                  config.addClass(Customer.class);
                                                              
                                                             /*
                                                               *利用上面的配置生成SessionFactory
                                                               * * sessionFactory保存连接数据库的配置信息和映射文件的信息.
                                                               */            
                                                         SessionFactorysf=config.buildSessionFactory();
                                                  
                                                  
                                                   //从SessionFactory获取session
                                                      Session session=sf.openSession();
                                                   //开始事务
                                                      Transaction tx=session.beginTransaction();
                                       //创建Customer对象
                                                      Customer c=new Customer();
                                                      c.setName("zhang");
                                                      c.setAge(34);
                                                      c.setDes("xxx");
                                                     
                                                   //保存对象
                                                      session.save(c);
                                                  
                                                   //提交事务
                                                     tx.commit();
                                                  
                                                   //关闭session
                                                     session.close();
                                         }


2.Hibernate的一级缓存机制

          /*

           * 知识点5:Hibernate中用对象表示符(OID)来区分对象

           */

     @Test
          public  void testSessionCache(){
                       Session session=sf.openSession();
                       Transaction tx=session.beginTransaction();
        
                       /*
                        *缓存:集合--集合放置到内存中
                        *  只要session存在 session的一级缓存肯定存在。
                        */
                       
                       /*
                        *当执行查询时,以oid为oid=1条件到session的一级缓存中查找oid=1的对象
                        *    * 如果找到直接从缓存中获取该对象,这时不再查询数据库
                        *    * 如果没有找到,此时要查询数据库,产生select语句
                        */
                      
                       //缓存中没有oid=1的customer对象,所以要查询数据库
                       Customerc1=(Customer)session.get(Customer.class, 1);//产生select语句
                      
                       //缓存中存在oid=1的对象,所以直接从缓存获取,不再查询数据库
                       Customerc2=(Customer)session.get(Customer.class, 1);//不会产生select语句
                      
                       //缓存中不存在oid=2的对象,所以查询数据库
                       Customerc3=(Customer)session.get(Customer.class, 2);//产生select语句
                      
                       System.out.println(c1==c2);//true
                       
                       System.out.println(c2==c3); //false
                     
                      
                       tx.commit();
                       session.close();
          }
  /*

           * 知识点5:Hibernate中用对象表示符(OID)来区分对象

           *        测试session一级缓存的快照,只有查询时,存在快照

           */

                       /*
                        * 缓存中没有oid=1的customer对象,所以要查询数据库
                        *
                        * * 查处该对象后,放置到session的一级缓存中一份,同时在快照中有一份复制
                        */
                       Customer c=(Customer)session.get(Customer.class,1);//产生select语句
                       c.setName("张翠山");
                      
                       /**
                        * 清理缓存中
                        *    要比对缓存的对象的属性值和快照中的对象的属性值,是否相等
                        *     * 如果一致,不再执行update语句
                        *     * 如果不一致,执行update语句
                        */
                       tx.commit();
                       session.close();
          }


3.orm持久化概述(使得Hibernate面对java对象进行操作即可而无须对具体数据库进行操作,很好的封装和隔离了数据库信息)


  

4.一对多和多对一关联的xml文件写法

Order.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 <hibernate-mapping>
   <class name="cn.itcast.many2one.Order" table="orders">
      <id name="id" type="integer">
        <column name="id"/>
        <generator class="increment"/>
      </id>
      <property name="orderNumber" type="string">
          <column name="orderNumber"/>
      </property>
      <property name="price" type="double">
          <column name="price"/>
      </property>
           customer要获取的是Customer对象,
             该Customer对象通过orders表的外键customer_id来查询customers表
           select * from customes where id=customer_id
           many-to-one:使用该标签来映射多对一关联:
                name:映射的持久化类中的属性
                class:映射的持久化类中的属性的类型               
           cascade="save-update":级联保存和更新

                 * 就是将order对象所关联的临时对象Customer变成持久对象(就在session的一级缓存中,就能插入到数据库中)

     保存时先保存关联对象,后保存自身。     

<many-to-one  name="customer" class="cn.itcast.many2one.Customer" cascade="save-update">
           <!-- 映射的表中的列 -->
           <column name="customer_id"/>
      </many-to-one>
      
   </class>
 </hibernate-mapping>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值