JDBC --- Java的数据库编程

目录

一、数据库编程的必备条件

二、什么是 JDBC

JDBC 的优势

三、JDBC 使用流程 以及 常用接口和类的讲解

0. 前置工作

1. 引入依赖

2. 数据库连接Connection

3. 创建操作命令 Statement

4. 使用操作命令来执行 SQL

5. 处理结果集 ResultSet

6. 释放资源

完整代码


哥几个来学 JDBC 啦~~

JDBC --- Java的数据库编程_第1张图片

 

一、数据库编程的必备条件

①编程语言:如 Java、C语言、C++、Python 等。

②数据库:如 Oracle、MySQL、SQL Server 等。

③数据库驱动包:不同的数据库对不同的语言提供了不同的数据库驱动包。

二、什么是 JDBC

        JDBC,即 Java Database Connectivity(Java 数据库连接)。是一种执行 SQL 语句的 Java API,它是 Java 中的数据库链接规范。简单来说就是使用 Java 来操控数据库~~

JDBC 的优势:

① Java 语言访问数据库操作完全面向抽象接口编程

② 开发数据库应用不用限定在特定数据库厂商的 API

③ 程序的可移植性大大增强

三、JDBC 使用流程 以及 常用接口和类的讲解

首先我们来了解一下 JDBC 的使用步骤:

①引入依赖

②创建数据库连接 Connection

③创建操作命令 Statement

④使用操作命令来执行 SQL

⑤处理结果集 ResultSet

⑥释放资源

接下来我们通过这个使用流程来逐步了解它的类和接口:

0. 前置工作:

 首先我们创建了这样的一张学生表,里面包含了 id 和 name,我们往里面里面插入两条信息:

JDBC --- Java的数据库编程_第2张图片

1. 引入依赖

引入依赖就需要用 MySQL 的驱动包(把 MySQL 自身的 api 给转换成 JDBC 风格)。

下载驱动包

在  maven 中央仓库 安装:

Maven Repository: mysql (mvnrepository.com)https://mvnrepository.com/search?q=mysql

① 搜索 “mysql”

JDBC --- Java的数据库编程_第3张图片

② 然后点进去选择 5.1.x 系列就可以,因为我的 MySQL 是 5.7 系列的,所以用的是 5 系列的,如果 MySQL 是 8 系列的,那么就用 8 系列的,一定要和自己的 MySQL 版本匹配,如果不匹配的话,就可能导致 bug !!!

 JDBC --- Java的数据库编程_第4张图片

③ 点击 “jar” 进行下载

JDBC --- Java的数据库编程_第5张图片

④ 创建一个目录,可以命名为 “lib”

⑤ 把刚才下载好的 驱动包 复制到该路径底下

​ 

⑥ 右键刚才的目录,有一个 “”add as library 然后点击这个选项,才会把 jar 包引入到项目中,项目才会读取 jar 内部的 .class 文件。否则代码就找不到 jar 里面的一些类了。 

2. 数据库连接Connection

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

  • ① 通过 DriverManager(驱动管理类) 的静态方法获取:
// 加载 JDBC 驱动程序
Class.forName("com.mysql.jdbc.Driver");

// 创建数据库连接
Connection connection = DriverManager.getConnection(url);

其中,DriverManager.getConnection(url) 里的 url 是一个字符串,形如:

"jdbc:mysql://localhost:3306/test?user=root&password=root&useUnicode=true&characterEncoding=UTF-8"

它的格式如下:

jdbc:mysql://服务器地址:端口:/数据库名?参数名=参数值

(这个 参数名和参数值 可以有多对~~)

  • ② 通过DataSource(数据源)对象获取。实际应用中会使用 DataSource 对象。
// 创建 DataSource 对象
DataSource dataSource = new MysqlDataSource();
          
//设置 url      
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107_blog_system?characterEncoding=utf8&useSSL=false");

//设置用户
((MysqlDataSource)dataSource).setUser("root");

//设置密码
((MysqlDataSource)dataSource).setPassword("123456");

//建立连接
Connection connection = dataSource.getConnection();

以上两种连接数据库方法的区别:

DriverManager 类来获取的 Connection 连接,是无法重复利用的,每次使用完以后释放资源时,通过 connection.close() 都是关闭物理连接。

DataSource 提供连接池的支持。连接池在初始化时将建立一定数量的数据库连接,这些链接是可以重复利用的,每次使用完数据库连接,释放资源调用 connection.close() 不是直接关闭物理连接,而是把它重新回收到连接池,等到需要使用时会再次被利用起来。

3. 创建操作命令 Statement

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象:

  • Statement:用于执行不带参数的简单 SQL 语句。

  • PrepareStatement:1.用于执行带或者不带参数的 SQL 语句。2.SQL 语句会预编译在数据库系统。3.执行速度快于 Statement 对象。4.可以阻止常见的 SQL 注入。5.占位符不能使用多值。

  • CallableStatement:用于执行数据库存储过程的调用

在实际开发中我们使用 PrepareStatement 比较多,它是 Connection 类的方法:

//先用 一个字符串 sql 来记录操作
String sql = "select * from student where name = '张三'";
//创建 preparedStatement
PreparedStatement preparedStatement = connection.prepareStatement(sql);

里面要传的参数 sql 是一个 字符串类型的参数,其实就是一个 SQL语句,只不过不用额外加分号“;” ~~

JDBC --- Java的数据库编程_第6张图片

4. 使用操作命令来执行 SQL

主要掌握两种执行 SQL语句 的方法:

  • executeQuery() 方法执行后返回单个结果集,通常用于 select 语句。

  • executeUpdate() 方法返回值是一个整数,表示受影响的行数,通常用于 update、insert、delete 语句。

这两个方法都是 preparedStatement

executeQuery() 方法 返回的结果集可以使用 ResultSet类对象来接收:

ResultSet resultSet = preparedStatement.executeQuery();

executeUpdate() 方法返回的结果是一个整数表示受影响的行数:

String sql2 = "insert into student values (12,'王五'), (13,'赵六')";
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
int res = preparedStatement2.executeUpdate();
System.out.println(res);// 结果为:2

5. 处理结果集 ResultSet

        ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供 了对这些行中数据的访问。

        ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当 前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next() 方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环

处理结果集应与业务需求相结合,这里我们将这个结果集打印出来即可:

while (resultSet.next()) {
    System.out.println("id = " + resultSet.getInt("id"));
    System.out.println("name = " + resultSet.getString("name"));
}

6. 释放资源

这里一共有三个资源需要释放:

① resultSet 结果集

②preparedStatement

③connect

    try {
            if(resultSet != null){//都是在不为空的情况下再释放
                resultSet.close();
            }
            if(preparedStatement != null){
                preparedStatement.close();
            }
            if(connection != null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("数据库错误");
        }

完整代码:

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

import javax.sql.*;
import java.sql.*;

public class Main {
    public static void main(String[] args) throws SQLException {

        //①引入依赖

        //②创建数据库连接 Connection
        //创建 DataSource 对象
        DataSource dataSource = new MysqlDataSource();

        //设置 url
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");

        //设置用户
        ((MysqlDataSource)dataSource).setUser("root");

        //设置密码
        ((MysqlDataSource)dataSource).setPassword("123456");

        //建立连接
        Connection connection = dataSource.getConnection();


        //③创建操作命令 Statement
        //先用 一个字符串 sql 来记录操作
        String sql = "select * from student where name = '张三'";
        //创建 preparedStatement
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //④使用操作命令来执行 SQL
        ResultSet resultSet = preparedStatement.executeQuery();

//        // executeUpdate()方法
//        String sql2 = "insert into student values (12,'王五'), (13,'赵六')";
//        PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
//        int res = preparedStatement2.executeUpdate();
//        System.out.println(res);// 结果为:2

        //⑤处理结果集 ResultSet
        while (resultSet.next()) {
            System.out.println("id = " + resultSet.getInt("id"));
            System.out.println("name = " + resultSet.getString("name"));
        }

        //⑥释放资源
        try {
            if(resultSet != null){//都是在不为空的情况下再释放
                resultSet.close();
            }
            if(preparedStatement != null){
                preparedStatement.close();
            }
            if(connection != null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("数据库错误");
        }
        
    }
}

占位符

如果我们想让用户自行决定要插入的数据,那应该怎么做呢?

☕(1) 让用户自行输入要插入的数据:

        //③创建操作命令 Statement
        //让用户自行输入要插入的数据
        Scanner sc = new Scanner(System.in);
        int id = sc.nextInt();// 14
        String name = sc.next(); // 吴彦祖

(2) 用户输入之后,把 id,和 name 替换到 sql 语句里面,在 sql语句 的values 当中用 ?代替:

        //用户输入之后,把 id,和 name 替换到 sql 语句里面,在 sql语句 的values 当中用 ?代替:
        String sql = "insert into student values (?,?)";

(3) 这两个问号 ? 就是表示当前字段的值还没有确定,先来占个位置,再使用 PreparedStatement 的 setXXX 系列方法进行替换:

        //使用 PreparedStatement 的 setXXX 系列方法进行替换:
        preparedStatement.setInt(1, id);
        preparedStatement.setString(2, name);

执行完  executeUpdate() 方法之后,我们发现数据库里的数据改变了~~

JDBC --- Java的数据库编程_第7张图片

 

以上就是 JDBC 的基本操作,上面我们演示了 查找 和 插入 的操作,而 删除 和 更新 操作也是同理,大家可以自己试一试~~

下面给大家两道常见面试题:

1. 数据库连接有哪些方式?它们有什么区别?

2. 数据库Statement和PreparedStatement有什么区别?

这两个问题都在上述内容给大家解释过了哦~~

JDBC --- Java的数据库编程_第8张图片

你可能感兴趣的:(MySql,java,数据库,mysql)