5.1 關(guān)系數(shù)據(jù)庫按主鍵區(qū)分不同的記錄
主鍵的特點(diǎn):
1、不允許為null;
2、每條記錄具有唯一的主鍵值,不允許主鍵值重復(fù);
3、每條記錄的主鍵值永遠(yuǎn)不會改變。
設(shè)置主鍵的方式:
5.1.1 把主鍵定義為自動增長標(biāo)識符類型
在MySQL中,如果把表的主鍵設(shè)為 auto_increment 類型,數(shù)據(jù)庫就會自動為主鍵賦值。
例如:
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ù)庫就會自動為主鍵賦值:
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)中獲取自動增長的 標(biāo)識符
在Oracle中,可以為每張表的主鍵創(chuàng)建一個(gè)單獨(dú)的序列,然后從這個(gè)序列中獲得自動增加的標(biāo)識符,把它賦值給主鍵。
例如以下語句創(chuàng)建了一個(gè)名為 CUSTOMERS_ID_SEQ的序列,這個(gè)序列的起始值為1,增量為2:
CREATE SEQUENCE CUSTOMERS_ID_SEQ INCREMENT BY 2 START WITH 1;
一旦定義了 CUSTOMERS_ID_SEQ 序列,就可以訪問序列的 curval 和 nextval 屬性。
curval:返回序列的當(dāng)前值。
nextval:先增加序列的值,然后返回序列值。
以下SQL語句先創(chuàng)建了CUSTOMERS表,然后插入兩條記錄,在插入時(shí)設(shè)定了ID和NAME字段的值,其中ID字段的值來自于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語句,查詢結(jié)果:
ID
1
3
5.2 Java語言按內(nèi)存地址區(qū)分不同的對象
在Java語言中,判斷兩個(gè)對象引用變量是否相等,有以下兩種比較方式:
(1)比較兩個(gè)變量所引用的對象的內(nèi)存地址是否相同,“==”運(yùn)算符就是比較的內(nèi)存地址。此外,在Object類中定義的equals(Object o)方法,也是按內(nèi)存地址來比較的。如果用戶自定義的類沒有覆蓋Object類的equals(Object o)方法,也按內(nèi)存地址比較。
例如,以下代碼用new語句共創(chuàng)建了兩個(gè)Customer對象,并定義了三個(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行的對象圖。

從圖5-1和圖5-2看出,c1和c3變量引用同一個(gè)Customer對象而c2變量引用了而c2變量引用另一個(gè)Customer對象。因此,表達(dá)式"c1==c3"以及c1.equals(c3)的值都是true,而表達(dá)式"c1==c2"以及c1.equals(c2)的值是false。
(2)比較兩個(gè)變量所引用的對象的值是否相同,Java API中的一些類覆蓋了Object類的equals(Object o)方法,實(shí)現(xiàn)按對象值比較。
String類和Date類
Java包裝類,包括:Byte、Integer、Short、Character、Long、Float、Doubl和Boolean。
例如:
String s1 = new String("hello");
String s2 = new String("hello");
盡管s1和s2引用不同的String對象,但是它們的字符串值都是“hello”,因此表達(dá)式“s1==s2的值是false,而表達(dá)式s1.equals(s2)的值是true。
用戶自定義的類也可以覆蓋Object類的equals(Object o)方法,從而實(shí)現(xiàn)按對象值比較。例如,在Customer類中添加如下equals(Object o)方法,使它按客戶的姓名來比較兩個(gè)Customer對象是否相等:
public boolean equals(Object o) {
if(this==o){
return true;
}
if(!o instanceof Customer) {
return false;
}
final Customer other = (Customer)o;
if(this.getName().equals(other.getName())){
return true;
}else{
return false;
}
}
以下代碼用new語句共創(chuàng)建了兩個(gè)Customer對象,并定義了兩個(gè)Customer類型的引用變量c1和c2:
Customer c1 = new Customer("Tom");
Customer c2 = new Customer("Tom");
盡管c1和c2引用不同的Customer對象,但是它們的name值都是“Tom”,因此表達(dá)式“c1==c2的值是false,而表達(dá)式c1.equals(c2)的值是true。
posted on 2007-08-13 22:38
CoderDream 閱讀(391)
評論(1) 編輯 收藏 所屬分類:
精通Hibernate