如何在JSP中将值插入数据库到derby?

我在JSP中创建了一个表单,用于在德比中将数据插入数据库,但它不起作用。

数据库名称为CUSTOMER。 表格:

ID (int), CNAME (varchar), ADDRESS (varchar), PHONENUMBER (varchar) 

client.jsp的内容:

       JSP Page    
<input type="submit" name="OK" onclick=" " value="OK"/>
Name
Address
TelNumber

client.java的内容。

 package database; public class Client implements DatabaseConnection{ private static Connection conn = null; private static void createConnection(){ try { conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch (SQLException ex) { Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex); } } private static void closeConnection(){ if (conn != null){ try { conn.close(); } catch (SQLException ex) { Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex); } } } public void newClient(String name, String address, String phoneNumber){ try { createConnection(); String insert="INSERT INTO CUSTOMER(CNAME,ADDRESS, PHONENUMBER) VALUES(?,?,?)"; PreparedStatement ps=conn.prepareStatement(insert); ps.setString(2, name); ps.setString(3, address); ps.setString(4, phoneNumber); ps.executeUpdate(); ps.close(); } catch (Exception e) { } } } 

databaseConnection的内容。

 package database; public interface DatabaseConnection{ String URL="jdbc:derby://localhost:1527/Test"; String USER="myusername"; String PASSWORD="mypassword"; } 

编辑

错误消息:

 Caused by: org.apache.derby.client.am.SqlException: Column position '4' is outside the allowed range. The columns of ResultSet are '3'. Org.apache.derby.client.am.ColumnMetaData.checkForValidColumnIndex (unknown source) 

EDIT2

 public void deleteClient(String ID){ try { String delete="DELETE FROM CUSTOMER WHERE ID=?"; PreparedStatement ps=conn.prepareStatement(delete); ps.setString(1, ID); ps.executeUpdate(); } catch (Exception e) { } } 

您的preparedStatement索引应该从1开始,而不是从2开始,所以请尝试

 public void newClient(String name, String address, String phoneNumber){ PreparedStatement ps = null; try { createConnection(); String insert="INSERT INTO CUSTOMER(ID,CNAME,ADDRESS, PHONENUMBER) VALUES(?,?,?,?)"; ps=conn.prepareStatement(insert); ps.setString(1, name); ps.setString(2, address); ps.setString(3, phoneNumber); ps.executeUpdate(); } catch (Exception ex) { ex.printStackTrace(); } finally { ps.close(); closeConnection(); } } 

PreparedStatement或Connection close方法应该在try catch finally块的finally部分。

closeConnection()方法类似,您可以创建另一个方法来关闭preparedStatement并在finally块中调用它。

更新1

如果您在Java中捕获Id,请尝试

 public void newClient(Integer id, String name, String address, String phoneNumber){ PreparedStatement ps = null; try { createConnection(); String insert="INSERT INTO CUSTOMER(CNAME,ADDRESS, PHONENUMBER) VALUES(?,?,?)"; ps=conn.prepareStatement(insert); ps.setInt(1, id) ps.setString(2, name); ps.setString(3, address); ps.setString(4, phoneNumber); ps.executeUpdate(); } catch (Exception ex) { ex.printStackTrace(); } finally { ps.close(); closeConnection(); } } 

并在JSP中,修改为

 if(ID!=null && NAME!=null && ADDRESS!=null && PHONENUMBER!=null){ client.newClient(ID, NAME, ADDRESS, PHONENUMBER); }