1

我正在为 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() 块;不执行查询。

4

2 回答 2

0

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

于 2013-12-19T17:20:59.583 回答
0

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

来自奥莱利:

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

这是必需的,因为您已将库放在 JDK/lib 文件夹中,我假设该文件夹是使用与您的应用程序使用的不同的 ClassLoader 加载的。由于使用了不同的类加载器,JDBC 4.0+ 驱动程序发生的自动注册不会生效。您可以尝试将驱动程序 jar 文件放在应用程序服务器的 lib 中,它应该使用与应用程序相同的 ClassLoader。请参阅:在 Web 应用程序中通过 JDBC 连接到数据库时何时需要 Class.forName?

关于自动注册

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

DriverManager 方法 getConnection 和 getDrivers 已得到增强,以支持 Java SE 服务提供者机制 (SPM)。根据 SPM,服务被定义为一组众所周知的接口和抽象类,服务提供者是服务的具体实现。它还指定服务提供者配置文件存储在 META-INF/services 目录中。JDBC 4.0 驱动程序必须包含文件 META-INF/services/java.sql.Driver。此文件包含 java.sql.Driver 的 JDBC 驱动程序实现的名称。例如,要加载 JDBC 驱动程序以连接到 Apache Derby 数据库,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() 来获取数据库连接。

资源

关于服务加载器

出于加载的目的,服务由单一类型表示,即单一接口或抽象类。(可以使用具体类,但不推荐这样做。)给定服务的提供者包含一个或多个具体类,这些具体类使用提供者特定的数据和代码扩展此服务类型。提供者类通常不是整个提供者本身,而是一个代理,它包含足够的信息来决定提供者是否能够满足特定请求以及可以按需创建实际提供者的代码。提供者类的细节往往是高度特定于服务的;没有一个类或接口可以统一它们,所以这里没有定义这样的类型。

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

如果一个特定的具体提供者类在多个配置文件中被命名,或者在同一个配置文件中被命名不止一次,那么重复的将被忽略。命名特定提供者的配置文件不必与提供者本身位于相同的 jar 文件或其他分发单元中。必须可以从最初查询配置文件的同一个类加载器访问提供程序;请注意,这不一定是实际加载文件的类加载器。

资源

于 2013-04-18T09:23:14.740 回答