Thinking in Enterprise Java中:
编译例程c15:jdbc:Lookup.java的时候出现,相关问题
java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
显示jdbc访问ACCESS的方法已经过时,在新的版本中官方不再提供相应的方法。
遂改用jdbc访问mySQL进行替代。
即Class.forName("com.mysql.cj.jdbc.Driver")已经过时
故笔者在MySQL建库之后,使用
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();替代之。
由此处下载 JDBC Connector
https://dev.mysql.com/downloads/connector/j/5.1.html
安装指南位于
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-installing.html
本次下载,下载后解压缩
得到两个jar文件:
mysql-connector-java-5.1.47.jar
mysql-connector-java-5.1.47-bin.jar
其实原本安装的mysql也有C:\Program Files (x86)\MySQL\Connector J 8.0\mysql-connector-java-8.0.11.jar
复制到
C:\Program Files\Java\jdk-10.0.1\lib\mysql-connector-java-5.1.47-bin.jar;
C:\Program Files\Java\jdk-10.0.1\lib\mysql-connector-java-5.1.47.jar;
本次操作将两个文件都拷到那个目录下,其实可以只放一个。
修改环境变量CLASSPATH(笔者为windows 平台) ,指向要包含到具体文件, 修改后,其值为:
.;C:\Program Files\Java\ClassPathDir;C:\Program Files\Java\jdk-10.0.1\lib\mysql-connector-java-5.1.47-bin.jar;C:\Program Files\Java\jdk-10.0.1\lib\mysql-connector-java-5.1.47.jar;
之后使用javac就可以编译了
!
在调试过程中,碰到
SQLException: Access denied for user 'dbuser'@'localhost' (using password: YES)
SQLState: 28000
VendorError: 1045
把user更换成root并使用密码,则可以查询了,可能是很久没有更新数据库dbuser的密码过期expired了。
修改之后的代码为:
//: c15:jdbc:Lookup.java
// Looks up email addresses in a
// local database using JDBC.
// {Broken}
import java.sql.*;
public class Lookup {
public static void main(String[] args)
throws SQLException, ClassNotFoundException {
//ACCESS is nolonger support by official after newly JDK
//modified by zyy to use MySql
//String dbUrl = "jdbc:odbc:people";
String dbUrl ="jdbc:mysql://localhost:3306/people?useUnicode=true&characterEncoding=GB2312";
//String user = "";
String user = "root";
String password = "zo1_zyyinbh";
// Load the driver (registers itself)
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName(
"sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
//"com.mysql.cj.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
System.err.println(ex);
}
//"com.mysql.jdbc.Driver");
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
try{
Connection c = DriverManager.getConnection(
dbUrl, user, password);
Statement s = c.createStatement();
// SQL code:
ResultSet r =
s.executeQuery(
"SELECT FIRST, LAST, EMAIL " +
//"FROM people.csv people " +
"FROM people " +
"WHERE " +
"(LAST='" + args[0] + "') " +
" AND (EMAIL Is Not Null) " +
"ORDER BY FIRST");
while(r.next()) {
// Capitalization doesn't matter:
System.out.println(
r.getString("Last") + ", "
+ r.getString("fIRST")
+ ": " + r.getString("EMAIL") );
}
s.close(); // Also closes ResultSet
}catch (SQLException ex){
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}
} ///:~