记一个jdbc问题

时间:2025-04-06 16:21:47

在手写jdbc通过servlet操作数据库时,弹出了“: No suitable driver found for jdbc:mysql://localhost:3306/javaweb”提示。

检查数据库连接没有发现问题,网上搜到的经验尝试后也没有解决。然后在本地建了一个测试类并在其中写了与问题servlet中同样的jdbc代码,神奇的是可以正确执行查询。

最后废了不少时间终于发现,是工具类中执行注册驱动的代码出现问题

    {
        try {
            Class.forName("");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

本应写在static开头的静态代码块中,在类加载时执行。漏写了static,静态代码块变成构造代码块,执行时间从类加载时变成创建对象时。工具类提供的是静态方法无需new对象,自然注册驱动的代码没有执行,于是出现了文章开头的错误信息。

那么新的问题来了,为什么写错的工具类在被本地测试方法使用时没有出现问题?
原来是从JDBC4.0后,不用显式加载数据库的注册驱动。

Class.forName("");//注册驱动可省略
  • 1

类中的注释:

/**
* <P>Applications no longer need to explicitly load JDBC drivers using <code>()</code>. Existing programs
* which currently load JDBC drivers using <code>()</code> will continue to work without
* modification.
 * /
  • 1
  • 2
  • 3
  • 4
  • 5

在获取连接的时候,会自动的查找合适的驱动类,并初始化当前使用相同驱动的类,无需手动注册。

因此在本地测试方法中可以无需注册正常执行。

至于为什么在javaweb项目中不能省略驱动注册,目前还没搞明白。