【问题标题】:Connection with mysql with netbeans for jsp [duplicate]使用 jsp 的 netbeans 与 mysql 连接 [重复]
【发布时间】:2013-04-18 09:17:01
【问题描述】:

我正在为 JSP/servlet 使用 NetBeans 7.0.1 IDE 我正在尝试为我的项目建立数据库连接。已经下载了 jar 文件 'mysql-connector-java-5.1.24-bin.jar' 并将其粘贴到 jdk 的 jre/lib 目录中,并将其添加到我的 netbean 项目库目录中。 然后我创建了一个servlet并编写了以下代码:

import java.sql.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class tstJDBC extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    try{
    String dbURL = "jdbc:mysql://localhost:3306/murach";

         String username="root";
         String password="1234";

         Connection con2 = DriverManager.getConnection(dbURL, username, password);
          String query = "insert into tblUser1(firstname) values('shaon')";

          Statement statmnt = con2.createStatement();
          statmnt.executeUpdate(query);
    }

    catch(SQLException e)
    {
        e.printStackTrace();
    }
}

}

但它可以建立连接。从 Connection con2 行,它直接进入 catch() 块;不执行查询。

【问题讨论】:

  • 请发布您捕获的异常堆栈跟踪
  • 您在获得连接之前缺少Class.forName("com.mysql.jdbc.Driver");

标签: mysql jsp servlets


【解决方案1】:

在使用 DriverManager 类之前尝试加载驱动程序。

try{
     String dbURL = "jdbc:mysql://localhost:3306/murach";

     String username="root";
     String password="1234";


     Class.forName("com.mysql.jdbc.Driver");//load driver

     Connection con2 = DriverManager.getConnection(dbURL, username, password);
     String query = "insert into tblUser1(firstname) values('shaon')";

     Statement statmnt = con2.createStatement();
     statmnt.executeUpdate(query);
}

来自 O'Reilly:

在您可以使用驱动程序之前,必须向 JDBC 注册它 驱动管理器。这通常通过加载驱动程序类来完成 使用 Class.forName() 方法:

这是必需的,因为您已将库放在 JDK/lib 文件夹中,我假设该文件夹是使用与您的应用程序使用的 ClassLoader 不同的 ClassLoader 加载的。由于使用了不同的类加载器,由 JDBC 4.0+ 驱动程序进行的自动注册将不会生效。您可以尝试将驱动程序 jar 文件放在应用程序服务器的 lib 中,它应该使用与应用程序相同的 ClassLoader。见:When is Class.forName needed when connecting to a database via JDBC in a web app?

关于自动注册

在 JDBC 4.0 中,我们不再需要使用显式加载 JDBC 驱动程序 类.forName()。当调用 getConnection 方法时, DriverManager 将尝试从 初始化时加载的 JDBC 驱动程序和已加载的 JDBC 驱动程序 显式使用与当前应用程序相同的类加载器。

DriverManager 方法 getConnection 和 getDrivers 已经 增强以支持 Java SE 服务提供者机制 (SPM)。 根据 SPM,服务被定义为一组众所周知的 接口和抽象类,服务提供者是特定的 服务的实施。它还指定服务 提供者配置文件存储在 META-INF/services 目录。 JDBC 4.0 驱动程序必须包含该文件 META-INF/services/java.sql.Driver。该文件包含 JDBC 驱动程序对 java.sql.Driver 的实现。例如,要加载 连接到 Apache Derby 数据库的 JDBC 驱动程序, META-INF/services/java.sql.Driver 文件将包含以下内容 条目:

org.apache.derby.jdbc.EmbeddedDriver

让我们快速了解一下如何使用这个新功能来加载 JDBC 驱动程序管理器。以下清单显示了示例代码 我们通常用来加载 JDBC 驱动程序。假设我们需要 连接到 Apache Derby 数据库,因为我们将在 本文稍后解释的示例应用程序:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn =
    DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);

但是在 JDBC 4.0 中,我们不需要 Class.forName() 行。我们可以简单地 调用 getConnection() 获取数据库连接。

Source

关于服务加载器

为了加载的目的,服务由单个 类型,即单个接口或抽象类。 (一个具体的类 可以使用,但不建议这样做。)给定的提供者 服务包含一个或多个扩展此服务的具体类 键入特定于提供者的数据和代码。提供者类 通常不是整个提供商本身,而是一个代理 包含足够的信息来决定提供者是否能够 满足特定请求以及可以创建 实际供应商按需提供。提供者类的细节往往是 高度服务特定;没有单一的类或接口可能 统一它们,所以这里没有定义这样的类型。唯一的要求 这个工具强制执行的是提供者类必须有一个 零参数构造函数,以便它们可以在 正在加载。

通过放置 provider-configuration 来标识服务提供者 资源目录 META-INF/services 中的文件。文件名是 服务类型的完全限定二进制名称。文件 包含具体提供者的完全限定二进制名称列表 类,每行一个。每个名称周围的空格和制表符, 以及空白行,都将被忽略。注释字符是'#' ('\u0023', 数字符号);在每一行上的所有字符 第一个注释字符被忽略。该文件必须编码为 UTF-8。

如果一个特定的具体提供者类被命名为多个 配置文件,或者在同一个配置文件中命名更多 不止一次,则忽略重复项。配置文件 命名特定提供者不必在同一个 jar 文件或其他 分发单元作为提供者本身。提供者必须是 可从最初查询到的同一个类加载器访问 找到配置文件;请注意,这不一定是 实际加载文件的类加载器。

Source

【讨论】:

  • 但是Class.forName("com.mysql.jdbc.Driver"),用于手动加载驱动。如果我已经将 mySQL JDBC 连接器添加到库而不是为什么我需要使用它?困惑.. :-(
  • @ShaonHasan 用于加载类。 JDBC 驱动程序有一个静态初始化程序,它大致类似于构造函数,但用于类而不是对象。在其中,驱动程序将自己注册到您的 DriverManager,因此您可以使用它来获取连接等资源。初始化程序在类加载时运行。 Class.forName 只是启动了这个过程。您还可以将 import 语句添加到 java 文件中 import com.mysql.jdbc.Driver 或将其添加到构建路径的环境变量中
  • @AjoKoshy 不同的类加载器会在这里发挥作用吗?
  • @KevinBowersox 你可以调用多个加载器。但所有人都无法访问提供的相同网址
  • @ShaonHasan 运气好吗?
【解决方案2】:

只需将“mysql-connector-java”保留在“C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext”中 “jdk1.7.0_25”是我的 jdk 版本,可能你有不同的版本,但里面必须有子文件夹“\jre\lib\ext”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2017-08-27
    相关资源
    最近更新 更多