在手写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项目中不能省略驱动注册,目前还没搞明白。