gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:09:18 25 4
gpt4 key购买 nike

我目前正在处理一个需要加载 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"类运行时的方法。如果您需要任何进一步的信息,请告诉我,因为这很紧急。

提前致谢。

最佳答案

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

  1. 声明 1:

    ya, I have set the classpath of mysql jar in the environment variables, do we need to set it through system properties?

    问题 1:为什么要依赖自定义类加载器,当系统类加载器可以从类路径轻松获取类时?
    您不需要 mysql***.jar 的显式类路径使用自定义类加载器。

  2. 声明 2:

    Class sqldriver = urlCl.loadClass("com.mysql.jdbc.Driver"); // Runtime loading<br/>
    //Compilation failing as "sqldriver" class of type Driver is not found<br/>
    Driver ds = (Driver) sqldriver.newInstance();

    Q2:声明 Compilation failing ... 非常矛盾。您的编译器是否正在寻找这样的类来生成您的类!?
    我确定不是。可能是错误在运行时出现 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver .我还怀疑评论应该与下面的声明 3 一起使用。
    如果是CNFE ,你的文件路径到 mysql***.jar是错的。先修复它。

  3. 声明 3:

    //I am using now java.sql.Driver to remove the compilation error<br/>
    //Runtime fail.. "Driver" Class not Found Exception.
    sqldriver = Class.forName("com.mysql.jdbc.Driver", true, sqldriver.getClassLoader()).newInstance();

    Q3:声明 ... "Driver" Class not Found Exception 值得怀疑。因为,这条语句不会被编译。那怎么会是运行时失败呢。 ..!?
    我还怀疑该评论应该与上面的声明 2 一致。
    在这里,您需要调用 newInstance()然后转换为 java.sql.Driver在分配给 sqlDriver 之前多变的。因为Class.forName( ...只返回 Class object associated with the class or interface with the given string name .
    如果上述声明 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

编译运行成功,输出如下:

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

关于java - 加载并连接到 mysql jdbc 驱动程序运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10780919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com