📃个人主页:island1314
🔥个人专栏:MySQL学习
⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞
🚀引言
🔥在Java编程世界中,数据库操作是不可避免的一部分,无论是开发企业级应用还是简单的数据管理系统,都需要与数据库进行交互。而 JDBC(Java Database Connectivity)正是Java提供的一套用于连接和访问数据库的API(应用程序接口)。通过JDBC,Java程序能够执行 SQL(Structured Query Language)语句,实现数据的查询、更新、插入和删除等操作。
1. JDBC 的介绍
☘️1.1 基本概念
🔥JDBC(Java Database Connectivity)是Java的一个标准扩展,是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由 java.sql.、javax.sql. 包中的一些类和接口组成。为Java开发人员操作数据库提供了一个标准的API,用于访问数据库。这意味着,只要数据库支持JDBC,那么任何Java程序都可以通过这套API与数据库进行交互,而无需担心底层数据库的具体实现细节。
🍀1.2 工作原理
JDBC访问数据库层次结构:
💢JDBC的工作原理可以概括为以下几个步骤:
① 加载和注册JDBC驱动:通过
Class.forName()
方法加载JDBC驱动,并将其注册到
DriverManager
中。(注:这个mysql5之后可以省略注册驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver,我们下面主要使用的是 DataSource 来建立数据库连接)
Class.forName("com.mysql.cj.jdbc.Driver");
② 建立数据库连接:使用
DriverManager.getConnection()
方法,根据提供的数据库URL、用户名和密码等信息,建立与数据库的连接。
Connection conn = DriverManager.getConnection(url, user, password);
③ 执行SQL语句:通过
Connection
对象创建
Statement
或
PreparedStatement
对象,然后使用这些对象执行SQL语句,根据类型不同,可以使用不同的方法。
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table_name"); // 查询
int rowsAffected = stmt.executeUpdate("INSERT INTO table_name VALUES (...)"); // 插入
④ 处理查询结果:如果执行的是查询操作,结果将存储在
ResultSet
对象中,那么可以通过
ResultSet
对象遍历查询结果。
while (rs.next()) {
System.out.println(rs.getString("column_name"));
}
⑤ 事务管理:JDBC 允许进行手动事务控制。可以设置自动提交为
false
,并在需要时提交或回滚事务 (这个暂时不涉及)
conn.setAutoCommit(false); // 关闭自动提交
// 执行多条 SQL 语句
conn.commit(); // 提交
// 或者
conn.rollback(); // 回滚
⑥ 关闭连接:操作完成后,需要关闭
ResultSet
、
Statement
和
Connection
对象,以释放数据库资源。
rs.close();
stmt.close();
conn.close();
🌿1.3 JDBC 的优缺点
🌈JDBC的优点
- 标准化:JDBC提供了一套标准接口,使得开发者能够以一致的方式与各种数据库交互。这降低了对不同数据库产品的依赖,增强了应用程序的可移植性和可维护性。
- 平台无关性:由于JDBC是Java技术的一部分,因此它继承了Java“一次编写,到处运行”的特性,可以在任何支持Java的平台上使用。
- 增强的开发效率:JDBC简化了数据库访问的复杂性,开发者可以通过简单的API调用来执行SQL命令,减少了代码量和出错的机会。
- 丰富的功能:JDBC支持多种数据库操作,包括查询、更新、事务处理等,同时还提供了对高级功能的支持,如存储过程调用、结果集的滚动和更新等。
- 安全性:通过使用预编译的SQL语句(PreparedStatement),可以有效防止SQL注入攻击,提高了应用程序的安全性。
- 广泛的应用支持:JDBC支持多种数据库管理系统(DBMS),如MySQL、Oracle、SQL Server、PostgreSQL等,这意味着开发者可以使用一套技能访问多种数据库。
- 社区支持:由于JDBC已经存在了很长时间并且被广泛采用,所以围绕它有一个庞大的开发者社区。当遇到问题时,容易找到解决方案或寻求帮助。
- 与框架的兼容性:很多流行的Java框架(如Spring、Hibernate等)都内置了对JDBC的支持,了解JDBC可以让人更好地理解和使用这些框架。
🌈JDBC的缺点
- 连接管理复杂:在JDBC中,每次用户请求都需要向数据库获取连接,而数据库连接的创建和销毁过程相对耗时且资源消耗大。尤其是在高并发场景下,频繁的创建和销毁连接会成为性能瓶颈。虽然可以通过连接池技术来优化,但实现和维护连接池也需要额外的开销。
- 代码冗余:在JDBC中,处理数据库连接、关闭、异常处理等代码经常需要重复编写,这增加了代码的冗余性和维护难度。
- SQL语句分散:在JDBC中,SQL语句通常直接嵌入到Java代码中,这可能导致SQL语句与业务逻辑代码紧密耦合,难以维护。特别是在大型项目中,SQL语句的分散可能使得项目的管理和维护变得更加困难。
- 灵活性不足:虽然JDBC提供了执行SQL语句的能力,但在处理复杂查询和动态SQL时,其灵活性可能不如一些更高级的ORM(对象关系映射)框架。此外,JDBC中的参数传递方式(如使用占位符)也可能在一定程度上限制了其灵活性。
- 性能开销:在某些情况下,由于JDBC直接与数据库交互,没有中间层进行优化,因此可能会带来一定的性能开销。当然,这种开销通常可以通过合理的数据库设计和查询优化来减轻。
2. 如何使用 JDBC
下面我们以 IDEA 这个应用为例
2.1 下载驱动包
方法一:
1.打开 MySQL 官网:https://www.mysql.com/ mysql官网
2.点击 downloads,把页面滚动到最下面,点击 MySQL Community (GPL) Downloads
3.点击 Connector/J
4.点击 General Availability(GA) Releases,在 Select Operating System 下拉列表选择 Platform Independ
方法二:
1.从中央仓库 /https://mvnrepository.com/ 下载MySQL 的 jdbc 驱动包(jar)
2.点击 搜索框,搜索 MySQL,打开 -j
- 选择对应版本的驱动包,比如MySQL 是 5,驱动包也用 5 系列。
2.2 导入驱动包
将mysql的驱动包放在模块下的lib(自己创建并命名的文件夹)目录下,并将该jar添加为库文件。
2.3 建立数据库连接
public class JDBCDemo01 {
public static void main(String[] args) throws Exception{
-- 1.导入jar包
-- 2.加载JDBC驱动程序:反射,这样调用初始化com.mysql.jdbc.Driver类,即将该类加载到JVM方法区,并执行该类的静态方法块、静态属性。
Class.forName("com.mysql.jdbc.Driver");
-- 3.获取连接 (连接的数据库名是db2,第二个第三个参数是连接数据库的用户名密码)
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?
user=root&password=root&useUnicode=true&characterEncoding=UTF-8","root","123456");
//MySQL数据连接的URL参数格式如下:
//jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
-- 4.获取执行者对象 (statement:表现,声明,跟程序意思不匹配)
Statement stat = conn.createStatement();
-- 5.执行sql语句,并且接收结果
String sql = "SELECT * FROM user";
ResultSet rs = stat.executeQuery(sql); //execute执行,query:查询,resultset:结果集
-- 6.处理结果
while(rs.next()) {
System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
}
-- 7.释放资源
conn.close();
stat.close();
conn.close();
}
}
3. JDBC 常用接口和类
🥝3.1 JDBC API
💢在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。
🥑3.2 数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
- 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
- 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
以上两种方式的区别是:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。
🍉3.3 Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象
💢实际开发中最常用的是PreparedStatement对象,以下对其的总结:
💢主要掌握两种执行SQL的方法:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
🍋🟩3.4 ResultSet对象
- ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
- ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
🔥3.5 典例
public class Demo1 {
public static void main(String[] args) throws SQLException {
//URL语法格式如下
//jdbc:mysql:是固定的写法,后面跟主机名localhost,3306是默认的MySQL端口号
//serverTimezone=UTC是指定时区时间为世界统一时间 // 这个需要带上
//useUnicode=true是指是否使用Unicode字符集,赋值为true
//characterEncoding=utf-8是指定字符编码格式为UTF8
//Connection conn=null;
//Connection接口代表Java程序和数据库的连接对象,只有获得该连接对象后,才能访问数据库,并操作数据表
// 1、先创建DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=false"); // 向下转型
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
// 2. 建立和数据库服务器之间的连接,连接好了之后,才能进行后续的 请求 -- 响应 交互
Connection connection = dataSource.getConnection();
// 3. 构造 sql (代码中的 sql 不需要写 ;)
//String sql = "insert into student values(1, '张三')";
String sql = "delete from student where id = 1";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 把 sql 发给 服务器,返回值是一个整数,表示影响到的行数。
int n = statement.executeUpdate();
System.out.println("n = " + n);
// 5. 执行完毕之后,最后一个步骤,关闭连接,释放资源。 注:是后获取到的资源,先释放
statement.close();
connection.close();
}
}
4. 使用案例
假如存在一个名叫 test 的数据库,其有一个 student 这样的表,如下:
select * from student;
+------+-----------+
| id | name |
+------+-----------+
| 100 | 李四 |
| 2 | |
| 23 | |
| 3 | |
| 2 | zhangsan |
+------+-----------+
我们想要通过 jdbc 代码来查询 student 表中 id = 2 的行,使用如下:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo2 {
public static void main(String[] args)throws SQLException {
// 1. 创建DataSource
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8&useUnicode=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
// 2. 建立连接
Connection connection = dataSource.getConnection();
// 3. 构造 sql
String sql = "select * from student where id = 2";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 执行sql (和 demo1 不同)
// Resulset 就表示查询的 结果集合(临时表)
ResultSet resultSet = statement.executeQuery(); //返回的是结果集合
// 5, 遍历结果集合
// 通过 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();
}
}
//结果显示如下:
id = 2, name =
id = 2, name = zhangsan
📖总结
💢由上面我们学习到了 驱动包的导入,以及了解到了JDBC(Java Database Connectivity)作为Java提供的一套用于数据库连接的API,允许Java程序通过SQL语句与数据库进行交互,实现数据的增删改查等操作。JDBC简化了数据库访问的复杂性,提高了Java程序的可移植性和灵活性。
💞 💞 💞那么本篇到此就结束,希望我的这篇博客可以给你提供有益的参考和启示,感谢大家支持!!!祝大家天天开心
版权归原作者 IsLand1314~ 所有, 如有侵权,请联系我们删除。