为啥我在使用 JDBC 和 MySQL 的 JSP 中出现连接失败错误

Posted

技术标签:

【中文标题】为啥我在使用 JDBC 和 MySQL 的 JSP 中出现连接失败错误【英文标题】:Why am I getting a connection failed error in JSP wit JDBC and MySQL为什么我在使用 JDBC 和 MySQL 的 JSP 中出现连接失败错误 【发布时间】:2019-12-02 16:11:31 【问题描述】:

我正在尝试连接到 mysql 数据库并执行查询

但加载时数据库连接失败。

密码和用户ID都正确。

我在 netbeans 上没有任何错误。

这是我的代码

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>

<%@ page import="java.sql.*" %>

<% Class.forName("com.mysql.jdbc.Driver"); %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Real Time Stock Price Quote</h1>

        <form action="" method="get">

            <p>Search:</p> 
            <input type="text" name="q" placeholder='search here'><br>
            <input type="submit" value="Submit" ><br>

        </form>

        <%
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

            try
                Class.forName("com.mysql.jdbc.Driver");
                conn = (Connection)DriverManager.getConnection("jdbc:mysql://localhost:3306/stocklist","root","");
                st = conn.createStatement();

                String qry = request.getParameter("q");

                String data;


                qry= "SELECT * FROM `stocks` WHERE `name` LIKE '%qry%'";


                rs = st.executeQuery(qry);


                 if(!conn.isClosed())
                     %>

                     <P>connected DB  </P>
                     <%= qry %> 

                     <%
                 

                %>

                <p> <% rs.getString("symbol"); %> </p>

                <%
            catch(Exception e)

                    %>
                    <h2>Error! Database Connection Failed!!</h2>

                    <%

                    

                    %>
    </body>
</html>


这是我得到的输出:

实时股票报价 搜索:

在这里搜索

连接的数据库

SELECT * FROM stocks WHERE name LIKE '%qry%' 错误!数据库连接失败!!

为什么会连接然后失败?

【问题讨论】:

好的,所以我从 e.getMessage() 收到了一条打印消息。它说对空结果集进行了非法操作。这是有道理的。我认为查询正在执行而无需我按下按钮。 【参考方案1】:

异常包含 4 个有用的信息:堆栈跟踪、消息、类型和原因。

你扔掉了所有 4 件事,并用“失败!”替换它。

“不要那样做”的经典案例。

让异常发生;然后,您的日志将包含所有这些信息供您查看。从那里您可能会找出问题所在。

如果没有这些信息,没有你的开发机器的完整克隆,没有人可以在这里提供帮助。

【讨论】:

那么如何获取eception消息和stacktrace 我收到错误信息,对空结果集的非法操作 @Vinnie 不,不要那样做。然后你仍然扔掉 4 样东西中的 3 样!永远不要那样做! @jshariar 只是不要抓住它,然后日志将显示所有信息。如果不允许,请在方法签名中添加“throws”子句。如果这也不允许,您的最终后备是throw new RuntimeException(e);这总是被允许的。【参考方案2】:

使用 try-with-resource 自动关闭 Connection、(Prepared)Statement 和 ResultSet。它的语法有点奇怪:try(DECLARATIONS) ....。它的优点是它还关闭异常和返回/中断等。

那么q参数一定要填写。

Always use a PreparedStatement:SQL 注入。

让例外尽显其荣耀。

` 是在 HTML 中插入表达式。

您的错误可能是表中没有类似“qry”的内容,并且没有调用 rs.next() 来读取第一条/下一条记录。

    <%
        String q = request.getParameter("q");
        String sql = "SELECT * FROM `stocks` WHERE `name` LIKE ?";

        try (Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/stocklist", "root", "");
                PreparedStatement st = conn.prepareStatement(sql)) 
            st.setString(1, "%" + q + "%");

            try (ResultSet rs = st.executeQuery()) 
                while (rs.next()) 
                    %>
                    <p> <%= rs.getString("symbol") %> </p>
                    <%
                
            
        

     %>

【讨论】:

以上是关于为啥我在使用 JDBC 和 MySQL 的 JSP 中出现连接失败错误的主要内容,如果未能解决你的问题,请参考以下文章

Class.forName(“com.mysql.jdbc.Driver”)错误jsp [重复]

jsp页面中怎么导入jdbc连接mysql

在JSP中使用jdbc操作数据库

Class.forName(“com.mysql.jdbc.Driver”)错误jsp [重复]

使用JSP将Mysql与IntelliJ Ultimate 2016.2.3连接[重复]

使用jdbc连接mysql为啥报错?