Java JDBC将自动值添加到数据库

时间:2015-11-17 12:45:41

标签: java jdbc

我正在使用带有Apache Derby数据库的Java JDBC 我有一个名为`company``的表,其值为:
id,comp_name,密码,电子邮件。

此方法应创建一个新的company行,其中包含从用户收到的名称,密码和电子邮件,但应从数据库中自动提供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);
    }

3 个答案:

答案 0 :(得分:2)

在创建该表期间,您必须编写以下DDL

CREATE TABLE MAPS
(
comp_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
comp_name VARCHAR(24) NOT NULL,
password VARCHAR(26)
)

参考:https://db.apache.org/derby/docs/10.0/manuals/develop/develop132.html

答案 1 :(得分:2)

您几乎几乎一切正常,您只需要让数据库为每个插入的行分配一个唯一的ID:

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

答案 2 :(得分:1)

问题可能是您通过创建表格而犯了错误。 您可以像这样创建表格:

<h:form id="main">
<p:messages id="msgs" />
<p:dialog header="Dialog 1" >

        <p:panelGrid columns="2" id="PG1" >
            <p:outputLabel value="Name" for="name" />
            <p:inputText required="true" id="name" value="#{myBean.name}" />

            <p:outputLabel value="Age" for="age"/>
            <p:inputText required="true" id="age" value="#{myBean.age}" />
        </p:panelGrid>
        <p:commandButton value="Add1" ajax="false" validateClient="true" actionListener="#{myBean.Add1}"/>
        <p:commandButton ajax="true" value="Open PG2" onclick="PG2.show()" immediate="true" />

</p:dialog>
<p:dialog header="Dialog 2" >

        <p:panelGrid columns="2" id="PG2" >
            <p:outputLabel value="House" for="house" />
            <p:inputText required="true" id="house" value="#{myBean.house}" />

            <p:outputLabel value="Street" for="street"/>
            <p:inputText required="true" id="street" value="#{myBean.street}" />
        </p:panelGrid>
        <p:commandButton value="Add2" ajax="false" validateClient="true" actionListener="#{myBean.Add2}"/>

</p:dialog>

</h:form>

如果您希望其他值不为NULL,则可以将 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

删除旧表并在数据库上执行上面的SQl。之后,您可以使用您的代码而无需更改。

相关问题