1

我是一个 java 初学者并试图在 db 中插入一行。这是我第一次在 java 中执行插入操作。大约 2 小时,我在谷歌上搜索并感到沮丧,无法解决我的错误。我打电话给我的朋友,他在团队查看器中为我提供了实时支持,并且只在我的程序中添加了一行代码。

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

谁能解释一下为什么我们需要在连接字符串之前将其包含在我的代码中。是否有必要每次都将我的代码放在那里。请详细解释我。

4

4 回答 4

1

这是一些非常简化的代码,说明了驱动程序初始化的工作原理。有 3 个类,请将每个类放在一个适当命名的文件中。

import java.util.HashMap;
import java.util.Map;

public class DriverMgr {
    private static final Map<String, Class<?>> DRIVER_MAP = new HashMap<String, Class<?>>();

    public static void registerDriver(final String name, final Class<?> cls) {
        DRIVER_MAP.put(name, cls);
    }

    public static Object getDriver(final String name) {
        final Class<?> cls = DRIVER_MAP.get(name);
        if (cls == null) {
            throw new RuntimeException("Driver for " + name + " not found");
        }
        try {
            return cls.newInstance();
        } catch (Exception e) {
            throw new RuntimeException("Driver instantiation failed", e);
        }
    }
}

public class MysqlDriver {
    static {
        // hello, I am a static initializer
        DriverMgr.registerDriver("mysql", MysqlDriver.class);
    }

    @Override
    public String toString() {
        return "I am the mysql driver";
    }
}

public class TestProg {
    public static void main(final String... args) {
        try {
            Class.forName("MysqlDriver"); // try with or without this
        } catch (Exception e) {
            throw new RuntimeException("Oops, failed to initialize the driver");
        }
        System.out.println(DriverMgr.getDriver("mysql"));
    }
}

当您调用 Class.forName 时,将加载驱动程序类并执行静态初始化程序。这反过来将驱动程序类注册到驱动程序管理器,以便管理器现在知道它。显然,这只需要执行一次。

于 2013-02-22T19:27:59.060 回答
0

基本思想是这个动作强制驱动类在 JDBC 的驱动管理器中注册。

方法 Class.forName("fully qualified class name) 用于初始化类的静态字段并将 JDBC 驱动程序类(在您的情况下为 MySQL 驱动程序)加载到您的应用程序。当它被实例化时,它被注册到 DriverManager . 通过后者创建连接,使用 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename","login","password");,稍后您将使用它来查询数据库。

于 2013-02-22T19:12:30.747 回答
0

是的,每次都必须包括在内。但您可以使用不重复代码的方法。

例如

public void connectToMYSQL(){
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdatabase","username",""password);
}catch(Exception ex)
{
System.out.println(ex.getMessage());
}

}

在编写任何sql语句之前,只需调用例如方法

public void insert(String sql)
{
connectToMYSQL();
//.. then do your stuffs 

}
于 2013-02-22T19:02:09.133 回答
0

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

必须要求加载您正在使用的数据库的驱动程序。此行中的forNmae() 方法加载mysql 数据库的驱动程序。

于 2013-02-22T19:06:36.777 回答