2015-12-11 194 views
1

我搜索了互联网,试图找到使用java和JDBC连接到MySQL的解决方案。不幸的是我找到了多个答案,没有解决我的问题。使用JDBC连接到MySQL

我从MySQL下载了JDBC,并解压缩文件以查找.jar。我把该.jar在我的C:/ Program Files文件(X86)/的Java/JDK .../JRE/lib/ext目录文件夹中。我把我的环境变量CLASSPATH(也许CLASSPATH,类路径??)以下:

%CLASSPATH%;.;C:\Program Files (x86)\Java\jdk1.8.0_65\jre\lib\ext 

我用我由基于各种不同的解决方案,我已经看到了让这个脚本:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 


public class MySql { 

    public static void main(String[] args) 
    { 
     Connection con = getConnection(); 
     if (con != null) { 
      System.out.println("Connection Made"); 
     } 
     else { 
      System.out.println("Connection not made"); 
     } 
    } 

    private static Connection getConnection() { 


     Connection con = null; 
     try { 
      Class.forName("com.mysql.jdbc"); 
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "java", "java"); 
      System.out.println("Connection Made"); 

      conn.close(); 

     } 
     catch (SQLException e) 
     { 
      System.out.println(e.getMessage()); 
      System.exit(0); 
     } 
     catch (ClassNotFoundException e) 
     { 
      System.out.println(e.getMessage()); 
      System.exit(0); 
     } 
     return con; 
    } 


} 

它用javac MySql.java编译。然后当它运行(java MySql)时,我得到com.mysql.jdbc。我读过,我不需要注册驱动程序,但是当我删除Class.forName时,我得到的是'找不到JDBC驱动程序'错误。

我无法将问题缩小到两种: 1)。类路径没有正确设置。 2)。不正确的java连接代码。 3)。无法找到MySQL服务器。

任何帮助,将不胜感激。

编辑 -

我.jar文件放置到桌面以进行测试。更改的系统变量CLASSPATH:

%CLASSPATH%;.;C:\User\User\Desktop\mysql-connector-java-5.1.38-bin.jar 

然后,当我添加了微量的错误说法,我得到:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 
    at java.net.URLClassLoader.findClass<Unkown Source> 
    at java.lang.ClassLoader.loadclass (Unknown source) 
    at sun.misc.Launcher$AppClassLoader.loadclass(Unkown Source) 
    etc. 
    etc. 

编辑2 - 我一直在使用Connect Java to a MySQL database作为一种资源,没有的指令花了两天时间我跟着解决了我的问题。

+0

如果发生异常并且将完整异常粘贴到您的问题中,您可以执行e.printStackTrace()吗?这个消息本身并没有太多帮助。 – Jan

+0

您是否在构建路径中包含JDBC jar? –

+1

现在是时候摆脱把东西扔进“....../jre/lib/ext”的习惯,显然这个选项[将在Java 9中删除](https://blogs.oracle.com/java-platform -group /项/ planning_safe_removal_of_under)。 –

回答

3

而不是

System.out.println(e.getMessage()); 

做这个

e.printStackTrace(); 

您将看到的例外是:

java.lang.ClassNotFoundException: com.mysql.jdbc 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at MySql.getConnection(MySql.java:24) 
    at MySql.main(MySql.java:10) 

取出的Class.forName。您可能会遇到访问被拒绝或其他错误,但它会解决ClassNotFoundException。下面是最终编辑的版本,应该工作:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class MySql { 

    public static void main(String[] args) 
    { 
     Connection con = getConnection(); 
     if (con != null) { 
      System.out.println("Connection Made"); 
     } 
     else { 
      System.out.println("Connection not made"); 
     } 
    } 

    private static Connection getConnection() { 
     Connection con = null; 
     try { 
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "java", "java"); 
      System.out.println("Connection Made"); 
      conn.close(); 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
      System.exit(0); 
     } 
     return con; 
    } 
} 
+0

需要Class.forName()来确保驱动程序类由类加载器加载。我不会删除它。 –

+0

@AndreasVogl - *“需要Class.forName()...”* - 自从JDBC 4(大约Java 6)以来就没有了。 –

+0

我收到错误java.sql.SQLException:找不到适合jdbc的驱动程序:mysql:// localhost:3306/sakila –

0

我认为你必须添加包括在类路径中的驱动程序的JAR文件名的路径。像这样:

%CLASSPATH%;.;C:\Program Files (x86)\Java\jdk1.8.0_65\jre\lib\ext\mysql-connector-java-xxx.jar 
1

如果你需要的Class.forName(),你必须使用正确的类:

 Class.forName("com.mysql.jdbc.Driver"); 

但随着JDBC 4已经变得不再必要。

创建完整的异常堆栈跟踪,并将结果在这里搜索 - 最常见的错误在这里已经解决过。

NoSuitableDriverFound是一个非常强表明您的mysql-connector.jar(而不是.zip ....)在您的类路径中缺少您运行代码时。

你可以尝试这样的:

运行java -cp .;C:\User\User\Desktop\mysql-connector-java-5.1.38-bin.jar MySql

0

如果您的Java 6或以上版本,你不需要Class.formName(...)代码。 为了确保一切正常,请按照以下方式编译和执行代码。 编译:

java -cp PATH_TO_DRIVER; YOUR_CLASS.java 

要执行:

java -cp PATH_TO_DRIVER; YOUR_CLASS 

更改YOUR_CLASS到您的类和PATH_TO_DRIVER的路径名,你下载的MySQL驱动程序。

希望它有帮助!

+0

您不需要将驱动程序放在此位置,它可以位于系统的任何位置,您在编译或运行代码时(或两者)指定位置。我建议你可以避免改变你的classpath环境变量。 – avaz

+0

您只需尝试一下建议,看看它是否可用来缩小问题出现的位置。也许你的类路径配置是错误的,或者你的代码或者你放在那个位置的jar不是真正的mysql驱动程序。建议的方式不易出错,因为您可以降低对外部系统配置的依赖。 – avaz

+0

我得到了一个java.sql.SQLException:找不到适合jdbc的驱动程序:mysql:// localhost:3306/sakila –

0

试试这个代码!

public static void main(String[] argv) { 

    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
    } catch (ClassNotFoundException e) { 
     System.out.println("Where is your MySQL JDBC Driver?"); 
     e.printStackTrace(); 
     return; 
    } 

    System.out.println("MySQL JDBC Driver Registered!"); 
    Connection connection = null; 

    try { 
     connection = DriverManager 
     .getConnection("jdbc:mysql://localhost:3306/yourSCHEMAname,"login", "password"); 

    } catch (SQLException e) { 
     System.out.println("Connection Failed! Check output console"); 
     e.printStackTrace(); 
     return; 
    } 

    if (connection != null) { 
     System.out.println("You made it, take control your database now!"); 
    } else { 
     System.out.println("Failed to make connection!"); 
    } 
    } 
}