
🌸雨落在了我的手上:个人主页
🐟个人仓库: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 处理结果集)
[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语句和处理数据库执⾏结果。

-
JDBC的应⽤场景
-
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都可以获取到数据库连接,但它们之间存着着⼀些区别,主要在于连 接的管理⽅式和资源利⽤效率
• 连接管理⽅式不同:
- 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开始,按照从左 到右的顺序读取。