我正在使用NetBeans 7.0.1 IDE进行JSP / servlet 我正在尝试为我的项目建立数据库连接。已经下载了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();
}
}
}
但它可以建立连接。从连接con2行,它直接进入catch()块;不执行查询。
答案 0 :(得分: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);
}
来自O'Reilly:
在使用驱动程序之前,必须在JDBC中注册 DriverManager的。这通常通过加载驱动程序类来完成 使用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驱动程序 的Class.forName()。当调用方法getConnection时, DriverManager将尝试从中找到合适的驱动程序 初始化时加载的JDBC驱动程序和加载的驱动程序 显式使用与当前应用程序相同的类加载器。
DriverManager方法getConnection和getDrivers一直是 增强以支持Java SE服务提供程序机制(SPM)。 根据SPM,服务被定义为众所周知的一组 接口和抽象类,以及服务提供者是特定的 实施服务。它还指定了该服务 提供程序配置文件存储在META-INF / services中 目录。 JDBC 4.0驱动程序必须包含该文件 META-INF /服务/ 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()来获取数据库连接。
关于服务加载程序
出于加载目的,服务由单个表示 type,即单个接口或抽象类。 (一个具体的课程 可以使用,但不建议这样做。)给定的提供者 service包含一个或多个扩展此服务的具体类 输入特定于提供者的数据和代码。提供者类 通常不是整个提供者本身,而是一个代理 包含足够的信息来决定提供者是否能够 满足特定请求以及可以创建的代码 实际的供应商按需。提供者类的细节往往是 高度服务;没有单个类或接口可能 统一它们,所以这里没有定义这种类型。唯一的要求 该工具强制执行的是提供者类必须具有 零参数构造函数,以便它们可以在实例化期间实例化 负荷。
通过放置提供者配置来标识服务提供者 资源目录META-INF / services中的文件。该文件的名称是 服务类型的完全限定二进制名称。文件 包含具体提供程序的完全限定二进制名称列表 班级,每行一班。每个名称周围的空格和制表符, 以及空行,都会被忽略。评论字符是'#' ('\ u0023',NUMBER SIGN);在每一行上的所有字符 第一个评论字符被忽略。该文件必须编码 UTF-8。
如果在多个中指定了特定的具体提供程序类 配置文件,或者在同一配置文件中命名的更多 而不是一次,然后忽略重复。配置文件 命名特定提供者不必在同一个jar文件或其他文件中 分配单位作为提供者本身。提供者必须是 可以从最初查询到的同一个类加载器访问 找到配置文件;请注意,这不一定是 实际加载文件的类加载器。
答案 1 :(得分:0)
将“mysql-connector-java”保留在“C:\ Program Files \ Java \ jdk1.7.0_25 \ jre \ lib \ ext”中 “jdk1.7.0_25”是我的jdk版本可能你有不同的版本,但必须有子文件夹“\ jre \ lib \ ext”。