- 數據表設計時,一般都會有一個主鍵(Key)(自己指定),有時也可以使用聯合主鍵;
- 有許多數據庫提供了隱藏列為表中的每行記錄分配一個唯一鍵值(如:rowid);
- 當我們沒有指定哪一列作為主鍵key時,數據表可能會含有一個隱含的主鍵(或者叫唯一鍵值);
當我們向數據表中插入數據時,對於每一條記錄,都會有一個主鍵與之對應,那么我們如何在向數據表中插入數據時,獲取到數據庫自動分配的主鍵呢?
如下給出示例:
上面使用到了PreparedStatement來執行SQL插入,關於
PreparedStatement與Statement的用法與區別,可以參考文章:
這里不多介紹;
只需要大體知道一些:
- PreparedStatement可以寫參數化查詢,比Statement能獲得更好的性能;
- 對於PreparedStatement來說,數據庫可以使用已經編譯過及定義好的執行計划,這種預處理語句查詢比普通的查詢運行速度更快。
- PreparedStatement可以防止SQL注入式攻擊;
- PreparedStatement可以寫動態查詢語句;
- PreparedStatement與java.sql.Connection對象是關聯的,一旦你關閉了connection,PreparedStatement也沒法使用了。
- PreparedStatement查詢默認返回FORWARD_ONLY的ResultSet,你只能往一個方向移動結果集的游標。當然你還可以設定為其他類型的值如:”CONCUR_READ_ONLY”。
- 占位符的索引位置從1開始而不是0,如果填入0會導致*java.sql.SQLException invalid column index*異常。所以如果PreparedStatement有兩個占位符,那么第一個參數的索引時1,第二個參數的索引是2.
KeyHolder是一個接口,下面是它的代碼:
Generated
KeyHolder是
KeyHolder接口的默認實現類,他的函數作用如下:
當執行insert語句時,會自動將數據庫自動產生的key值保存在
Generated
KeyHolder對象對象中,如下是jdbcTemplete.update()的源碼:
