從制造到創(chuàng)造
          軟件工程師成長(zhǎng)之路
          posts - 292,  comments - 96,  trackbacks - 0

          5.1 關(guān)系數(shù)據(jù)庫(kù)按主鍵區(qū)分不同的記錄

          主鍵的特點(diǎn):
             1、不允許為null;
             2、每條記錄具有唯一的主鍵值,不允許主鍵值重復(fù);
             3、每條記錄的主鍵值永遠(yuǎn)不會(huì)改變。

          設(shè)置主鍵的方式:

          5.1.1 把主鍵定義為自動(dòng)增長(zhǎng)標(biāo)識(shí)符類型

             在MySQL中,如果把表的主鍵設(shè)為 auto_increment 類型,數(shù)據(jù)庫(kù)就會(huì)自動(dòng)為主鍵賦值。
             例如:
             
          CREATE TABLE CUSTOMERS(
          ID 
          int auto_increment primary key not null,
          NAME 
          varchar(15));

          INSERT INTO CUSTOMERS(NAME) VALUES("name1");
          INSERT INTO CUSTOMERS(NAME) VALUES("name2");

          SELECT ID FROM CUSTOMERS;

          查詢結(jié)果:
          ID
          1
          2

          在MS SQL Server中,如果把表的主鍵設(shè)為 identity 類型,數(shù)據(jù)庫(kù)就會(huì)自動(dòng)為主鍵賦值:

          CREATE TABLE CUSTOMERS(
          ID 
          int identity(1,1) primary key not null,
          NAME 
          varchar(15));

          INSERT INTO CUSTOMERS(NAME) VALUES("name1");
          INSERT INTO CUSTOMERS(NAME) VALUES("name2");

          SELECT ID FROM CUSTOMERS;

          查詢結(jié)果:

          ID
          1
          2

          5.1.2 從序列(Sequence)中獲取自動(dòng)增長(zhǎng)的 標(biāo)識(shí)符


          在Oracle中,可以為每張表的主鍵創(chuàng)建一個(gè)單獨(dú)的序列,然后從這個(gè)序列中獲得自動(dòng)增加的標(biāo)識(shí)符,把它賦值給主鍵。

          例如以下語(yǔ)句創(chuàng)建了一個(gè)名為 CUSTOMERS_ID_SEQ的序列,這個(gè)序列的起始值為1,增量為2:

          CREATE SEQUENCE CUSTOMERS_ID_SEQ INCREMENT BY 2 START WITH 1;

          一旦定義了 CUSTOMERS_ID_SEQ 序列,就可以訪問(wèn)序列的 curval 和 nextval 屬性。

          curval:返回序列的當(dāng)前值。
          nextval:先增加序列的值,然后返回序列值。

          以下SQL語(yǔ)句先創(chuàng)建了CUSTOMERS表,然后插入兩條記錄,在插入時(shí)設(shè)定了ID和NAME字段的值,其中ID字段的值來(lái)自于CUSTOMERS_ID_SEQ序列。最后查詢CUSTOMERS表中的ID字段。

          CREATE TABLE CUSTOMERS(
          ID 
          int primary key not null,
          NAME 
          varchar(15));

          INSERT INTO CUSTOMERS VALUES(CUSTOMERS_ID_SEQ.curval, 'Tom');
          INSERT INTO CUSTOMERS VALUES(CUSTOMERS_ID_SEQ.nextval, 'Mike');

          SELECT ID FROM CUSTOMERS;

          如果在Oracle中執(zhí)行以上SQL語(yǔ)句,查詢結(jié)果:

          ID
          1
          3

          5.2 Java語(yǔ)言按內(nèi)存地址區(qū)分不同的對(duì)象

          在Java語(yǔ)言中,判斷兩個(gè)對(duì)象引用變量是否相等,有以下兩種比較方式:
          (1)比較兩個(gè)變量所引用的對(duì)象的內(nèi)存地址是否相同,“==”運(yùn)算符就是比較的內(nèi)存地址。此外,在Object類中定義的equals(Object o)方法,也是按內(nèi)存地址來(lái)比較的。如果用戶自定義的類沒(méi)有覆蓋Object類的equals(Object o)方法,也按內(nèi)存地址比較。

          例如,以下代碼用new語(yǔ)句共創(chuàng)建了兩個(gè)Customer對(duì)象,并定義了三個(gè)Customer類型的引用變量c1、c2和c3:

          Customer c1 = new Customer("Tom");//line1
          Customer c2 = new Customer("Tom");//line2
          Customer c3 = c1;//line3
          c3.setName("Mike");//line4


             圖5-1和圖5-2顯示了程序執(zhí)行到第3行及第4行的對(duì)象圖。


             從圖5-1和圖5-2看出,c1和c3變量引用同一個(gè)Customer對(duì)象而c2變量引用了而c2變量引用另一個(gè)Customer對(duì)象。因此,表達(dá)式"c1==c3"以及c1.equals(c3)的值都是true,而表達(dá)式"c1==c2"以及c1.equals(c2)的值是false。

          (2)比較兩個(gè)變量所引用的對(duì)象的值是否相同,Java API中的一些類覆蓋了Object類的equals(Object o)方法,實(shí)現(xiàn)按對(duì)象值比較。
          String類和Date類
          Java包裝類,包括:Byte、Integer、Short、Character、Long、Float、Doubl和Boolean。
          例如:

          String s1 = new String("hello");
          String s2 
          = new String("hello");


          盡管s1和s2引用不同的String對(duì)象,但是它們的字符串值都是“hello”,因此表達(dá)式“s1==s2的值是false,而表達(dá)式s1.equals(s2)的值是true。

          用戶自定義的類也可以覆蓋Object類的equals(Object o)方法,從而實(shí)現(xiàn)按對(duì)象值比較。例如,在Customer類中添加如下equals(Object o)方法,使它按客戶的姓名來(lái)比較兩個(gè)Customer對(duì)象是否相等:

          public boolean equals(Object o) {
           
          if(this==o){
            
          return true;
           }

           
          if(!instanceof Customer) {
            
          return false;
           }

           
          final Customer other = (Customer)o;

           
          if(this.getName().equals(other.getName())){
            
          return true;
           }
          else{
            
          return false;
           }
          }


          以下代碼用new語(yǔ)句共創(chuàng)建了兩個(gè)Customer對(duì)象,并定義了兩個(gè)Customer類型的引用變量c1和c2:

          Customer c1 = new Customer("Tom");
          Customer c2 
          = new Customer("Tom");


          盡管c1和c2引用不同的Customer對(duì)象,但是它們的name值都是“Tom”,因此表達(dá)式“c1==c2的值是false,而表達(dá)式c1.equals(c2)的值是true。
             

          posted on 2007-08-13 22:38 CoderDream 閱讀(395) 評(píng)論(1)  編輯  收藏 所屬分類: 精通Hibernate

          FeedBack:
          # re: [讀書筆記](méi)第5章 映射對(duì)象標(biāo)識(shí)符
          2007-10-05 22:49 | 朱智武
          CREATE SEQUENCE CUSTOMERS_ID_SEQ INCREMENT BY 1 START WITH 1;  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(9)

          我參與的團(tuán)隊(duì)

          隨筆分類(245)

          隨筆檔案(239)

          文章分類(3)

          文章檔案(3)

          收藏夾(576)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 458373
          • 排名 - 114

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 大竹县| 武清区| 封开县| 麦盖提县| 札达县| 柏乡县| 扎赉特旗| 邓州市| 卢氏县| 县级市| 宝清县| 信宜市| 临高县| 甘德县| 南木林县| 周至县| 桃源县| 威海市| 溧阳市| 齐齐哈尔市| 鄂州市| 习水县| 会昌县| 肇州县| 江油市| 湄潭县| 巴林右旗| 彝良县| 庆元县| 都匀市| 通河县| 渝中区| 武川县| 汝南县| 兴城市| 汉中市| 同仁县| 马关县| 嘉禾县| 怀宁县| 洛阳市|