JDBC 编程

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

引言



1. JDBC 编程是什么


JDBC,即 Java Database Connectivity,即 Java 数据库连接。是一种用于执行 SQL 语句的 Java API,它是 Java中的数据库连接规范。这个 API 为 Java 开发人员操作数据库提供了一个标准,可以为多种关系数据库提供统一访问。

API:Application Programming Interface(应用程序接口)


2. JDBC 的存在优势


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

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

③ 程序的可移植性大大增强,这和 Java 的特性是一样的,所以这正是 Java 语言拥有 JDBC 编程的原因。


一、引入 JDBC 相关依赖



1. 去 maven 仓库直接搜索 mysql,选择如下分组。


a6d38f51371341d195eaa38cb5bca1d8.png


2. 找到一个与我们数据库的大版本号匹配的一个依赖版本。


a4ff98e67291457494c448aae1b55565.png


3. 复制到 maven 项目中的 " pom.xml " 文件中。


7616d7796aed4dc0858b2a8793ce9f35.png


4. 点击右侧的 " Maven ",并刷新。


dc21c417710646bb8b92a6e478ea546b.png


5. 根据引入的依赖名字,在 IDEA 中搜索,如果找到的目录下如下,即可正常使用 JDBC 编程了。


d7816e045cdf4da08b84b1b49e0fa296.png


二、JDBC 编程的基本流程



1. 创建数据源


DataSource 是一个接口。不能直接实例化,必须通过 它的实现类 MysqlDataSource 来实例化对象,而这个对象就相当于描述了数据库服务器在哪。


第一条语句:向上转型

后三条语句:向下转型


DataSource dataSource = new MysqlDataSource(); //向上转型
//设置数据库所在的地址
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
//设置登录数据库的用户名
((MysqlDataSource) dataSource).setUser("root");
//设置登录数据库的密码
((MysqlDataSource) dataSource).setPassword("12345678");
//向下转型


解析上面的代码。


(1) setURL 方法中的 URL 是什么?

URL:Uniform Resource Locator 【统一资源定位符】

URL 是网络服务程序上用于指定信息位置的表示方法,简单地说,就是网址。


248e0176d53c4f9c90b56cf2d3848730.png


(2) setUser 方法中的 root 是什么?

root 是 MySQL 管理员默认自带的管理员用户。

(3) setPassword 方法中,填的就是我们安装 MySQL 时设置的密码。


2. 让代码和数据库之间建立连接


Connection connection = dataSource.getConnection();


选择 Connection 接口时,注意选择的是 java,.sql 下的包。


590b6d9ebfb7433582f35a4bea402606.png


同时记得在方法中抛出异常。


为什么会需要我们抛出异常呢?抛出异常就证明,在后面写的代码中,程序非常有可能会发生异常,也许是受查异常,也许是非受查异常。举个例子,当你想与服务器建立连接的时候,你给的 URL 地址出错了,这就会发生异常,再举个列子,如果你的 URL 给对了,但密码又给错了,这是不是也无法让代码与服务器建立连接呢?


efb2132755b1499fbcd3e5ad159e2721.png


3. 操作数据库


我们举一个插入数据表的一个例子,注意写法。


// 此处光是一个 String 类型的 SQL 还不行,需要把这个 String 包装成一个 "语句对象"
String sql = " insert into student values( 1, 'Jack' ) " ;
PreparedStatement statement = connection.prepareStatement(sql);


上面的操作旨在与将一个字符串风格的 SQL 语句转换成一个 JDBC 中的对象,后面我们需要通过 statement 执行其他操作。


4. 执行 SQL


//如果是 insert,update,delete 都是用 executeUpdate 方法
//如果是 select,使用 executeQuery 方法
int ret = statement.executeUpdate();
System.out.println(ret);


上面接收的返回值就表示当前这个操作,影响到了几行 ( 即哪一行被操作成功了,哪一行被操作失败了 ),对应 cmd 窗口的下列输出。本质上就是当一个 SQL 语句执行完之后,服务器给你的提示。


f99253c2ce1d4a899d41a1e2b9433d04.png


5. SQL 执行完毕,释放资源


// 先创建的,后释放;后创建的,先释放
// 先打开冰箱,后打开抽屉;而先关闭抽屉,后关闭冰箱
statement.close();
connection.close();


这和 C语言中的 free 方法很像,只不过 C语言中 free方法需要搭配 malloc 方法使用。本质上就是说,把之前在内存中执行的资源释放掉,那么新空出来的内存供给其他使用。


而 Java 中自带垃圾回收机制,JVM 可以自动释放内存。但在这里连接的时候,情况又有不同,JVM 会从系统中申请到一些硬件资源,所以当 SQL 执行完后,还是得记得释放。


三、总结 JDBC 中的一些接口、类



JDBC 编程中常用的一些接口、 类:


1. DataSource 接口 / MysqlDataSource 类


用来描述数据源和描述数据库的地址,( 端口,数据库名,用户名,密码)

我们常用 getConnection 方法


2. Connection 接口


表示数据库连接

我们常用 prepareStatement 方法


3. PreparedStatement 接口


通过这个对象来描述要执行的SQL,还可以对 SQL 进行动态拼接。

我们常用 executeUpdate/executeQuery 方法


注意:


不管 JDBC 编程使用了什么类、什么接口,也不管代码是怎么编程的,但有一点我们需要明确:核心永远在 SQL 语句上。 因为 JDBC 代码始终是固定写法,不管底层是怎么实现的,或许我们不理解它的原理,多写几次代码,依然能记住。但 SQL 语句就不一样了,本质上,就是 SQL 对数据库起直接作用。


四、测试代码



1. 插入数据


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 Test1 {
    public static void main(String[] args) throws SQLException {
        //1. 创建好数据源
        DataSource dataSource = new MysqlDataSource();
        //设置数据库所在的地址
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test6?characterEncoding=utf8&useSSL=false");
        //设置登录数据库的用户名
        ((MysqlDataSource) dataSource).setUser("root");
        //设置登录数据库的密码
        ((MysqlDataSource) dataSource).setPassword("12345678");
        //2. 让代码和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3. 操作数据库
        String sql = " insert into student values( 1, 'Jack' ) " ;
        PreparedStatement statement = connection.prepareStatement(sql);
        //4. 执行 SQL
        int ret = statement.executeUpdate();
        System.out.println(ret);
        //5. sql 执行完毕,需要释放资源
        statement.close();
        connection.close();
    }
}


输出结果为:1 (表示插入一行成功)


f257cd9b56154bc399cad8a7a6abfa9f.pngaaed5b188cbf4eef987c88427bddda25.png


2. 以占位符的形式添加数据


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 Test2 {
    public static void main(String[] args) throws SQLException {
        //1. 创建好数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test6?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234567");
        //2. 让代码和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //2.1 让用户通过控制台输入一下待插入的数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入学号: ");
        int id = scanner.nextInt();
        System.out.println("输入姓名: ");
        String name = scanner.next();
        //3. 操作数据库
        String sql = " insert into student values(?,?) " ;
        PreparedStatement statement = connection.prepareStatement(sql);
        //3.1 进行替换操作
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("statement: " + statement);
        //4. 执行 SQL
        int ret = statement.executeUpdate();
        System.out.println(ret);
        //5. sql 执行完毕,需要释放资源
        statement.close();
        connection.close();
    }
}


我们可以通过控制台输入来执行输入对应的字段值。

输出结果:下面的红色框框,我们可以验证是否正确插入。


91af8b0eab9d4fd1a207fa002215fb43.png

fe4d0d195fcc4bd1b71ef01ec54c07de.png


看看下列四行代码,是否有些疑惑?


String sql = " insert into student values(?,?) " ;
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("statement: " + statement);


针对这四行代码,解释如下图:

" ? " 表示占位符,相当于告诉 Java,这两个待插入的值还未确定,而第一个问号索引是从 1 开始的,第二个索引为2,依次往后… 其中,set 方法表示替换


而我们打印出来 statement 就是为了检查替换是否正确 !


7a78baf3e5e447478a1d874092e90120.png


3. 删除数据


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;
/**
 * 根据学生 id 进行删除操作
 */
public class Test3 {
    public static void main(String[] args) throws SQLException {
        //1. 创建好数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test6?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234567");
        //2. 让代码和数据库建立连接
        Connection connection = dataSource.getConnection();
        //3. 输入需要删除的学号
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入学号:");
        int id = scanner.nextInt();
        //4. 操作数据库
        String sql = "delete from student where id = ?" ;
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        System.out.println("statement: " + statement);
        //5. 执行 SQL
        int ret = statement.executeUpdate();
        System.out.println("ret: " + ret);
        //6. SQL 执行完毕,需要释放资源
        statement.close();
        connection.close();
    }
}


输出结果:


56ed9e677c314c29b358ce5f11646f1b.png

da768f093da44c34bae3f2960a332bfc.png


现在再看 测试3 的代码时,就很简单了,因为套路是一样的,JDBC 编程实现 增、删、改 的基本流程都是固定的。针对 SQL语句的 update 操作,我就不演示了,思想和上面都是相同的。


4. 查询数据


在测试4 中,我们演示了查询操作,查询操作比较于增删改,多了一个步骤:遍历结果集,即把结果中的数据获取到。


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 Test4 {
    public static void main(String[] args) throws SQLException {
        //1. 创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test6?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234567");
        //2. 建立连接
        Connection connection = dataSource.getConnection();
        //3. 操作数据库
        String sql = " select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
        //4. 执行 SQL
        // 查询操作与 增删改 不同,它始终是一个临时表,我们将临时表用 resultSet 接收
        ResultSet resultSet = statement.executeQuery();
        //5. 遍历 resultSet,固定写法
        //先获取到某一行,再获取到这一行的所有列
        //next 方法表示获取到一行数据,同时把光标往后移动一行
        //如果遍历到表的末尾,此处的 next 直接返回 false
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println( "id= " +id + ", name= " +name);
        }
        //6. 释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}


输出结果:


ded8366cd29f4f54aa2d256f0e508e0e.png


对应 cmd 控制台:


0a0c5c05627746f59cd53de28793e67f.png


分析结果集


分析 while 循环,这是一种固定写法。


针对结果集,我们依次获取到表中的每一行,再通过这一行来获取此行对应的列。


第一次执行 resultSet.next(),表示获取到了第一行( id = 1 )

第二次执行 resultSet.next(),表示获取到了第二行( id = 2 )

第三次执行 resultSet.next(),由于表到达了末尾,next 方法返回了 false,循环结束。


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


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