【问题标题】:How can I insert value to a database to derby in JSP?如何在 JSP 中将值插入数据库以进行 derby?
【发布时间】:2017-10-24 07:07:37
【问题描述】:

我在 JSP 中创建了一个表单来将数据插入到 derby 中的数据库中,但它不起作用。

数据库名称是 CUSTOMER。表格:

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

client.jsp的内容:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="client" class="database.client" scope="page" />
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body bgcolor="lightgrey">
    <%
        String ID=request.getParameter("ID");
        String NAME=request.getParameter("CNAME");
        String ADDRESS=request.getParameter("ADDRESS");
        String PHONENUMBER=request.getParameter("PHONENUMBER");
    %>
    <form method="post" action="">
    <table border="0" align="left">
        <tr>
            <td>Name</td>
            <td><input type="text" name="CNAME" style="background-color:beige"/></td>
        </tr>
        <tr>
            <td>Address</td>
            <td><input type="text" name="ADDRESS" style="background-color:beige"/></td>
        </tr>
        <tr>
            <td>TelNumber</td>
            <td><input type="text" name="PHONENUMBER" style="background-color:beige"/></td>
        </tr>
            <input type="submit" name="OK" onclick="
                <%
               if(NAME!=null && ADDRESS!=null && PHONENUMBER!=null){
                    client.newClient(NAME, ADDRESS, PHONENUMBER);
                }
                %>" value="OK"/>
    </table>
</form>  
</body>

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) {
    }
}

【问题讨论】:

  • 您遇到的错误是什么
  • 我想我没有收到任何错误。 jsp页面刷新,但数据库中没有新数据。
  • 你记录了吗,它甚至调用了那个保存函数吗?
  • 美元对甜甜圈有一个异常被抛出 newClientcatch (Exception e) { } 完全吞噬。 // 咆哮开始 不要在catch 子句中放入空块!永远! // 结束咆哮 请至少输入e.printStackTrace(System.err);,这样当坏事发生时你就有线索了!
  • 您应该使用Servlet接受表单提交并调用newClient并将jsp页面返回给客户端。示例o7planning.org/en/10285/…

标签: java jsp derby


【解决方案1】:

你的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 关闭方法应该在 try catch finally 块的 finally 部分。

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

更新 1

如果你在 Java 中捕获 Id,那么尝试 as

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);
                }

【讨论】:

  • 我试过了。现在的错误信息是: Caused by: org.apache.derby.client.am.SqlException: The column 'ID' can not accept NULL.
  • 客户表中是否有id列?
  • @Lobi 表示数据库表中ID列是NOT NULL。因此,如果您从 Java 代码中填充,您也应该传递 ID。
  • 我该怎么做?
  • @Lobi 你可以将该列声明为自动增量binarytides.com/…
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 2020-08-29
  • 1970-01-01
  • 2011-10-09
  • 2021-04-05
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多