首先报一个重要前提:我的jdk是从1.8.0-102升的1.8.0-191,这个是个重大铺垫。
然后用MySQL官方下载器下载的MySQL数据库以及JDBC-MySQL数据库驱动,以下是我的版本号
看的是耿祥义编写的“Java2的实用教程”Example11-1,其中书里给出的源码是这样的:
import java.sql.*;
public class Example11_1 {
public static void main(String args[]) {
Connection con=null;
Statement sql;
ResultSet rs;
try{ Class.forName("com.mysql.jdbc.Driver"); //加载JDBC_MySQL驱动
}
catch(Exception e){}
String uri = "jdbc:mysql://localhost:3306/students?useSSL=true";
String user ="root";
String password ="";
try{
con = DriverManager.getConnection(uri,user,password); //连接代码
}
catch(SQLException e){ }
try {
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM mess"); //查询mess表
while(rs.next()) {
String number=rs.getString(1);
String name=rs.getString(2);
Date date=rs.getDate(3);
float height=rs.getFloat(4);
System.out.printf("%s\t",number);
System.out.printf("%s\t",name);
System.out.printf("%s\t",date);
System.out.printf("%.2f\n",height);
}
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
}
然后我报一下耿祥义所用的jdk版本是1.8.0-102,数据库驱动版本号是5.1.40。对比一下我用的驱动版本可以看出版本相差的有点儿远了。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------
开始实验了。
把上面的那段代码扔进想法里运行,报错如下:
1.没有找到合适的数据库驱动
明明我的MySQL安装程序安装了数据库驱动Connector / J为什么仍然会报错没有找到驱动呢?原来还需要把该驱动复制到JDK的拓展目录中!根据MySQL安装程序提示的安装路径找到原来的驱动安装位置。
把该目录下面的mysql-connector-java-8.0.13.jar文件扔到Java JDK 1.8.0-191安装路径的ext文件夹内,再次运行,然而仍然没有报错没有找到数据驱动,我看了看看还有个旧版本1.8.0-102呢,点开这个文件夹里一看发现即使升级了jdk仍然有文件残余,这个文件夹里也有个ext文件夹,于是把mysql-conector-java-8.0.13 .jar也扔了进去这个ext文件夹里。在运行,数据库驱动总算找到了,然而又报了另外一个错误。
2.不能连接到数据库,连接失败。
我想起来还要进行数据库初始化并启动MySQL服务器两个重要步骤!我用管理员身份进入cmd,之所以用管理员身份是因为之前有过非管理员身份操作C盘的东西会显示“访问失败“的先例。登入后cd到MySQL的安装路径下的bin目录下面,依次输入
mysqld --initialize-insecure
//按回车键
mysqld
//按回车键
虽然没有任何提示,但已经是初始化成功并启动了服务器了。再运行,又报一个错误。
3.代码里的Class.forName(“com.mysql.jdbc.Driver”); 已经被弃用。
我上网搜了一下,把这个语句改为Class.forName(“com.mysql.cj.jdbc.Driver”); 为了JDK版本号差异所致的吧,耿祥义所用的jdk版本是1.8.0-102,我的是1.8.0-191,然后再次运行,又跳出来一个错误。
4.这个报错可长了,甚至还包含乱码:java.sql.SQLException:服务器时区值'Öйú±ê׼ʱ¼ä'无法识别或代表多个时区。如果要使用时区支持,则必须配置服务器或JDBC驱动程序(通过serverTimezone配置属性)以使用更具体的时区值。
看上去好像和时间有点关系,把这串东西百度一下,解决方法是在字符串uri =“jdbc:mysql:// localhost:3306 / students?useSSL = true”; 内加入一段serverTimezone = UTC,最后成为
String uri = "jdbc:mysql://localhost:3306/jxgl?user=root&password=&useSSL=true&serverTimezone=UTC";
注意的是在末尾加去前添加了符号“&”。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------
最后的最后,把rs = sql.executeQuery(“SELECT * FROM mess”); 改成rs = sql.executeQuery(“SELECT * FROM student”);
把 String uri = "jdbc:mysql://localhost:3306/students?useSSL=true"; 改成 String uri = "jdbc:mysql://localhost:3306/jxgl?user=root&password=&useSSL=true&serverTimezone=UTC";
因为在之前自己建立了一个名为jxgl的数据库,里面有一个学生的表。运行结果如下:
总算大功告成了!
尝试过在Java里写SQL语句大小写没什么区别,把学生写成学生照样能打印出来,数据库建表时定义为小整型的年龄Sage也能以弦的形式打印出来,看上去效果一样。但如果在某些时候要区别开来还是要注意一下类型更好。
最后贴一下最终代码:
import java.sql.*;
class findjxgl {
public static void main(String args[]) {
Connection con =null;
Statement sql;
ResultSet rs;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
}
String uri = "jdbc:mysql://localhost:3306/jxgl?user=root&password=&useSSL=true&serverTimezone=UTC";
/*String uri = "jdbc:mysql://localhost:3306/students?useSSL=true";*/
String user = "root";
String password = "";
try {
con = DriverManager.getConnection(uri, user, password);
} catch (SQLException e) {
}
try {
con = DriverManager.getConnection(uri);
} catch (SQLException e) {
System.out.println(e);
}
try {
sql = con.createStatement();
rs = sql.executeQuery("SELECT * FROM STUDENT");
while (rs.next()) {
String Sno = rs.getString(1);
String Sname=rs.getString(2);
String Ssex = rs.getString(3);
int Sage = rs.getInt(4);
String Sdept = rs.getString(5);
System.out.printf("%s\t", Sno);
System.out.printf("%s\t",Sname);
System.out.printf("%s\t", Ssex);
System.out.printf("%d\t", Sage);
System.out.printf("%s\n", Sdept);
}
con.close();
} catch (SQLException e) {
System.out.println(e);
}
}
}