JDBC入门及在mysql 8.0版本出现的问题

    xiaoxiao2025-02-07  30

    JDBC(Java DataBase Connectivity --java数据库连接)。

    以我的理解来说,jdbc 就是用来规范程序与不同数据库连接的一个标准规范。

    所以直接开始代码部分

    1. 程序连接数据库,前提是需要一个驱动器,所以需要加载数据库驱动。

          a.DriverManager.registerDiver(new Driver);//可以使用,但是会出现注册两次驱动的问题

          b.Class.forName();//实际常用 注册驱动代码

    2. 加载驱动器之后,便是搭建一个程序与数据库之间的桥梁,即 建立连接。

          DriverManager.getConnection(url,username,password);

          url:代表的是数据库的路径,好比桥梁连接的是哪两个位置。

          username、password 就不用多说,就是数据库的用户名和密码。

    3. 有了桥梁之后,就需要一个对象来运输程序和数据库之间的数据。 即 创建 Statement对象

          connection.createStatement();

    4. 然后就是需要用Statement对象来实现对数据库内容的操作,而具体如何操作,需要由SQL语句来决定,同时取出来的数据需要用一个容器对象来存储,即ResultSet 对象

          ResultSet resultSet = statement.executeQuery(SQL);

    5. 程序对数据进行操作,最后需要将用过的东西关闭,节约内存

          resultSet.close();

          statement.close();

          connection.close();

    这就是一个完整的JDBC的流程

     


    下面讲一下我所碰到的问题,因为我装的MySql版本 8. 0

    所以我按照上面的流程写好代码之后就出现一系列的问题及解决

    1. 之前使用的 Jdbc jar 包不能使用,需要改成 mysql-connector-java-8.0的,可以去https://mvnrepository.com/artifact/mysql/mysql-connector-java查找

    2. 连接的驱动 需要由原来的 import com.mysql.jdbc.Driver 改成 import com.mysql.cj.jdbc.Driver;

    3. url 参数后面需要加上?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true

    package com.zhouxin.jdbc.demo1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.junit.Test; import com.mysql.cj.jdbc.Driver; public class JdbcDemo1 { @Test public void demo1() { try { //加载数据库驱动 DriverManager.registerDriver(new Driver());//该方法会出现注册两次驱动的问题 //所以实际注册驱动代码可以是 //Class.forName("com.mysql.jdbc.driver"); String url ="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"; //建立连接 Connection conn = DriverManager.getConnection(url,"root","pwd_970301"); //创建Statement对象 Statement state = conn.createStatement(); String sql = "select * from user" ; //查询数据库,并返回结果集resultSet ResultSet resultSet = state.executeQuery(sql); //遍历结果集 while(resultSet.next()) { int uid = resultSet.getInt("uid"); String uname = resultSet.getString("username"); String name = resultSet.getString("name"); System.out.println( "用户ID" + uid + "用户账号" + uname + "用户名称" + name); } //关闭连接,释放资源 resultSet.close(); state.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }

    补充:

           在上面的代码中释放资源的过程中会出现一个问题。如果在释放资源代码前面出现BUG,那么这个资源释放的代码是不会被执行的,资源没有释放,一定会存在一些问题,所以需要将释放资源的代码放在finally的代码块中,可以无论出现什么问题,释放资源代码被执行。 代码有点多,我们也可以将这资源释放代码整合成一个工具类,来使用。

    @Test public void demo1() { Connection conn = null; Statement state = null; ResultSet resultset = null; try { //..... } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(resultset!=null) { try { resultset.close(); } catch (SQLException e) { resultset = null; } } if(state!=null) { try { state.close(); } catch (SQLException e) { state = null; } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { conn = null; //可以使垃圾回收中更早的被回收 } } }

     

    最新回复(0)