我的hibernate学习笔记(2)--Hibernate开发步骤(重点)

四、Hibernate开发步骤:(重点:必须掌握) 
   开始:(设置环境变量和配置) 
         在myeclipse里导入Hibernate的文件包(包括各数据库的驱动和其他的jar包,对版本敏感,注意各版本的兼容) 
         按hibernate规范编写名字为hibernate.cfg.xml文件(默认放在工程文件夹下) 
   步骤一:设计和建立数据库表
        可以用Hibernate直接生成映射表。
        Oracle里建表: create table t_ad (oid number(15) primary key,
                      ACTNO varchar(20) not null unique,BALANCE number(20));
   步骤二:持久化类的设计
     POJO---- POJO 在Hibernate 语义中理解为数据库表所对应的Domain Object。(此类中只含有属性、构造方法、get/set方法) 
     这里的POJO就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通Java 对象,
     简单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。

   步骤三:持久化类和关系数据库的映射
     编写*.hbm.xml文件---该文件配置持久化类和数据库表之间的映射关系




<class name=“POJO的类全路径”  table=“对应的库表名”     //这两项一定要配置,其它的都可以不配置 discriminator-value=“discriminator_value”   //区分不同子类的值,多态时使用。默认与类名一样 
dynamic-update=“true | false” //是否动态更新SQL。false:每次都更新所有属性;true:只更新修改的 
dynamic-insert=“true | false” //是否动态插入SQL。false:每次都插入所有属性;true:只插入非空的 
select-before-update=“true | false” //是否在update前查询对象是否被修改过,修改过才update 
polymorphism=“implicit | explicit”  //设置多态是显性(explicit)的还是隐性(implicit)的 
where=“查询时使用的SQL的条件子句”  //查询时使用的SQL的条件子句 
lazy=“true | false” //设置延迟加载策略 
/> 


     一个实体对应一个xml文件,组件用id,非组件用property。

     *.hbm.xml文件样板:
        <?xml version="1.0"?> 
        <!DOCTYPE hibernate-mapping PUBLIC  
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
	<!--package指文件所在的包名 -->
        <hibernate-mapping package="com.tarena.ebank.biz.entity"> 
         <!-- name:POJO类的名; table数据库里对应的表名-->
           <class name="Account" table="student"> 
	    <!-- OID:(唯一,中性)表自动生成的(需要另外添加hilo表) -->
              <id name="oid" column="OID"> 
                 <generator class="hilo"> 
                    <param name="table">t_hi</param> 
                    <param name="column">hi</param> 
              </generator></id> 
              <property name="actNo" column="ACTNO" unique="true" not-null="true"/> 
              <property name="bal" column="BALANCE" not-null="true"/> 
           </class> 
        </hibernate-mapping> 


   步骤四:Hibernate配置文件
     hibernate.cfg.xml或hibernate.properties
     1.需要配置那些信息:持久化映射,方言,特性,登陆信息
         多数使用默认的设置。
         A、dialect:方言,就是拼驱动程序和SQL语句。每种数据库对应一种方言其实就是指定了用那一种数据库。
Oracle数据库方言:org.hibernate.dialect.OracleDialect
MySql数据库方言:org.hibernate.dialect.MySQLDialect

         B、Object Persistence:对象持久化。把内存中的数据保存到一个永久的介质中,比如说数据库。
         C、ORM:对象关系映射,是一个自动的过程
         注:持久对象与临时对象最大的区别是有没有数据库id标识。
    2.hibernate.cfg.xml的样板:
      <?xml version='1.0' encoding='UTF-8'?> 
      <!DOCTYPE hibernate-configuration PUBLIC 
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
      <hibernate-configuration> 
      <session-factory> 
        <!-- 数据库连接配置 --> 
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property> 
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
        <property name="connection.username">root</property> 
        <property name="connection.password">password</property> 
        <!-- 自动建表语句:create覆盖旧表,update自动更新,none不理会 --> 
        <property name="hbm2ddl.auto">update</property>  
        <!-- 是否在控制台上打印SQL(Hibernate把语句转化为SQL语句),默认false--> 
        <property name="show_sql">true</property> 
        <!-- 缓存策略,数据量不大可不写  --> 
        <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
        <property name="cache.use_query_cache">false</property> 
        <property name="cache.use_second_level_cache">false</property> 
        <!-- 不同数据库使用的SQL选择 --> 
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
        <property name="myeclipse.connection.profile">mysql</property> 
        <!-- 连接池配置,练习时不写,使用默认的 --> 
        <property name="connection.pool_size">1</property> 
        <!--决定是采用thread或jta或自定义的方式来产生session,练习时不写,使用默认的  --> 
        <property name="current_session_context_class">thread</property> 
        <!-- *.hbm.xml文件路径,各关联表要一同写上 --> 
        <mapping resource="many_to_one/vo/Customer.hbm.xml" /> 
        <mapping resource="com/tarena/ebank/biz/entity/Order.hbm.xml" /> 
      </session-factory> 
      </hibernate-configuration> 


    步骤五:使用Hibernate API
        //读取Hibernate.cfg.xml配置文件,并读到内存中为后续操作作准备 
        Configuration config = new Configuration().configure(); 
        //SessionFactory缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。 
        SessionFactory sessionFactory = config.buildSessionFactory(); 
        //Session是持久层操作的基础,相当于JDBC中的Connection。 
        Session session = sessionFactory.openSession(); 

        try{  
//为保持事务的原子性,必须捕捉异常。所有事务都放在这一代码块里。 
            //操作事务时(增、删、改)必须显式的调用Transaction(默认:autoCommit=false)。 
            Transaction tx = session.beginTransaction(); 
            for(int i=0; i<=1000; i++){ 
              Student stu = new Student(...); 
              session.save(stu);//set value to stu 
              //批量更新:为防止内存不足,分成每20个一批发送过去。  
              if(i%20==0){session.flush();session.clear();}//不是大批量更新,则不需要写这一行 
              //默认时,会自动flush:查询之前、提交时。 
            } tx.commit();//提交事务,Hibernate不喜欢抛异常,如有需要,自己捕捉。 

            //查询方法。如果有必要,也可以用事务(调用Transaction)  
            String hql = "from Student s where s.stuNo like ? and s.Sal > ?";//Student是类而不是表 
            List list = session.createQuery(hql) 
                               .setString(0, "a00_").setDouble(1, 3000.0)//设置HQL的第一二个问号取值 
                               .list();//Hibernate里面,没有返回值的都默认返回List 
            StringBuffer sb = new StringBuffer(); 
            for(Student st :(List<Student>)list){//(List<Student>)强制类型转换 
              sb.append(st.getOid()+"  "+st.getName()+"\n");//拿到Student类里的属性 
            }System.out.print(sb.toString());//直接打印sb也可以,它也是调用toString,但这样写效率更高 
        } catch (HibernateException e) { 
            e.printStackTrace(); 
            session.getTransaction().rollback();//如果事务不成功,则rollback 
        } finally { 
            session.close();//注意关闭顺序,session先关,Factory最后关(因为它可以启动多个session)  
            sessionFactory.close();//关闭SessionFactory,虽然这里没看到它,但在HbnUtil里开启了。 
        } 

你可能感兴趣的:(oracle,sql,xml,Hibernate,mysql)