我正在使用带有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);
}
答案 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。之后,您可以使用您的代码而无需更改。