带有 JSP 的 JDBC 无法插入

Posted

技术标签:

【中文标题】带有 JSP 的 JDBC 无法插入【英文标题】:JDBC with JSP fails to insert 【发布时间】:2012-08-17 02:14:41 【问题描述】:

我现在在使用 JSP 中的 JDBC 时遇到了一些问题。我正在尝试将用户名/传递 ext 插入我的 mysql 数据库。我没有收到任何错误或异常,但是也没有将任何内容插入到我的数据库中。以下是我的代码,任何帮助将不胜感激。

<%
String uname=request.getParameter("userName");
String pword=request.getParameter("passWord");
String fname=request.getParameter("firstName");
String lname=request.getParameter("lastName");
String email=request.getParameter("emailAddress");
%>


<%
try
    String dbURL = "jdbc:mysql:localhost:3306/assi1";
    String user = "root";
    String pwd = "password";
    String driver = "com.mysql.jdbc.Driver";

    String query = "USE Users"+"INSERT INTO User (UserName, UserPass, FirstName, LastName, EmailAddress) " +
                   "VALUES ('"+uname+"','"+pword+"','"+fname+"','"+lname+"','"+email+"')";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(dbURL, user, pwd);
    Statement statement = conn.createStatement();
    statement.executeUpdate(query);

    out.println("Data is successfully inserted!");
    
    catch(SQLException e)
    for (Throwable t : e)
        t.printStackTrace();
    
       %>

这里的数据库脚本:

CREATE DATABASE Users;

use Users;

CREATE TABLE User (
UserID INT NOT NULL AUTO_INCREMENT,
UserName VARCHAR(20),
UserPass VARCHAR(20),
FirstName VARCHAR(30),
LastName VARCHAR(35),
EmailAddress VARCHAR(50),
PRIMARY KEY (UserID)
);

【问题讨论】:

什么异常?也许是 ClassNotFoundException? 虽然可以进行很多改进,但我认为问题是“使用用户”+“插入...”。最终将转换为“USE UsersINSERT INTO ...”,这是无效的 SQL ...我认为您的异常堆栈跟踪将进入系统 @Pangea:他甚至无法连接,因为他的连接 URL 错误。 StryleR,当您提出问题时,请尝试暴露您所有的问题(抛出的异常等) 始终使用PreparedStatement 来防止SQL 注入,并始终使用avoid 使用scriptlet。将 scriptlet 代码移至 Java 类,以通过遵循最佳实践来降低 JSP 的复杂性。 @Lion:我认为他开始学习如何用 Java 开发 Web 应用程序。我不喜欢教不正确的做事方式和纠正后的方式,但有些老师喜欢这种方法。我希望他的老师能尽快教授这些更好的做法。 【参考方案1】:

首先,您不需要在 SQL 中使用USE 语句,因为已经在连接 URL 中选择了数据库。即使您使用USE 语句,也不应将其粘在INSERT 语句上。因此,在您的 dbURL 中,您需要设置适当的 db:

String dbURL = "jdbc:mysql://localhost:3306/Users";

请注意,您的网址也是错误的。在第二个冒号字符之后需要两个斜线。您需要将查询变量更改为:

String query = "INSERT INTO User (UserName, UserPass, FirstName, LastName, EmailAddress) " + 
               "VALUES ('"+uname+"','"+pword+"','"+fname+"','"+lname+"','"+email+"')";

我希望您的代码处于这种状态,因为您开始学习 Java Web 开发(我看到了 homework 标签)。在现实世界中,这不是开发 Java Web 应用程序的方式,因为 scriptlet(&lt;%%&gt; 之间的代码以及其他变体)不再使用,并且许多其他事情需要改进,作为方式你正在处理 JDBC。

编辑:这是您的固定代码:

<%
    Connection conn = null;

    try 

        String uname=request.getParameter("userName");
        String pword=request.getParameter("passWord");
        String fname=request.getParameter("firstName");
        String lname=request.getParameter("lastName");
        String email=request.getParameter("emailAddress");

        String dbURL = "jdbc:mysql://localhost:3306/Users";
        String user = "root";
        String pwd = "password";
        String driver = "com.mysql.jdbc.Driver";

        String query = "INSERT INTO User (UserName, UserPass, FirstName, LastName, EmailAddress) " +
                       "VALUES ('"+uname+"','"+pword+"','"+fname+"','"+lname+"','"+email+"')";
        Class.forName(driver);
        conn = DriverManager.getConnection(dbURL, user, pwd);
        Statement statement = conn.createStatement();
        statement.executeUpdate(query);
        statement.close();

        out.println("Data is successfully inserted!");

     catch( ClassNotFoundException e )
        System.err.println( "Database Driver class not Found!" );
        e.printStackTrace();
     catch( SQLException e )
        e.printStackTrace();
     finnaly 
        try 
            if ( conn != null ) 
                conn.close();
            
         catch ( SQLException e ) 
            System.err.println( "Problems when closing connection" );
            e.printStackTrace();
        
    
%>

我认为这会奏效。正如 Lion 所说,考虑在您的数据库代码中使用更好的解决方案。我想你的老师很快就会教这些其他的东西。

【讨论】:

感谢大家的建议。我做了你提到大卫的改变,但它仍然不起作用。我也不知道 scriplets 已经过时了,这就是他们教给我们的。 @StrykeR:正如我已经问过的,错误是什么?我在你的代码中也看到了一些 sintax 错误......我正在重写它。 我会试一试该代码,谢谢。现在我可能离这里很远,但从书中的一些内容来看,我已经向前看了。我可以将我拥有的 html 输入到 jsp 中,然后将信息传递到插入数据库的 servlet 中吗?这难道不是比使用 jsp 连接更好的方法吗? 是的,你可以,这是一种更好的方法。 JSP 应该用于显示某些内容,而不是用于处理。它们是应用程序的“视图”,而不是模型或控制器,甚至应该包含业务逻辑。 不客气!看看我所做的修改,看看出了什么问题,并尝试理解错误消息(你没有发布);)

以上是关于带有 JSP 的 JDBC 无法插入的主要内容,如果未能解决你的问题,请参考以下文章

无法在 jsp 文件中建立 jdbc 连接

无法使用jsp将数据插入mysql

Spring JDBC 无法插入

无法插入数据库jsp

无法解析 oracle.jdbc.OracleDriver

JDBC插入数据超长时无法自动截断问题