MySQL数据库基础(14):JDBC编程

🌸雨落在了我的手上:个人主页

🐟个人仓库:Gitee仓库

❄️个人专栏:<<JaveSe>> <<C语言>> <<C语言数据结构>> <<Java数据结构*** >>***

<<MySQL数据库基础 >>

🔥🔥🔥人生格言:无人扶我青云志,我自踏雪至山巅

🎬 博主简介


目录

[1. 本节⽬标](#1. 本节⽬标)

[2. 什么是JDBC](#2. 什么是JDBC)

[3. 为什么要使⽤JDBC](#3. 为什么要使⽤JDBC)

[4. 使⽤JDBC](#4. 使⽤JDBC)

[4.1 获取MySQL驱动包](#4.1 获取MySQL驱动包)

[4.2 建⽴数据库连接](#4.2 建⽴数据库连接)

[4.3 创建Statement](#4.3 创建Statement)

[4.4 执⾏SQL语句](#4.4 执⾏SQL语句)

[4.5 处理结果集](#4.5 处理结果集)

4.6释放资源

[5. JDBC常⽤接⼝和类](#5. JDBC常⽤接⼝和类)

[5.1 DriverManager 和DataSource](#5.1 DriverManager 和DataSource)

[5.2 DriverManager 与DataSource的区别](#5.2 DriverManager 与DataSource的区别)

[5.3 Connection 数据库连接](#5.3 Connection 数据库连接)

[5.4 Statement对象](#5.4 Statement对象)

[5.5 ResultSet结果集](#5.5 ResultSet结果集)


内容大纲:

本文系统介绍了JDBC的核心概念与使用流程,涵盖其作用、工作原理及应用场景。重点讲解了JDBC的六大步骤:加载驱动、建立连接、创建Statement/PreparedStatement、执行SQL、处理结果集及释放资源。对比了DriverManager与DataSource的优劣,强调推荐使用DataSource实现连接池以提升性能。详细说明了Connection、Statement、PreparedStatement和ResultSet等核心接口的用法,特别指出PreparedStatement可有效防止SQL注入。通过实例演示了数据库查询与更新操作,帮助开发者掌握Java与数据库交互的关键技术。


1. 本节⽬标

掌握JDBC常⽤接⼝和类

熟练使⽤JDBC进⾏数据库交互

2. 什么是JDBC

JDBC(JavaDataBaseConnectivity,Java数据库连接)是Java程序和数据库之间的桥梁,包含 了⼀套Java定义的⽤于执⾏SQL语句的接⼝,使开发者能够编写数据库的程序。JDBC的主要作⽤是: 与数据库建⽴连接、发送SQL语句和处理数据库执⾏结果。

  1. JDBC的应⽤场景

  2. JDBC⼯作原理

JDBC⼯作原理简洁地概括为:加载驱动、建⽴连接、创建Statement、执⾏SQL、处理结果和 关闭资源。

3. 为什么要使⽤JDBC

• ⾸先回顾⼀下使⽤客⼾端操作数据库的过程,主要分为以下⼏步:

a. 连接到数据库服务

b. 发送SQL语句

c. 得到返回结果并显⽰

d. 关闭连接

• 同样如果使⽤程序操作数据库也会经历以上⼏步,⼤家应该可以想到,为实现上述步骤,可以编写 相应的代码实现数据库连接,发送SQL语句,处理结果并显⽰,最后关闭连接。

• 但是不同的数据库对于同⼀个操作不论是协议还是参数都各有不同,如果让程序员⾃⼰去实现,那 就必须针对不同的数据库进⾏编码实现,这个⼯作量和维护成本显然太⼤。

• Java采取的做法是把以上操作步骤定义了相应的接⼝,具体的实现交给数据库⼚商去做,Java程序 员只需要按照需要调⽤接⼝中定义的⽅法即可,这样不论使⽤什么数据库,都对于Java程序没有任 何影响,即便是换⼀个数据库,也只需要换⼀下相应⼚商的实现依赖。

• JDBC使⽤过程可以概括为:加载数据库⼚商的驱动包、建⽴连接、创建Statement、执⾏SQL、 处理结果释放资源和关闭连接。

4. 使⽤JDBC

4.1 获取MySQL驱动包

• 在Maven仓库mvnrepository.com搜索MySQL,找到最新版的驱动包

4.2 建⽴数据库连接

• 通过数据源 DataSource 对象获取,推荐在实际开发中应⽤这种⽅式

java 复制代码
// 设置数据源的连接串、用户名和密码
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/jobs_info_db?
characterEncoding" +
                "=utf8&allowPublicKeyRetrieval=true&useSSL=false");
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("123456");
// 把mysqlDataSource 转换为JDBC的dataSource
DataSource dataSource = mysqlDataSource;

MySQL数据库连接URL格式:jdbc:mysql://服务器地址:端口/数据库?参数名=值[&参数名=值]...

4.3 创建Statement

• Statement是⽤于执⾏静态SQL语句并返回执⾏结果的对象

java 复制代码
// 通过connection获取statement对象
Statement statement = connection.createStatement();

4.4 执⾏SQL语句

• 执⾏select查询时返回的是⼀个结果集,⽤ResultSet接收

• 执⾏insert,update,delete操作时,返回的是受影响的⾏数,⽤int类型接收

java 复制代码
// 执行select语句,并接收结果集
ResultSet resultSet = statement.executeQuery("select id, name, sno, age,
gender, enroll_date, class_id from student");

// 执行insert, update, delete语句,并接收受影响的行数
int row = statement.executeUpdate("update student set age = 20 where id = 2");

4.5 处理结果集

如果返回的是⼀个结果集,则需要遍历这个集合获取对应列的值,具体代码如下:

java 复制代码
// 遍历结果集获取数据
while (resultSet.next()) {
    // 编号
    long id = resultSet.getLong("id");
    // 姓名
    String name = resultSet.getString("name");
    // 学号
    String sno = resultSet.getString("sno");
    // 年龄
    int age = resultSet.getInt("age");
    // 性别
    byte gender = resultSet.getByte("gender");
    // 入学时间
    Date enrollDate = resultSet.getDate("enroll_date");
    // 班级编号
    long classId = resultSet.getLong("class_id");
    // TODO: 使用获取到的值...
}

4.6释放资源

• 在整个数据库访问过程中创建的对象都需要释放,包括:ResultSet,Statement和Connection, 后创建的先释放

java 复制代码
// 释放结果集
if (resultSet != null) {
    try {
        resultSet.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
// 释放statement
if (statement != null) {
    try {
        statement.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
// 关闭连接
if (connection != null) {
    try {
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

5. JDBC常⽤接⼝和类

5.1 DriverManager 和DataSource

• DataSource驱动管理类,⽤于管理JDBC驱动程序,可以从驱动程序中获取数据库连接,始于 JDK1.1。

• DataSource数据源是DriverManager的替代⽅案,始于JDK1.4,是获取数据库连接的⾸选⽅法, 推荐使⽤。

5.2 DriverManager 与DataSource的区别

• DriverManager和DataSource都可以获取到数据库连接,但它们之间存着着⼀些区别,主要在于连 接的管理⽅式和资源利⽤效率

• 连接管理⽅式不同:

  1. DriverManager每次调⽤getConnection⽅法都会初始化⼀个新的连接,使⽤完成后会关闭真实 连接,导致资源浪费

2.DataSource使⽤了连接池的技术,会在初始化时创建⼀定数量的数据库连接,这些连接可以重 复使⽤,关闭时并不是真正关闭连接,⽽是将连接归还给连接池,以供后续使⽤,有效地提⾼ 资源利⽤率和和性能

5.3 Connection 数据库连接

数据库连接(会话)对象,在连接的上下⽂中执⾏SQL语句并返回结果

5.4 Statement对象

Statement

• ⽤于执⾏静态SQL语句并返回执⾏结果,由于只能执⾏静态语句,所以这⾥会有⼀个问题,假设⼀ 个语句中需要动态的参数,⽐如where⼦句中的条件,那么只能通过字符串拼接的⽅式组装完成的 SQL语句,⽐如:

java 复制代码
String sql = "select * from student where name = '" + name + "' and class_id = " + classId;

• 字符串拼接形式构造SQL语句时,如果不处理参数中的特殊字符就会造成SQL注⼊,这是⼀个⾮常 严重的安全性问题。

PreparedStatement

预编译SQL语句对象,SQL语句被预编译并存储在PreparedStatement对象中,可以使⽤该对象多次 执⾏SQL语句,同时可以解决SQL注⼊问题。

示例:通过Connection对象获取到PreparedStatement对象,需要传入SQL模板,动态参数用占位符 ? 表示

java 复制代码
// 获取了个处理SQL的PrepareStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("select id, name, sno, age, gender, enroll_date, class_id from student where name = ? and class_id = ?");

• 为动态参数设置真实值,下标从1开始

java 复制代码
// 用真实值去替换占位符
preparedStatement.setString(1, "宋江");
preparedStatement.setLong(2, 2);

• 执⾏SQL语句

java 复制代码
// select 操作
ResultSet resultSet = statement.executeQuery();

// insert, update, delete操作
int result = statement.executeUpdate();

executeQuery()

执⾏结果返回的是⼀个结果集,通常⽤于select操作

executeUpdate()

执⾏结果返回的是⼀个整形,通常⽤于insert,update,delete操作

5.5 ResultSet结果集

• 是⼀个查询结果集的数据表,通常由执⾏查询操作的语句⽣成

• ResultSet对象维护了⼀个指向当前数据⾏的游标,最初游标位于第⼀⾏之前,调⽤next⽅法将游 标移动到下⼀⾏,当ResultSet中没有更多的数据⾏时返回false,所以可以在while循环中使⽤它来 遍历结果集。

• ResultSet接⼝提供了getter⽅法(getBoolean、getLong等),⽤于从当前⾏检索列值,可以使⽤列 的索引号或列的名称来检索值。⼀般来说,使⽤列索引会更有效率,索引编号从1开始,按照从左 到右的顺序读取。

相关推荐
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】Elasticsearch 从安装到 C++ 客户端二次封装全落地
linux·网络·数据库·c++·elasticsearch·微服务
执笔为剑1 小时前
2.1.3、兼容MySQL特性-(数据类型、函数、系统视图、SQL、PL与SQL)
mysql
kyle~1 小时前
DTO --- 数据封装
数据库·oracle·前后端
vx_Biye_Design2 小时前
PHP中医养生馆预约系统60841-计算机课程设计、毕业设计
vue.js·spring boot·后端·mysql·php·课程设计·express
Nebula_g2 小时前
云禾外卖补充—项目整体后端运行逻辑-对流程的更深层次理解
java·开发语言·网络·数据库·状态模式·javase
太理摆烂哥2 小时前
MySQL数据类型
数据库·mysql
程序员小孔.2 小时前
基于 SpringBoot + UniApp + Vue 的家政服务系统设计与实现
前端·数据库·spring boot·python·docker·微信小程序
执笔为剑2 小时前
2.1.3-1、兼容MySQL特性-(数据类型、函数、SQL、PL与SQL)
mysql
草莓熊Lotso6 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd