MySQL JDBC 编程

目录

1. 数据库编程的必备条件

2. Java的数据库编程:JDBC

2.1 JDBC 定义 

 2.2 JDBC 工作原理

3.JDBC 使用

3.1 创建项目并添加 MySQL 驱动

 3.2 使用代码操作数据库

 3.2.1 获得数据源

3.2.2 获得连接

3.2.3 获得执行器

 3.3.4 查询或操作数据库

3.3.5 关闭数据库连接

 4. 查询功能实现


1. 数据库编程的必备条件

  • 编程语言:如JavaCC++Python
  • 数据库:如OracleMySQLSQL Server
  • 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提 供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。

2. Java的数据库编程:JDBC

在了解 JDBC 概念之前,我们先来想几个问题:

  • 不同数据库⼚商的数据库驱动⼀样吗?
  • 不同数据库⼚商的 API 调⽤⼀样吗?
  • 使⽤ Java 程序只操作 MySQL 吗?还是有可能操作 Oracle、Sql Server、DB2 等数据库?

        以上的答案都是否定的,也就是说不同⼚商提供了不同的数据库驱动,提供了不同的 API 接⼝,那我们的Java 程序要怎么实现?

        难道是针对⼀个数据库写⼀套调⽤的⽅法吗?因为驱动和 API 完全不同,所以不同的数据操作也是不同 的,要针对每种数据库写⼀套调⽤代码就太麻烦了,那要怎么办?

解决以上问题的办法就是使用 JDBC

2.1 JDBC 定义 

        JDBC,即 Java Database Connectivity,Java 数据库连接。是⼀种⽤于执行 SQL 语句的 Java API, 它是 Java 中的数据库连接规范。这个 API 由 java.sql.*,javax.sql.* 包中的⼀些类和接⼝组成,它为 Java 开发人员操作数据库提供了⼀个标准的 API,可以为多种关系数据库提供统⼀访问。

        简单来说,使用了 JDBC 之后,不管是什么数据库与什么数据库驱动,我们只需要使用⼀套标准代码就可以实现对不同数据库进行统⼀操作(添加、修改、删除、查询),也就解决了我们上面说的那些问题了。 

 2.2 JDBC 工作原理

        JDBC 为多种关系数据库提供了统⼀访问⽅式,作为特定⼚商数据库访问 API 的⼀种⾼级抽象, 它主要包含⼀些通⽤的接⼝类。

JDBC 访问数据库层次结构:

JDBC 优势:

  •  Java 语⾔访问数据库操作完全⾯向抽象接⼝编程。
  • 开发数据库应⽤不⽤限定在特定数据库⼚商的 API。
  • 程序的可移植性⼤⼤增强。

3.JDBC 使用

JDBC 操作步骤如下: 

3.1 创建项目并添加 MySQL 驱动

        创建⼀个 Java 项⽬,并添加 MySQL 驱动(mysql-connector-java-5.1.47.jar),需要注意不同数据库版本要对应相应的驱动包。
        操作步骤:点击项⽬属性 -> Modules -> Dependencies -> 点击“+”号 -> 1.Jars or directories -> 选择驱动包 -> 点击 OK 确认。

 

 3.2 使用代码操作数据库

操作数据库 MySQL 提供了两种操作 API:

  • DriverManager
  • DataSource(推荐使用

接下来咱们使⽤ DataSource 来实现操作数据库。

使用代码操作数据库分为以下 5 个步骤: 

  1. 获取数据源(准备⼯作,点击 MySQL 连接⼯具,并输⼊⽤户名、密码)
  2. 获取连接(敲击回车试图建⽴客户端和服务器端的连接)
  3. 获取执行器(连接到服务器并切换到数据库)
  4. 查询或操作数据库(输⼊命令,并得到结果)
  5. 关闭连接(关闭客户端)

 3.2.1 获得数据源

        数据源是 MysqlDataSource,获取⽅式如下,需要输⼊数据库连接的 MySQL 服务器地址、⽤户名和密码:

        // 1.获取数据源 DataSource (设置MySQL的服务器地址)
        MysqlDataSource dataSource = new MysqlDataSource();
        // 1.1 设置连接的 MySQL 服务器
        dataSource.setURL("jdbc:mysql://127.0.0.1:3306/study?characterEncoding=utf8&useSSL=true");
        // 1.2 设置⽤户名
        dataSource.setUser("root");
        // 1.3 设置密码
        dataSource.setPassword("12345678");

 

注意:如果操作过程中出现了错误,可尝试将useSSL改为false,因为有些电脑不支持SSL加密。

3.2.2 获得连接

        // 2.得到连接 Connection
        Connection connection = dataSource.getConnection();

        连接对象是 Connection,注意此步骤操作容易出错,⼀定是 java.sql 包下的 Connection 对象:

3.2.3 获得执行器

执行器是用来执行 SQL 命令的,执行器有三种:

  • Statement
  • PreparedStatement
  • CallableStatement

实际开发中最常⽤的是 PreparedStatement 对象,PreparedStatement 优点如下:

 具体实现如下:

        // 3.得到执行器 (组装MySQL)
        String insertSql = "insert into city(id, name) values(?, ?)";
        PreparedStatement statement = connection.prepareStatement(insertSql);
        // 填充占位符
        statement.setInt(1, 5);
        statement.setString(2, "广东");

 PreparedStatement 有主要两种重要的方法

  • executeQuery():方法执行后返回单个结果集的,通常用于 select 语句。
  • executeUpdate():方法返回值是⼀个整数,指示受影响的行数,通常用于 update、insert、 delete 语句。

 3.3.4 查询或操作数据库

        添加数据库使用 PreparedStatement.executeUpdate() 方法,返回⼀个 整数,具体实现代码如下:

        // 4.执行 SQL
        int result = statement.executeUpdate();
        System.out.println("受影响的行数:" + result);

3.3.5 关闭数据库连接

        关闭数据库连接是为了不浪费 MySQL 服务器端的资源,最终实现代码:

package city_jdbc;

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

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

public class AddCity {
    public static void main(String[] args) throws SQLException {
        // 1.获取数据源 DataSource (设置MySQL的服务器地址)
        MysqlDataSource dataSource = new MysqlDataSource();
        // 1.1 设置连接的 MySQL 服务器
        dataSource.setURL("jdbc:mysql://127.0.0.1:3306/study?characterEncoding=utf8&useSSL=true");
        // 1.2 设置⽤户名
        dataSource.setUser("root");
        // 1.3 设置密码
        dataSource.setPassword("12345678");

        // 2.得到连接 Connection
        Connection connection = dataSource.getConnection();

        // 3.得到执行器 (组装MySQL)
        String insertSql = "insert into city(id, name) values(?, ?)";
        PreparedStatement statement = connection.prepareStatement(insertSql);
        // 填充占位符
        statement.setInt(1, 5);
        statement.setString(2, "广东");

        // 4.执行 SQL
        int result = statement.executeUpdate();
        System.out.println("受影响的行数:" + result);

        // 5.关闭资源(从小到大)
        statement.close();
        connection.close();
    }
}

运行结果: 

 4. 查询功能实现

        查询数据库使用 PreparedStatement.executeQuery 方法,返回⼀个 ResultSet 对象,具体实现代码如下:

package city_jdbc;

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

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

public class SelCity {
    public static void main(String[] args) throws SQLException {
        // 1.获取数据源,得到DataSource
        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setURL("jdbc:mysql://127.0.0.1:3306/study?characterEncoding=utf8&useSSL=true");
        dataSource.setUser("root");
        dataSource.setPassword("12345678");

        // 2.得到连接
        Connection connection = dataSource.getConnection();

        // 3.得到执行器,并组装MySQL
        String selectSql = "select * from city where id<?";
        PreparedStatement statement = connection.prepareStatement(selectSql);
        statement.setInt(1, 10);

        // 4.执行SQL,打印查询结果
        ResultSet resultSet = statement.executeQuery(); // 得到结果集
        while (resultSet.next()) { // 如果结果集的下一行有数据
            City city = new City();
            // resultSet.getInt("id") ——> 查询当前行中列名为“id”的值
            city.setId(resultSet.getInt("id"));
            city.setName(resultSet.getString("name"));
            System.out.println(city);
        }

        // 5.关闭资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

        ResultSet 对象它被称为结果集,它代表符合 SQL 语句条件的所有行,并且它通过⼀套 getXXX 方法提供了对这些行中数据的访问。
        ResultSet 里的数据一行一行排列,每行有多个字段,并且有⼀个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某⼀条记录,就要使用 ResultSetnext() 方法 ,如果我们想要得到 ResultSet 里的所有记录,就应该使用 while 循环。

 City 类

public class City {
    int id;
    String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "city_jdbc.City{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

运行结果:

 

 可以观察到查询结果正确。

猜你喜欢

转载自blog.csdn.net/m0_59140023/article/details/124151281