Java 加载并连接到mysql jdbc驱动程序运行时

Java 加载并连接到mysql jdbc驱动程序运行时,java,mysql,runtime,Java,Mysql,Runtime,我目前正在处理一个需要加载mysql驱动程序运行时并使用java连接到数据库的需求 我正在使用URLClassLoader加载jar文件 File f = new File("D:/Pallavi/workspace/WarInstallation/mysql-connector-java-5.0.4-bin.jar"); //Jar path URLClassLoader urlCl = new URLClassLoader(new URL[] { f.toURL()},System.cla

我目前正在处理一个需要加载mysql驱动程序运行时并使用java连接到数据库的需求

我正在使用
URLClassLoader
加载jar文件

File f = new File("D:/Pallavi/workspace/WarInstallation/mysql-connector-java-5.0.4-bin.jar"); //Jar path

URLClassLoader urlCl = new URLClassLoader(new URL[] { f.toURL()},System.class.getClassLoader()); 
Class sqldriver = urlCl.loadClass("com.mysql.jdbc.Driver"); // Runtime loading

Driver ds = (Driver) sqldriver.newInstance(); //Compilation failing as "sqldriver" class of type Driver is not found

//I am using now java.sql.Driver to remove the compilation error

sqldriver = Class.forName("com.mysql.jdbc.Driver", true, sqldriver.getClassLoader()).newInstance(); //Runtime fail.. "Driver" Class not Found Exception.
尽管类的负载很好,但无论我尝试哪个驱动程序,我都无法建立数据库连接(找不到适合的驱动程序…)

请建议加载jdbc“
com.mysql.jdbc.Driver
”类运行时的方法。 如果您需要任何进一步的信息,请告诉我,因为这是紧急情况


提前感谢。

DriverManager忽略运行时加载的类,它将仅适用于系统类加载程序加载的类

您可以创建一个虚拟驱动程序类来封装实际的数据库驱动程序。可以找到源代码

离题:

已弃用,请改为使用
URI
on上的
toURL
File
获取URL

URLClassLoader urlCl = new URLClassLoader(new URL[] { f.toURI().toURL()},System.class.getClassLoader()); 

在回答您的问题之前,我有三个问题:

  • 声明1


    ya,我已经在环境变量中设置了mysql jar的类路径,需要通过系统属性设置吗?

    Q1:当系统类加载器可以从类路径随时使用类时,为什么要依赖自定义类加载器?
    要使用自定义类加载器,您不需要显式的类路径来访问
    mysql***.jar

  • 声明2

    classsqldriver=urlCl.loadClass(“com.mysql.jdbc.Driver”);//运行时加载
    //由于未找到驱动程序类型的“sqldriver”类,编译失败
    驱动程序ds=(驱动程序)sqldriver.newInstance()

    Q2:声称
    编译失败…
    是非常矛盾的。您的编译器是否正在寻找此类类来生成您的类
    我肯定不是。可能是运行时出现了一个
    java.lang.ClassNotFoundException:com.mysql.jdbc.Driver
    错误。我也怀疑你的评论应该与下面的陈述3一致。
    如果它是
    CNFE
    ,则指向
    mysql***.jar
    的文件路径是错误的。先把它修好

  • 声明3

    //我现在使用java.sql.Driver删除编译错误
    //运行时失败。。未找到“驱动程序”类异常。 sqldriver=Class.forName(“com.mysql.jdbc.Driver”,true,sqldriver.getClassLoader()).newInstance()

    Q3:索赔
    。。。“未找到驱动程序”类异常
    可疑。因为,这个语句不会被编译。那怎么可能是运行时失败
    我还怀疑该评论应该与您的上述声明2一致。
    在这里,您需要调用
    newInstance()
    ,然后在分配给
    sqlDriver
    变量之前转换到
    java.sql.Driver
    。因为
    Class.forName(…
    只返回一个。
    若上面语句2中的问题已修复,则可以将此修复应用于进一步的测试

  • 我希望你能澄清这些陈述


    下面我有一个工作示例代码,为您显示了一个经过测试的输出

    import java.io.File; // and others as required
    
    public class MySQLDriveClassLoader {
      public static void main( String [] args ) throws Exception {
        //File f = new File( "/home/ravinder/soft-dump/mysql-connector-java-5.1.18-bin.jar" );
        File f = new File( "E:\\Soft_Dump\\mysql-connector-java-5.0.4\\mysql-connector-java-5.0.4-bin.jar" );
        URLClassLoader urlCl = new URLClassLoader( new URL[] { f.toURI().toURL() }, System.class.getClassLoader() );
    
        Class mySqlDriver = urlCl.loadClass( "com.mysql.jdbc.Driver" );
    
        //*** Start: DEBUG *************************
        //mySqlDriver.con // On pressing CTRL+SPACEBAR, after .con, IDE shows "No default proposals"
        // meaning it still is not an instance of Driver, and hence can't call a method from Driver class.
    
        //Incompatible conditional operand types Class and Driver
        //System.out.println( mySqlDriver instanceof java.sql.Driver ) );
    
        System.out.println( "mySqlDriver: " + mySqlDriver );
        System.out.println( "Is this interface? = " + mySqlDriver.isInterface() );
    
        Class interfaces[] = mySqlDriver.getInterfaces();
        int i = 1;
        for( Class _interface : interfaces ) {
          System.out.println( "Implemented Interface Name " + ( i++ ) + " = " + _interface.getName() );
        } // for(...)
    
        Constructor constructors[] = mySqlDriver.getConstructors();
        for( Constructor constructor : constructors ) {
          System.out.println( "Constructor Name = " + constructor.getName() );
          System.out.println( "Is Constructor Accessible? = " + constructor.isAccessible() );
        } // for(...)
        //*** End  : DEBUG *************************
    
        Driver sqlDriverInstance = ( Driver ) mySqlDriver.newInstance();
        System.out.println( "sqlDriverInstance: " + sqlDriverInstance );
    
        Connection con = null;
        try {
          /******************************************************************
          // You may fail to register the above driver
          // hence don't depend on DriverManager to get Connected
          //DriverManager.registerDriver( sqlDriverInstance );
          //Driver driver = DriverManager.getDriver( "com.mysql.jdbc.Driver" ); // ( "jdbc:mysql" );
          Enumeration<Driver> enumDrivers = DriverManager.getDrivers();
          while ( enumDrivers.hasMoreElements() ) {
            Driver driver = enumDrivers.nextElement();
            System.out.println( "driver: " + driver );
          } // while drivers
          //******************************************************************/
    
          String dbUrl = "jdbc:mysql://:3306/test";
          Properties userDbCredentials = new Properties();
          userDbCredentials.put( "user", "root" );
          userDbCredentials.put( "password", "password" );
    
          // No suitable driver found for ...
          //con = DriverManager.getConnection( dbUrl, "root", "password" );
    
          // safely use driver to connect
          con = sqlDriverInstance.connect( dbUrl, userDbCredentials );
          System.out.println( "con: " + con );
    
          Statement stmt = con.createStatement();
          String sql = "select now()";
          ResultSet rs = stmt.executeQuery( sql );
          if ( rs.next() ) {
            System.out.println( rs.getString( 1 ) );
          } // if rs
        } catch( Exception e ) {
          e.printStackTrace(); // only for quick debug
        } finally {
          try { if ( con != null ) con.close(); } catch ( Exception ignoreThis ) {}
        }
      } // psvm(...)
    } // class MySQLDriveClassLoader
    


    你的类路径上有mysql jar吗?是的,我已经在环境变量中设置了mysql jar的类路径,我们需要通过系统属性进行设置吗?非常感谢你的澄清。我的很多疑问都被澄清了。我实际上是在获取了驱动程序实例。我还试图将驱动程序类转换为“com.mysql.jdbc.Driver”,而不是接口“java.sql.Driver”。这对我来说很有效。我正在对它进行进一步的研发,再次感谢您提供的信息。
    mySqlDriver: class com.mysql.jdbc.Driver
    Is this interface? = false
    Implemented Interface Name 1 = java.sql.Driver
    Constructor Name = com.mysql.jdbc.Driver
    Is Constructor Accessible? = false
    sqlDriverInstance: com.mysql.jdbc.Driver@1270b73
    con: com.mysql.jdbc.Connection@32fb4f
    2012-05-29 03:52:12.0