JDBC提供了獲得主鍵的方法..不過你必須支持JDBC2.0
為古丈等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及古丈網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、古丈網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
Statement stmt=conn.createStatement();
stmt.execute(String sql, Statement .RETURN_GENERATED_KEYS )
執(zhí)行給定的 SQL 語句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序所有自動生成的鍵都應(yīng)該可用于檢索。
ResultSet rs=stmt.getGeneratedKeys()//索由于執(zhí)行此 Statement 對象而創(chuàng)建的所有自動生成的鍵
通過RS就可以得到自動生成的主鍵啦..
sql建表語句中直接寫就行了
在java語句中,
String sql="SQL建表語句";
數(shù)據(jù)庫的主鍵主要的功能就是唯一性,以下是我寫的代碼:
package NormalLearn;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 實現(xiàn)主鍵功能,每次生成的字符串唯一性
* @author Administrator
*
*/
public class OrclSeq{
/**
* 流水號=當(dāng)前時間(8位)
* @return
*/
public synchronized String getCurrentValue(){
try {
//保證數(shù)據(jù)的唯一性
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String DateStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
return DateStr;
}
//線程內(nèi)部類
class ThreadClass implements Runnable{
@Override
public void run() {
String seq = getCurrentValue();
System.out.println(seq);
}
}
public static void main(String[] args) {
//模擬多線程測試
OrclSeq seq = new OrclSeq();
for(int i=0;i1000;i++) {
new Thread(seq.new ThreadClass()).start();
}
}
}
關(guān)于是否重復(fù),首先要說一下uuid生成的原理
UUID是指在一臺機器上生成的數(shù)字,它保證對在同一時空中的所有機器都是唯一的
UUID由以下幾部分的組合:
(1)當(dāng)前日期和時間,UUID的第一個部分與時間有關(guān),如果你在生成一個UUID之后,過幾秒又生成一個UUID,則第一個部分不同,其余相同。
(2)時鐘序列。
(3)全局唯一的IEEE機器識別號,如果有網(wǎng)卡,從網(wǎng)卡MAC地址獲得,沒有網(wǎng)卡以其他方式獲得。
通過組成可以看出,首先每臺機器的mac地址是不一樣的,那么如果出現(xiàn)重復(fù),可能是同一時間下生成的id可能相同,不會存在不同時間內(nèi)生成重復(fù)的數(shù)據(jù)
至于說同一時間產(chǎn)生重復(fù)的數(shù)據(jù),就目前來說,是不會的除非極高的高并發(fā)(如果發(fā)生了,也可以通過原子性操作避免),
所以基本上就認為不會重復(fù)好了