从零开启 JDBC 编程

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 从零开启 JDBC 编程

前言

最近在总结MyBatis的时候了解到,MyBatis的底层使用的就是JDBC,仔细想想JDBC是我很久之前学过的东西了,现在难免有些遗忘,所以打算重新拿出来写一下,毕竟理解了JDBC的工作原理和原始API的使用,对理解框架也会有很大的帮助。

                                    <---------------- 正文开始 ---------------->


真正在公司中操作数据库,99%是通过代码来操作的,很少会手动在客户端里输入sql语句。各种数据库:MySQL,Oracle,SQL Sever…… 在开发的时候,就会提供一组编程接口(API),这些数据库提供的API不同,给程序员的学习带来了很大压力,于是Java官方定义了自己的数据库接口规范—— JDBC。

一、导入驱动依赖

数据库厂商提供一个程序来完成API的转换,对原生API封装,在提供成JDBC形状。java程序员想要进行数据库开发就需要在你的项目中导入对应 数据库的驱动包 才能编写代码。关于驱动包的获取,可以在Maven中央仓库中获取:https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.49


PS:注意驱动包的版本,大版本要和数据库服务器匹配,比如我当前的数据库服务器版本是MySQL5.7,那么驱动版本需要是 5.x。

我们以一个Maven项目为例,只需要在 pom.xml 中导入以下依赖即可:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>


二、建立数据库连接

1、创建并初始化数据源

在JDBC编程中,数据源(DataSource)是一个提供数据库连接的对象,它通常包含了数据库的URL、用户名和密码等信息。

//1.创建并初始化数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

二、建立数据库连接

1、创建并初始化数据源

在JDBC编程中,数据源(DataSource)是一个提供数据库连接的对象,它通常包含了数据库的URL、用户名和密码等信息。

//1.创建并初始化数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

PS:jdbc:mysql://数据库服务器IP地址:数据库服务器端口号/数据库名?characterEncoding=utf8&useSSL=false。这是数据库的连接字符串,可以认为是固定格式写死的。

2、和数据库服务器建立连接

//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();


三、创建Statement或PrepareStatement对象

StatementPrepareStatement都是通过建立的 connection 连接获取到的,用于执行SQL的接口:

Statement statement = connection.createStatement();
String sql = "SELECT * FROM mytable WHERE column = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

Statement对象用于执行静态的SQL语句,即在编写代码时已经确定了SQL语句的内容。这种方式是存在SQL注入风险的,因为使用Statement对象执行的SQL语句一般都是经过拼接而成的,如果传过来的参数存在SQL关键字就可能拼接出一条恶意的SQL。


PrepareStatement对象它通过预编译SQL语句,可以防止SQL注入攻击(前提是不使用拼接SQL)。PrepareStatement对象的SQL语句中可以包含占位符(例如?),在执行时需要为这些占位符指定具体的数值。这种方式可以有效地防止恶意输入对SQL语句的破坏。在实际开发中,推荐使用。

四、执行SQL语句

Statement对象执行SQL语句:

ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable");

PrepareStatement对象执行SQL语句:

// 设置参数
preparedStatement.setString(1, "somevalue");
ResultSet resultSet = preparedStatement.executeQuery();

五、处理结果

对于不同的SQL语句,执行后返回的结果是不一样的,但总体分为两大类:

  1. 增删改语句:返回 int 类型的受影响的行数。
  2. 查询语句:返回 ResultSet 类型的结果集。

对于 int 类型的受影响的行数这个都好理解,这里重点介绍一下 ResultSet 结果集。

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    double salary = resultSet.getDouble("salary");

    // 处理获取到的数据
    // ...
}

next() 是 ResultSet 接口提供的方法之一,用于在结果集中移动到下一行数据。它的作用是将指针从当前行移动到下一行,并返回一个布尔值,表示是否存在下一行数据。需要注意的是,第一次调用

.next() 方法将把指针移动到结果集的第一行(如果存在)。因此,在处理结果集之前,通常会先调用 .next()

方法一次,以确保指针指向第一行数据。


使用 ResultSet 对象提供的方法,您可以遍历获取查询结果集中的数据。常用的获取数据的方法包括getInt()、getString()、getDouble()等。

六、关闭连接

如果不主动关闭连接,这些资源将一直被占用,连接池中的连接数量会不断增加,而不会被回收,会导致内存泄漏的问题。

关闭连接的顺序是很重要的。应按照从小到大的顺序关闭资源,即按照申请资源的逆顺序进行:先关闭 ResultSet,再关闭 Statement 或 PreparedStatement,最后关闭 Connection.

// jdbc连接处理代码
// ...

// 关闭连接
// 1.如果在代码中使用了 ResultSet 对象,需要先关闭它。
resultSet.close();
// 2.关闭相应的 PreparedStatement 对象。
preparedStatement.close();
// 3.关闭与数据库的连接
connection.close();

为了确保资源的正确释放,避免遗忘,可以使用 try-with-resources 语句块来自动关闭资源:

try (
    Connection connection = DriverManager.getConnection(url, username, password);
    PreparedStatement statement = connection.prepareStatement(sql);
    ResultSet resultSet = statement.executeQuery()
) {
    // 处理查询结果
    // ...
} catch (SQLException e) {
    // 处理异常
    // ...
}

七、使用示例

正文部分到这里基本就结束了,下面给出使用JDBC进行 的示例供大家参考和进一步理解:

1、Insert-添加

public class JDBCinsert {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //1.创建并初始化数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("myname");
        ((MysqlDataSource)dataSource).setPassword("mypassword");

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

        //3.构造SQL语句
        String sql = "insert into student values(?,?)";

        //4.SQL预编译
        PreparedStatement statement = connection.prepareStatement(sql);
        System.out.print("请输入更新数据条目:");
        int n = scanner.nextInt();
        while (n!=0) {
            //5.用户输入
            System.out.print("请输入学生姓名:");
            scanner.nextLine();
            String name = scanner.nextLine();
            System.out.print("请输入学生id:");
            int id = scanner.nextInt();

            statement.setInt(1,id);
            statement.setString(2,name);

            //6.执行sql
            int ret = statement.executeUpdate();
            System.out.println("affected:"+ret);
            //打印拼接后结果
            System.out.println(statement);
            n--;
        }


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

2、delete-删除

public class JDBCdelete {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //1.创建并初始化数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("myname");
        ((MysqlDataSource)dataSource).setPassword("mypassword");

        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        //3.构造SQL语句
        String sql = "delete from student where id = ?";

        //4.让客户端对SQL进行预编译
        PreparedStatement statement = connection.prepareStatement(sql);
        int id = scanner.nextInt();
        statement.setInt(1,id);
        System.out.println(statement);

        //5.执行SQL语句
        int ret = statement.executeUpdate();
        System.out.println("affected:"+ret);

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

3、select-查询

public class JDBCselect {
    public static void main(String[] args) throws SQLException {
        //1.创建并初始化数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydata?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("Ls03313517");

        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        //3.构造SQL语句
        String sql = "select * from student";

        //4.让客户端对sql预编译
        PreparedStatement statement = connection.prepareStatement(sql);

        //5.执行SQL语句
        ResultSet resultSet = statement.executeQuery();

        //6.获取结果集合
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("学号:"+id+" 姓名:"+name);
        }

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

4、update-修改

public class JDBCupdate {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //1.创建并初始化数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("myname");
        ((MysqlDataSource)dataSource).setPassword("mypassword");

        //2.和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        //3.构造SQL语句
        String sql = "update student set name = ? where id = ?";

        //4.让客户端对SQL语句进行预编译
        PreparedStatement statement = connection.prepareStatement(sql);
        System.out.print("请输入需要修改条目对应id:");
        int id = scanner.nextInt();
        scanner.nextLine();
        System.out.print("请输入更新name:");
        String name = scanner.nextLine();
        statement.setInt(2,id);
        statement.setString(1,name);
        //打印构造完成的SQL语句
        System.out.println(statement);

        //5.执行SQL语句
        int ret = statement.executeUpdate();
        System.out.println("affected:"+ret);

        //6.释放资源
        statement.close();
        connection.close();
    }
}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
5月前
|
SQL Java 关系型数据库
Java中的JDBC编程详解
Java中的JDBC编程详解
|
5月前
|
SQL Java 关系型数据库
Java中的JDBC编程详解
Java中的JDBC编程详解
|
6月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
77 3
|
7月前
|
SQL Java 关系型数据库
Java之JDBC数据库编程
Java之JDBC数据库编程
44 2
|
7月前
|
SQL Java 关系型数据库
JDBC编程
JDBC编程
56 2
|
7月前
|
SQL Java 数据库连接
JDBC编程相关知识(实现图书管理系统进阶版)(下)
JDBC编程相关知识(实现图书管理系统进阶版)
46 0
|
7月前
|
Java 关系型数据库 MySQL
JDBC编程相关知识(实现图书管理系统进阶版)(上)
JDBC编程相关知识(实现图书管理系统进阶版)
75 0
|
7月前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
7月前
|
SQL Java 关系型数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
287 0