MySQL<7> JDBC

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL<7> JDBC相关的知识,希望对你有一定的参考价值。

数据库编程的必备条件

编程语言: 如Java,C、C++、Python等
数据库(数据库服务器): 如Oracle,mysql,SQL Server等
数据库驱动包: 不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提
供了 Java 的驱动包 mysql-connector-java,需要基于 Java 操作 MySQL 即需要该驱动包;同样的,
要基于 Java 操作 Oracle 数据库则需要 Oracle 的数据库驱动包ojdbc

JDBC

什么是 JDBC?

JDBC,即Java Database Connectivity,java数据库连接
是一种用于执行SQL语句的 Java API,它是 Java 中的数据库连接规范;这个API由 java.sql.* ,javax.sql.* 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问
Java 自身来完成 JDBC API 和 数据库 API 之间的转换

MySQL 是一个 CS 结构的系统

编程操作数据库本质上:其实就是自己用代码实现了一个MySQL客户端,这个客户端同样是通过网络来和服务器进行交互


数据库不是凭空就能实现的,而是数据库会给我们提供一组 API 来方便咱们实现
数据库的种类有很多,不同数据库提供的 API 不太一样

例: MySQL 的 API,Oracle 的 API,SQL Server 的 API 都差异很大


在 Java 中,这样的驱动程序是一个独立的 “jar包”
jar包: .class —— 打一个压缩包 .jar (类似于 .rar / .zip )

Maven仓库 上可以看到,MySQL JDBC Driver 是非常多的,下载的 jar包 必须要和 MySQL 服务器版本一致

jar 包的使用

要想使用 jar包,需要将 jar包 导入到 IDEA 中,让代码能够访问到 jar包 中的类

  1. 在 IDEA 的工程中,创建一个目录,把 jar 包拷贝进去


  1. 配置项目的一些属性,让项目能够找到 jar包




剩下的一路 OK 即可~

JDBC 常用接口和类

JDBC 编程中主要用到的类 / 对象:
1.DataSource — 用于配置如何连接 MySQL
2.Connection — 表示建立好的一次连接(操作数据库之前需要先建立连接)
3.PrepareStatement — 对应一个 SQL 语句
4.ResultSet — 表示 select 查找结果的结果集

要想操作数据库,第一步需要和数据库建立连接

Connection 接口实现类由数据库提供,获取Connection对象通常有两种方式

  • DriverManager(驱动管理类)的静态方法获取:
  • DataSource(数据源)对象获取;实际应用中会使用DataSource对象

以第二种方式为例:

  • 1.创建 DataSource 对象
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
如上述这个 import 能够正确执行,说明 jar包 导入成功
// 创建对象  (DataSource对象的是生命周期是跟随整个程序的)
DataSource dataSource = new MysqlDataSource();
// 接下来需要针对 DataSource 进行一些配置,以便后边能够正确的访问到 数据库服务器
// 主要配置 3 方面信息: URL,User,Password (需要进行向下转型)
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/Date20211028?characterEncoding=utf-8&userSSL=true");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("自己设置的密码");
  • 2.基于 DataSource 对象,创建 Connection 对象,和数据库建立连接
    (相当于,打开了客户端,输入密码,连接成功)
import java.sql.Connection;
import java.sql.SQLException;

// 2.和数据库建立连接 建立连接好了之后,就可以进行后续的操作
// 建立连接的意义 是为了验证当前网络通信是否正常
// 如果不正常会抛出 SQLException的异常
 // connection 对象的生命周期是较短的,可以每个请求创建一个新的connection对象
Connection connection = dataSource.getConnection();

3.PrepareStatement 对象拼装具体的 SQL 语句
(相当于客户端中输入SQL的过程)

import java.sql.PreparedStatement;
// 3.拼装 SQL 语句
// 需要用到 PrepareStatement 对象
// 先以 插入数据为例
int id = 1;
String name = "花花";
int classID = 2;
// ? 表示一个占位符,可以把具体的变量替换到 ? 的位置
String sql = "insert into student values(?,?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
// 此处的 1 2 3 表示第几个问号 (相当于 ? 的下标)
statement.setInt(1,id);
statement.setString(2,name);
statement.setInt(3,classID);

4.拼装好之后,需要执行 SQL
(客户端中敲下回车,此时SQL就被发到服务器了)

// 4.拼装好之后,需要执行 SQL
// insert delete update 都使用 executeUpdate 方法来执行
// select 就是 executeQuery 来执行
// 返回值表示此次操作修改了多少行
int ret = statement.executeUpdate();

5.执行完毕后,关闭释放相关资源
(退出客户端)

// 5.执行完毕后,关闭释放相关资源
// 后创建的被先释放,顺序不能错
statement.close();
connection.close();

补充:

插入数据:

附全部代码:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestJDBC {
    public static void main(String[] args) throws SQLException {
        // 1.创建 DataSource 对象 (DataSource对象的是生命周期是跟随整个程序的)
        DataSource dataSource = new MysqlDataSource();
        // 接下来需要针对 DataSource 进行一些配置,以便后边能够正确的访问到 数据库服务器
        // 主要配置 3 方面信息: URL,User,Password (需要进行向下转型)
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/Date20211028?characterEncoding=utf-8&useSSL=true");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("自己设置的密码");  //密码得输入正确才可执行

        // 2.和数据库建立连接 建立连接好了之后,就可以进行后续的操作
        // 建立连接的意义 是为了验证当前网络通信是否正常
        // 如果不正常会抛出 SQLException的异常
        // connection 对象的生命周期是较短的,可以每个请求创建一个新的connection对象
        Connection connection = dataSource.getConnection();

        // 3.拼装 SQL 语句
        // 需要用到 PrepareStatement 对象
        // 先以 插入数据为例
        int id = 1;
        String name = "花花";
        int classID = 2;
        // ? 表示一个占位符,可以把具体的变量替换到 ? 的位置
        String sql = "insert into student values(?,?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        // 此处的 1 2 3 表示第几个问号 (相当于 ? 的下标)
        statement.setInt(1,id);
        statement.setString(2,name);
        statement.setInt(3,classID);
        System.out.println("statement: " + statement);

        // 4.拼装好之后,需要执行 SQL
        // insert delete update 都使用 executeUpdate 方法来执行
        // select 就是 executeQuery 来执行
        // 返回值表示此次操作修改了多少行
        int ret = statement.executeUpdate();
        System.out.println("ret: " + ret);

        // 5.执行完毕后,关闭释放相关资源
        // 后创建的被先释放,顺序不能错
        statement.close();
        connection.close();
    }
}

输出结果:


查看数据库中的结果:

查询数据:

select 操作示例:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestJDBCSelect {
    public static void main(String[] args) throws SQLException {
        // 1.创建 DataSource 对象
        DataSource dataSource = new MysqlDataSource();
        // 配置三方面信息
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/Date20211028?characterEncoding=utf-8&useSSL=true");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("Xzzcode666");

        // 2.创建 connection 对象,和数据库建立连接
        Connection connection = dataSource.getConnection();

        // 3.拼装 SQL 语句
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        // 4.执行 SQL
        ResultSet resultSet = statement.executeQuery();

        // 5.遍历结果集 遍历过程和迭代器遍历集合类有点像
        // 结果集相当于一张表,这个表里有很多行,每一行是一个记录(又包含很多列)
        // next: 一方面判定当前是否存在下一行; 另一方面如果存在下一行,就获取到这一行
        while(resultSet.next()){
            // resultSet 的"光标"指向当前行,就可以把当前行中的的列的数据都获取到
            // 当前表中的每一行包含三列: id, name, classID
            // 可以根据列名获取对应的列数据
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int classID = resultSet.getInt("classID");
            // 上述三个 参数中的列名必须和 数据库中的列名完全一致
            System.out.println("id: " + id + " name: " + name + " classId: " + classID);
        }
        // 6.执行完毕后,关闭释放相关资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

输出结果:

删除数据:

删除操作实例:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class TestJDBCDelete {
    public static void main(String[] args) throws SQLException {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要删除的学生姓名: ");
        String name = scan.next();

        //1.创建 DataSource 对象
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/Date20211028?characterEncoding=utf-8&useSSL=true");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("Xzzcode666");

        // 2.创建Connection 对象,和数据库建立连接
        Connection connection = dataSource.getConnection();

        // 3.拼装SQL
        String sql = "delete from student where name = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,name);

        // 4.执行 SQL
        int ret = statement.executeUpdate();
        if(ret == 1){
            System.out.println("删除成功!");
        }
        else{
            System.out.println("删除失败!");
        }
        // 5.关闭并释放资源
        statement.close();
        connection.close();
    }
}

输出结果:

数据库中检验:

修改数据:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class TestJDBCUpdate {
    public static void main(String[] args) throws SQLException {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要修改的学生id: ");
        int id = scan.nextInt();
        System.out.println("请输入要修改的学生姓名: ");
        String name = scan.next();

        //1.创建 DataSource 对象
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/Date20211028?characterEncoding=utf-8&useSSL=true");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("Xzzcode666");

        // 2.创建Connection 对象,和数据库建立连接
        Connection connection = dataSource.getConnection();

        // 3.拼装SQL
        String sql = "update student set name = ? where id = ?";
        PreparedStatement statement = connection.prepareStat1ement(sql);
        statement.setString(1,name);
        statement.setInt(2,id);

        // 4.执行 SQL
        int ret = statement.executeUpdate();
        if(ret == 1){
            System.out.println("修改成功!");
        }
        else{
            System.out.println("修改失败!");
        }
        // 5.关闭并释放资源
        statement.close();
        connection.close();
    }
}

输出结果:


数据库校验:

总结:

以上是关于MySQL<7> JDBC的主要内容,如果未能解决你的问题,请参考以下文章

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

JDBC---Mysql

jdbc mysql

如何在片段中填充列表视图?

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException MySQL + Apache Tomcat 7

Ambari 2.7.3.0-139:SQLException:SQL 状态:08S01 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException