【问题标题】:How can I insert and delete value in a database in derby in JSP?如何在 JSP 中的 derby 数据库中插入和删除值?
【发布时间】:2017-05-24 13:19:16
【问题描述】:

历史:history

问题是我无法从数据库中删除客户。我可以创建一个新客户,但如果我将字段留空,它会在数据库中创建一个空记录,但我会创建一个 if 标准。

client.java:

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 List clientList(){
    createConnection();
    List list=new ArrayList();
    try {
        Statement stmt=conn.createStatement();
        ResultSet rs=stmt.executeQuery("SELECT * FROM customer");
        while(rs.next()){
            list.add(rs.getString("CNAME"));
            list.add(rs.getString("ADDRESS"));
            list.add(rs.getString("PHONENUMBER"));
        }
        stmt.close();
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
    return list;
}

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

}

index.jsp:

<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">
        <th colspan="2" align="center" style="color: brown">Field</th>
        <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>PhoneNumber:</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"/>
            <input type="submit" name="Cancel" onclick="
               <%
               //nothing
               %>" value="Cancel"/>
            <input type="submit" name="Delete" onclick="
<%client.deleteClient(ID);%>" value="Delete"/>
    </table>
    <table border="2">
        <th colspan="4" align="center" bgcolor="orange">Clients</th>
        <tr bgcolor="silver" align="center">
            <td>&nbsp;</td>
            <td>Name</td>
            <td>Address</td>
            <td>PhoneNumber</td>
        </tr>
        <%
            List list=client.clientList();
            Iterator it=list.iterator();

            while(it.hasNext()){
                out.print("<tr bgcolor='lightgreen'>");
                out.print("<td>");
                NAME=(String)it.next();
                out.print("<input type='radio' name='ID' value="+NAME+"/>");
                out.print("</td>");
                out.print("<td>");
                out.print(NAME);
                out.print("</td>");
                for (int i = 0; i < 2; i++) {
                    out.print("<td>");
                    out.print(it.next());
                    out.print("</td>");
                }
            out.print("</tr>");

            }
        %>
    </table>
</form>  
</body>
</html>

如果我将字段留空并单击“确定”,则会出现以下错误消息: 原因:org.apache.derby.client.am.SqlException:没有实际连接。

如果没有连接如何创建一个空记录?

还有:

Severe:   java.lang.NullPointerException at: client.java PreparedStatement ps=conn.prepareStatement(delete);

编辑 新错误: 严重:java.sql.SQLDataException:INTEGER 的字符串格式无效。

【问题讨论】:

  • 在所有访问数据库的方法中包含 createConnection() 和 closeConnection() 怎么样?
  • 记录插入问题解决了吗?剩下的唯一问题是删除?
  • 大约是的,唯一的问题是删除。和插入的一个小问题我可以插入空记录,而不是看 if(NAME!=null && ADDRESS!=null && PHONENUMBER!=null)
  • @Lobi 首先我们将讨论删除问题。以下在deleteClient 方法中返回什么e.printStackTrace(); 通过编辑您的问题粘贴输出。
  • 我添加了createConnection(),因为我忘记添加了。现在:严重:java.sql.SQLDataException:INTEGER 的字符串格式无效。

标签: java jsp


【解决方案1】:

看起来你没有在列表中设置 ID

while(rs.next()){
        list.add(rs.getString("ID")); // Add this
        list.add(rs.getString("CNAME"));
        list.add(rs.getString("ADDRESS"));
        list.add(rs.getString("PHONENUMBER"));
    }

如果列表中没有 ID,您将无法从 jsp 中访问相同的 ID,并且当您调用 delete 方法时,相同的 ID 将不可用。

另一件事是确保 ID 是 string 而不是 int 。通常我们将密钥(即此处的 ID)保留为整数。

【讨论】:

  • 我试过了,结果:HTTP Status 500 - Internal Server Error exception org.apache.jasper.JasperException: java.util.NoSuchElementException root cause java.util.NoSuchElementException
【解决方案2】:

我从上一个问题中了解到,您将 ID 定义为整数,所以您应该使用 setInt 而不是 setString,试试 as

public void deleteClient(Integer id){

    try {

        createConnection();
        String delete="DELETE FROM CUSTOMER WHERE ID=?";
        PreparedStatement ps=conn.prepareStatement(delete);
        ps.setInt(1, id);
        ps.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        ps.close();
        closeConnection();
    }
}

Id 是您定义的数据库字段中的一个整数,它有一个主键。

更新 1

在您的 index.jsp 中使用以下内容将 String 转换为 int,将 idNum 传递给您的方法。

 Integer idNum = null;
 String id = request.getParameter("ID");
    if(id != null) {
        try {
            System.out.println("String Id value --> "+id.trim());
            idNum = Integer.parseInt(id.trim());
        }
        catch(NumberFormatException ex) {
            ex.printStackTrace();
        }
    }

【讨论】:

  • 我改为:(client.java) public void deleteClient(Integer ID) and ps.setInt(1, ID);和 (index.jsp) 整数 ID=Integer.parseInt(request.getParameter("ID"));将字符串更改为 int。现在:HTTP 状态 500 - 内部服务器错误,org.apache.jasper.JasperException: java.lang.NumberFormatException: null
  • 警告:StandardWrapperValve[jsp]: Servlet.service() for servlet jsp 抛出异常 java.lang.NumberFormatException: null
  • 严重:java.lang.NumberFormatException:null 严重:java.lang.NumberFormatException:对于输入字符串:“Bob/”
  • @Lobi 顺便说一句,“Bob”是一个字符串,你应该使用一个数字作为 ID 列。
  • 我在表中有三列:姓名、地址、电话号码。在每一行的开头都有一个单选按钮。我单击其中一个,然后单击删除按钮。如何添加“ID”列?
猜你喜欢
  • 2017-10-25
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多