1、写在前面✏️
这段时间博主一直都在学习算法(爆肝PATing),后期给大家出一个非常完整的PAT乙级JAVA题解,今天为什么突然提到JDBC呢,这个得从今天中午的那一通电话说起,在和老师交谈了几分钟后,便开始打开了电脑。
2、遇到问题
博主在上个学期做项目时也有用到JDBC连接数据库,当时也是自己一路摸索一路碰壁,不过好在也是很快就解决了那个的问题。打开IDEA,open已经已经快要落灰的项目代码,轻车熟路的根据老师的需求修改项目的JDBC代码,一顿操作之后,原以为会顺利打印出数据库的信息,没想到一顿红字输出,控制台一大串报错,给我一下子整懵逼了,那没办法了,只能去解决问题了。
"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar=59797:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_152\lib\mysql-connector-java-8.0.11.jar;C:\Users\yx\Desktop\MyWebDemo\web\WEB-INF\classes;C:\Users\yx\Desktop\apache-tomcat-10.0.12-windows-x64\apache-tomcat-10.0.12\lib\servlet-api.jar" MySql.JDBC
Mon Jul 25 20:48:43 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Exception in thread "main" java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:71)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at MySql.JDBC.main(JDBC.java:20)
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:59)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:83)
at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:128)
at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2201)
at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2225)
at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1391)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:993)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:852)
... 6 more
Process finished with exit code 1
3、解决问题
首先,我们看控制台显示的错误信息,经过一顿CV大法后,在CSDN上找到了相关的解释说明,大概的意思就是说缺少JDBC驱动包,这个问题咱一点也不陌生,因为上个学期咱也遇到过一模一样的问题,凭着脑海里零星点记忆,我打开了MySql的lib文件夹,查看里面是否存在一个connector的驱动包,结果跟我想的一样,它就好好的躺在那儿。
咦~?那是哪里出了问题呢,然后继续浏览CSDN上与此相关问题的博客,结果一同操作猛如虎,结果发现还是在原地报错,检查数据库联通问题,发现IDEA是可以联通数据库的,没有毛病。
emm,一套流程下来跟着五六篇博客去操作,就是没有解决JDBC驱动的问题,害,真的头疼,然后老师这边也是让我不着急,慢慢找原因,但是作为一个“一生要强”的男人,又怎会被这点小困难所打败,硬着头皮继续整呗,各种各样的帖子都去看一遍,总会找到自己想找的解决方案,最后在一片博客的细节中才恍然大悟,我连忙打开IDEA的project structure,打开jdk一看果然,这个connector的JDBC驱动包虽然添加到了原jdk包中,但IDEA未更新,这个时候我重新把connector的jar包添加进去,再看看结果!
run一下,不出所料,最后在控制台上成功打印数据库信息!
4、总结📑
我们在学习编程的过程中可能会遇到很多问题,这是不可避免地,我们要保持一颗良好的心态去对待所遇到的一些列问题,多去网上参考前辈们写的总结,遇到问题后能够及时处理并总结,并且在未来的某一天能够帮助到其他人,这也是博主写博客的初心!
完整JDBC代码如下,仅供初学者参考!
import java.sql.*;
/**
* @author yx
* @date 2022-07-25 16:16
*/
public class JDBC1 {
public static void main(String[] args) throws Exception {
String jdbcName="com.mysql.cj.jdbc.Driver";//定义驱动程序名为jdbcName内容为com.mysql.cj.jdbc.Driver
String dbUserName="root";//定义用户名,写你想要连接到的用户。
String dbPassword="123456";//用户密码。
//定义url;jdbc是协议;mysql是子协议:表示数据库系统管理名称;localhost:3306是你数据库来源的地址和目标端口;test是我本人建的表位置所在处,你以你的为标准。
//防止乱码;useUnicode=true表示使用Unicode字符集;characterEncoding=UTF8表示使用UTF-8来编辑的。
String dbUrl="jdbc:mysql://localhost:3306/example"+"?serverTimezone=GMT&useSSL=false&useUnicode=true&characterEncoding=UTF8";
String sql="select * from example.student";//定义查询语句
Class.forName(jdbcName); //注册驱动程序,用java.lang包下面的class类里面的Class.froName();方法 此处的driver就是1里面定义的driver,也可以 Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//获取数据库连接,使用java.sql里面的DriverManager的getConnectin(String url , String username ,String password )来完成
//构造一个statement对象来执行sql语句:主要有Statement,PreparedStatement,CallableStatement三种实例来实现
//三种实现方法分别为:Statement stmt = con.createStatement() ;
// PreparedStatement pstmt = conn.prepareStatement(sql) ;
//CallableStatement cstmt = conn.prepareCall("{CALL demoSp(? , ?)}") ;
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(sql);//执行sql并返还结束 ;ResultSet executeQuery(String sqlString):用于返还一个结果集(ResultSet)对象。
//遍历结果集
while(rs.next()){
System.out.println("学生编号:"+rs.getString("id")+",学生年龄:"+rs.getString("age")+",学生名:"+rs.getString("firstname")+",学生姓:"+rs.getString("lastname"));//使用getString()方法获取你表里的资料名
}
if(rs!=null){//关闭记录集
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(stmt!=null){//关闭说明对象
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(con!=null){//关闭连接,就像关门一样,先关里面的,最后关最外面的
try{
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}