2015-11-17 20 views
3

我正在使用帶有Apache Derby數據庫的Java JDBC。
我有一個名爲`company``的表,其值爲:
id,comp_name,password,email。Java JDBC爲數據庫添加自動價值

此方法應該創建一個新行company,其中包含用戶收到的名稱,密碼和電子郵件,但應自動從數據庫中提供ID,並在每次將新公司添加到數據庫時增加自身ID。

我只是無法弄清楚如何使這項工作,我明明得到一個錯誤

「列‘ID’不能接受一個NULL值。」

因爲更新發生在ID設置之前。

代碼:

public void createCompany(Company company) { 
    Connection con = null; 

    try { 
     con = ConnectionPool.getInstance().getConnection(); 
     String sql = "INSERT INTO company (comp_name, password, email) VALUES (?,?,?)"; 
     PreparedStatement pstmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
     pstmt.setString(1, company.getCompName()); 
     pstmt.setString(2, company.getPassword()); 
     pstmt.setString(3, company.getEmail()); 
     pstmt.executeUpdate(); 
     ResultSet rs = pstmt.getGeneratedKeys(); 
     rs.next(); 
     company.setId(rs.getLong(1)); 
     pstmt.getConnection().commit(); 

    } catch (SQLException e) { 

     e.printStackTrace(); 
    } finally { 
     ConnectionPool.getInstance().returnCon(con); 
    } 
+2

您在設置ID之前先進行插入操作。你爲什麼不在你的數據庫中使用自動增量? – Stultuske

+1

是的,自動增量訣竅 –

+0

去自動增量 – jcool

回答

2

你做幾乎的一切權利,你只需要讓數據庫爲每個插入的對象分配一個唯一的ID行:

CREATE TABLE my_table (
    id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    ... 
); 
1

一個問題可能是您通過創建表格而犯了一個錯誤。 你可以創建你的表是這樣的:

CREATE TABLE company 
    (
     ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
     comp_name VARCHAR(50), 
     email VARCHAR(50), 
     password VARCHAR (50) 
    ) 

如果你想其他的值是不爲空,您可以添加NOT NULL到他們的臺詞:

password VARCHAR (50) NOT NULL 

Delte舊錶,並執行上述的sql在你的數據庫上。之後,您可以不加改變地使用您的代碼。