亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 09. hibernate note.txt

?? 在達內培訓java筆記
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
?
軟件開發的分層思想:
    三層架構:
                           數據表現層     業務邏輯層      數據持久層
        SUN的桌面應用        Swing AWT    普通Java類     JDBC
        SUN的WEB基本應用     JSP          普通Servlet    JDBC
        SUN的WEB高級應用     JSF          SessionBean   Persistence 
        WEB國內流行開源      Struts       Spring         Hibernate


一、 對象持久化的理論
    1.對象持久化:內存中的對象轉存到外部持久設備上,在需要的時候還可以恢復。
    2.對象持久化的原因(目標):
      物理: 1) 內存不能持久,需要在硬盤上持久保存 //(物理上,物理的都不是根本原因) 
            2) 內存容量有限,需要在容量更大的硬盤上保存 
      應用: 3) 共享(Internet的本質:信息的收集、整理、發布) //最重要的原因
            4) 檢索(大規模) //也很重要
            5) 管理(備份、安全) 
    3.怎樣進行對象持久化?(僅從JAVA方面講) 
      物理: 1) 對象序列化
            2) DB技術(JDBC 數據庫) 
    4.怎樣利用數據庫做對象持久化?
            1) JDBC 
               優點:功能完備、理論上效率高
               缺點:復雜(難)、代碼量大、面向R(過程;二維表關系) 
            2) EJB 僅講Entity Bean
               優點:封裝JDBC
               缺點:更復雜的API、重量級(侵入式)、功能不完備、難共享
                    缺點的后果:開發周期長、測試困難、面向過程
               以上是 2.0之前的版本,但 3.0跟Hibernate基本一樣
            3) ORM 輕量級框架(Hibernate) 
               現階段最佳的持久化工具:文檔齊全、服務很好、工業標準、大量應用、易學
               優點:封裝JBDC、簡單的API、輕量級(只做持久化)(用類庫)、PO(持久對象)->POJO(純JAVA)、開源
               缺點:不夠JDBC靈活
    5.結論:
      1)對象持久化是必須的
      2)必須使用DB來實現
      3)Hibernate必須的(現階段最佳選擇) 
          開源工具的通常問題:1.文檔不全;2.服務不全;3.標準化不夠
          而Hibernate避免了所有這些問題 

二、 ORM和Hibernate的相關知識(理解)
    1) ORM:Object Relational Mapping
       對象-關系映射實現了面向對象世界中對象到關系數據庫中的表的自動的(和透明的)持久化,
       使用元數據(meta data)描述對象與數據庫間的映射。
    2) Hibernate是非常優秀、成熟的O/R Mapping框架。它提供了強大的對象和關系數據庫映射以及查詢功能。

    規范:
        1.一個映射文件對應一個持久類(一一對應) 
        2.映射文件的名字和它所描述的持久類的名字保持一致
        3.映射文件應該與它所描述的類在同一包中
    po -> (pojo) 
       -> oid(唯一,中性) 
       -> getters/setters
       -> 構造方法


三、Hibernate核心API(理解)
    Configuration類:
        Configuration對象用于配置和啟動Hibernate。Hibernate應用通過Configuration實例來指定對象-關系映射文
        件的位置或者動態配置Hibernate的屬性,然后創建SessionFactory實例。
    SessionFactory接口:
        一個SessionFactory實例對應一個數據存儲源。應用從SessionFactory中獲取Session實例。
        1)它是線程安全的,這意味著它的一個實例能夠被應用的多個線程共享。
        2)它是重量級的,這意味著不能隨意創建或者銷毀,一個數據庫只對應一個SessionFactory。
          通常構建SessionFactory是在某對象Bean的靜態初始化代碼塊中進行。
          如果應用只是訪問一個數據庫,只需創建一個SessionFactory實例,并且在應用初始化的時候創建該實例。
          如果應用有同時訪問多個數據庫,則需為每個數據庫創建一個單獨的SessionFactory。
    Session接口:
        是Hibernate應用最廣泛的接口。它提供了和持久化相關的操作,如添加,刪除,更改,加載和查詢對象。
        1)它是線程不安全的,因此在設計軟件架構時,應盡量避免多個線程共享一個Session實例。
        2)Session實例是輕量級的,這意味著在程序可以經常創建和銷毀Session對象,
          例如為每個客戶請求分配單獨的Session實例。
          原則:一個線程一個Session;一個事務一個Session。
    Transaction接口:
        是Hibernate的事務處理接口,它對底層的事務接口進行封裝。
    Query和Criteria接口:
        這兩個是Hibernate的查詢接口,用于向數據庫查詢對象,以及控制執行查詢的過程。
        Query實例包裝了一個HQL查詢語句。
        Criteria接口完全封裝了基于字符串形式的查詢語句,比Query接口更面向對象。Criteria更擅長于執行動態查詢。
        補充:find方法也提供數據查詢功能,但只是執行一些簡單的HQL查詢語句的快捷方式(已過時),遠沒有Query接口強大!


四、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">
        <hibernate-mapping package="com.tarena.ebank.biz.entity"><!--package指文件所在的包名 -->
           <class name="Account" table="student"><!-- name:POJO類的名; table數據庫里對應的表名-->
              <id name="oid" column="OID"><!-- OID:(唯一,中性)表自動生成的(需要另外添加hilo表) -->
                 <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里開啟了。
        }


五、 Hibernate主鍵策略(上面的步驟三的一部分) 
    <id><generator class=“主鍵策略” /></id> 
    主鍵:在關系數據庫中,主鍵用來標識記錄并保證每條記錄的唯一性(一般可保證全數據庫唯一)。必須滿足以下條件:
        1)不允許為空。
        2)不允許主鍵值重復。
        3)主鍵值不允許改變。
    1.自然主鍵:以有業務含義的字段為主鍵,稱為自然主鍵。
        優點:不用額外的字段。
        缺點:當業務需求發生變化時,必須修改數據類型,修改表的主鍵,增加了維護數據庫的難度。
    2.代理主鍵:增加一個額外的沒有任何業務含義的一般被命名為ID的字段作為主鍵。
        缺點:增加了額外字段,占用部分存儲空間。
        優點:提高了數據庫設計的靈活性。
    Hibernate用對象標識(OID)來區分對象:
        Student stu = (Student)session.load(Student.class,101); //這代碼加載了OID為101的Student對象
    Hibernate推薦使用代理主鍵,因此Hibernate的OID與代理主鍵對應,一般采用整數型,包括:short、int、long。

    1、主鍵生成策略: (Hibernate支持多種主鍵生成策略) 
    generator節點中class屬性的值:
      1) assigned:assigned:由用戶自定義ID,無需Hibernate或數據庫參與。
         是<generator>元素沒有指定時的默認生成策略。
           <id name="id" column="id"><generator class="assigned"/></id>
      2) hilo:通過hi/lo(高/低位)算法生成主鍵,需要另外建表保存主鍵生成的歷史狀態(這表只需要一個列和高位初始值)。
         hi/lo算法產生的標識只在一個特定的DB中是唯一的。所有數據庫都可用。
         如果同一個數據庫里多張表都需要用;可以建多張主鍵表,也可以共用同一字段,但最好是用同一張主鍵表的不同字段。
           <id name="id" column="id"><generator class="hilo">
               <param name="table">high_val</param><!--指定高位取值的表-->
               <param name="column">nextval</param> <!--指定高位取值的列-->
               <param name="max_lo">5</param><!--指定低位最大值,當取到最大值是會再取一個高位值再運算-->
           </generator></id>
      3) sequence:采用數據庫提供的Sequence機制。
         Oracle,DB2等數據庫都提供序列發生器生成主鍵,Hibernate也提供支持。
           <id name="id" column="id"><generator class="sequence">
               <param name="sequence">序列名</param>
           </generator></id>
      4) seqhilo:功能同hilo,只是自動建表保存高位值。主鍵生成的歷史狀態保存在Sequence中。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲狠狠丁香婷婷综合久久久| 精品国产百合女同互慰| 成人激情黄色小说| 国产成人自拍网| 国产乱码一区二区三区| 国产一区二区在线观看视频| 国产一区二区91| 国内精品第一页| 韩国理伦片一区二区三区在线播放| 蜜桃精品视频在线| 国产麻豆视频一区二区| 国产精品一区二区视频| 成人精品gif动图一区| 9i在线看片成人免费| 欧美中文字幕久久| 欧美顶级少妇做爰| 久久久亚洲高清| 亚洲同性gay激情无套| 亚洲美女少妇撒尿| 日韩精品久久久久久| 青青国产91久久久久久| 国产精品影视在线观看| 成人黄色软件下载| 欧美图区在线视频| 精品欧美乱码久久久久久1区2区| 亚洲国产成人私人影院tom| 综合色天天鬼久久鬼色| 午夜精品福利久久久| 国产一区二区中文字幕| 色婷婷久久综合| 日韩一区二区视频在线观看| 久久人人超碰精品| 亚洲色图丝袜美腿| 日本在线观看不卡视频| 成人做爰69片免费看网站| 欧洲国产伦久久久久久久| 日韩欧美一二三区| 亚洲欧洲另类国产综合| 日韩高清不卡一区| 成人丝袜18视频在线观看| 制服丝袜在线91| 国产精品天美传媒沈樵| 日本午夜精品一区二区三区电影| 成人三级伦理片| 日韩欧美美女一区二区三区| 亚洲你懂的在线视频| 狠狠色丁香婷婷综合久久片| 欧美在线一二三| 中文字幕中文字幕一区二区| 日韩av成人高清| 在线影院国内精品| 国产精品久久三区| 激情国产一区二区| 欧美三级韩国三级日本三斤| 中文字幕欧美激情一区| 国产综合久久久久久久久久久久| 欧美中文字幕一区| 亚洲色图视频网| 国产91高潮流白浆在线麻豆| 精品福利一二区| 五月婷婷色综合| 色综合久久久网| 中文字幕日韩一区| 国产成人鲁色资源国产91色综| 日韩一区二区三免费高清| 亚洲黄网站在线观看| 成人h版在线观看| 欧美激情中文不卡| 国产在线精品免费| 欧美成人精品3d动漫h| 奇米色一区二区三区四区| 欧美另类一区二区三区| 亚洲综合视频网| 91国偷自产一区二区三区成为亚洲经典 | 亚瑟在线精品视频| 91久久精品一区二区二区| 国产精品视频第一区| 国产精品中文欧美| 久久久久97国产精华液好用吗| 九九久久精品视频| 精品欧美一区二区在线观看| 久草精品在线观看| 26uuu亚洲综合色欧美| 国产一区二区女| 欧美国产亚洲另类动漫| 99久久99久久精品免费看蜜桃| 1024国产精品| 欧美中文字幕一二三区视频| 午夜精品福利久久久| 欧美成人女星排行榜| 国产激情精品久久久第一区二区 | 在线观看av不卡| 日韩电影免费一区| 久久女同精品一区二区| av不卡一区二区三区| 成人免费视频在线观看| 欧美日韩国产在线观看| 蜜桃视频在线一区| 国产精品久久久久永久免费观看| 91免费看`日韩一区二区| 午夜电影一区二区三区| 久久这里只有精品视频网| 99在线视频精品| 亚洲成人动漫精品| 精品国产3级a| 97国产一区二区| 老司机免费视频一区二区三区| 久久久久九九视频| 精品视频1区2区| 国产成人av电影在线播放| 一区二区三区欧美日韩| 日韩视频一区二区在线观看| 成人av在线网站| 麻豆久久久久久久| 中文字幕亚洲在| 欧美一卡二卡在线| av一二三不卡影片| 久久精品99国产国产精| 亚洲人123区| 欧美成人一区二区| 91久久奴性调教| 国产成人a级片| 蜜臀va亚洲va欧美va天堂| 国产精品久久久久天堂| 日韩午夜激情av| 日本韩国精品一区二区在线观看| 国产在线一区二区综合免费视频| 樱花草国产18久久久久| 欧美激情中文字幕| 欧美一区二区免费观在线| 色成人在线视频| 成人午夜av电影| 国产成人综合自拍| 久草精品在线观看| 香蕉久久一区二区不卡无毒影院 | 国产成人亚洲精品青草天美| 免费三级欧美电影| 亚洲午夜激情网页| 国产精品情趣视频| 欧美精品一区二区三区在线| 日韩三级视频在线观看| 欧美日韩久久一区二区| 91免费精品国自产拍在线不卡| 成人午夜又粗又硬又大| 国产99久久久精品| 国产精品一区三区| 国产精品一区二区在线观看不卡| 久色婷婷小香蕉久久| 精品在线视频一区| 黄色精品一二区| 精品一区二区三区免费| 久久电影网站中文字幕| 日韩电影在线一区| 另类小说一区二区三区| 久久99九九99精品| 国产丶欧美丶日本不卡视频| 国产福利91精品| caoporen国产精品视频| 91原创在线视频| 欧美日韩一区二区三区高清| 欧美群妇大交群中文字幕| 欧美精品黑人性xxxx| 日韩欧美一区二区视频| 精品少妇一区二区三区免费观看| 精品嫩草影院久久| 欧美高清一级片在线观看| 亚洲欧洲日韩一区二区三区| 亚洲最大色网站| 日韩国产一二三区| 激情综合五月婷婷| www.亚洲国产| 欧美亚日韩国产aⅴ精品中极品| 欧美日韩国产一区| 2014亚洲片线观看视频免费| 中文字幕亚洲精品在线观看| 亚洲 欧美综合在线网络| 麻豆精品国产91久久久久久| 国产一区二区三区av电影| 成人黄色软件下载| 欧美日韩高清一区二区不卡| 精品久久人人做人人爱| 亚洲乱码国产乱码精品精的特点| 亚洲成av人片在www色猫咪| 国产一区二三区| 欧美视频一区在线| 久久久综合精品| 午夜精品一区二区三区电影天堂 | 精品久久久久久久人人人人传媒| 国产人成亚洲第一网站在线播放| 亚洲精品日日夜夜| 国精产品一区一区三区mba视频 | 夜夜嗨av一区二区三区中文字幕| 日产国产高清一区二区三区| 97se狠狠狠综合亚洲狠狠| 欧美电影一区二区三区| 不卡视频一二三四| 国产sm精品调教视频网站| 欧美性猛片aaaaaaa做受| 精品国产一区二区国模嫣然| 夜夜精品视频一区二区|