环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
今天,我们来聊一个老生常谈的话题,在当前的软件开发行业中甚至前景,数据库的使用都是不可或缺的重要一环,不像古时候,页面还可以写伪数据,不走库的概念。在当今,数据库连接也是程序与数据库之间通信的关键一环。所以关于在本文中,我将介绍如何使用Java编程语言进行数据库连接,并探讨其应用场景和优缺点等实例阐述。希望能帮助到同学们,并能带初学者快速入门数据库等与Java开发语言连接的知识点,助人为乐,不亦乐乎。
摘要
在此,本文将会重点介绍,如何使用Java的JDBC
(Java Database Connectivity)引擎对数据库进行连接的技巧。首先,我会对JDBC进行简要概述,了解其原理;然后剖析相关源码,介绍其在实际应用中的应用场景案例。接着,我还会对数据库连接的优缺点进行理性分析,并提供类代码方法的详细介绍。最后,我会通过结合测试用例,以理论加实践相结合,以最佳速度引导大家学习并掌握,且最后会进行小结与总结,把握全文的讲解脉络。
概述
关于JDBC,它是Java提供的数据库使用的标准API,不仅它提供了丰富的API接口,还提供了与不同数据库进行通信的通用方式。对于JDBC,它有提供接口,允许Java程序与数据库进行连接、查询和更新数据,这样一来,大家也不需要额外的去写相关引擎了。通过JDBC,我们可以轻松地使用Java来处理各种数据库操作,例如:数据交互,以及数据的增删改查。
示例演示
这里我就给大家简单做个使用演示指南,如果你要在 Java 中的 main 函数里直接与 MySQL 进行连接,你大致需要遵循以下步骤:
- 你需要添加 MySQL 驱动依赖:确保你的项目中包含了
MySQL Connector
驱动程序。如果你使用的是 Maven 或 Gradle,可以在项目的pom.xml
或build.gradle
文件中添加相应的依赖。这点尤其重要,否则会报错。
-
加载驱动:在你定义的 main 函数中,使用
Class.forName()
方法来加载 MySQL 驱动程序。例如:Class.forName("com.mysql.cj.jdbc.Driver");
-
连接数据库:使用
DriverManager.getConnection()
方法来建立与数据库连接。例如你可以你这样:connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
-
定义 SQL 语句:创建
Statement
对象,然后执行 SQL 查询或更新,这些都可以自定义操作。 -
处理结果:如果执行查询,你需要处理返回对应的 ResultSet 对象,然后处理结果集。
-
关闭连接:在完成数据库操作后,切记需要关闭
ResultSet
、Statement
和Connection
对象以释放资源。
针对第6步,可能有小伙伴会问,如果我不关闭,会造成什么影响吗?这里我就给大家做个简单解释:
- 资源泄露:每个
Connection
对象都与数据库的一个物理连接相对应。如果Connection
对象没有被关闭,那么这个物理连接就不会释放,导致数据库的连接资源被占用,长时间下去可能会耗尽数据库的连接资源。- 内存消耗:
ResultSet
和Statement
对象在JVM中占用内存。如果这些对象长时间不被关闭,会占用越来越多的内存,最终可能导致内存溢出(OutOfMemoryError)。- 性能下降:由于资源泄露和内存消耗,应用程序的性能可能会逐渐下降。数据库连接池中的空闲连接数减少,新的数据库操作可能需要等待可用连接,导致响应时间变长。
- 事务管理问题:如果
Connection
对象没有被关闭,那么通过该连接开启的事务可能不会被正确提交或回滚。这可能导致数据不一致性,或者在某些情况下,事务可能会被挂起,影响数据库的稳定性。- 网络资源浪费:维持一个数据库连接需要网络资源。如果连接没有被关闭,那么这些网络资源也会被浪费。
以上解释,希望能够帮助到有疑问的小伙伴。
接下来,我就结合上述理论知识点,给同学们演示个简单连接示例,通过Java如何在 main 主函数中,连接 MySQL 数据库并进行一个SQL查询。
示例代码如下,仅供参考:
ackage com.demo.javase.day85;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @Author bug菌
* @Source 公众号:猿圈奇妙屋
* @Date 2024-04-14 22:05
*/
public class DatabaseConnection {
private static final String DB_URL = "jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; // 数据库连接URL
private static final String USER = "root"; // 数据库用户名
private static final String PASSWORD = "123456"; // 数据库密码
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 注册JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
// 执行查询
statement = connection.createStatement();
String sql = "SELECT * FROM user";
resultSet = statement.executeQuery(sql);
// 处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String sex = resultSet.getString("sex");
// 打印结果
System.out.println("id: " + id + ", name: " + name + ", sex: " + sex);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这里,先给同学们上一课,如上案例的大致实现逻辑。首先注册JDBC驱动,接着打开连接并执行SQL查询。最后,处理结果集并关闭连接。听起来是不是非常的简单,但是实际上,里头蕴含的知识点还是非常之多,这关乎你对Java基础是否扎实有关。
然后,这里需要给同学们提个醒,上述例子是连接MySQL数据库,且如果实际要用,你还需要根据你使用的数据库做出相应的更改,比如驱动,再比如数据库连接账号密码等。如果想听更具体的分析,请看下边的拓展,我会把案例的代码逐句逐句解读给你听。
代码解析:
根据我如上写的示例代码,一眼都知道:它是一个Java程序,用于连接数据库并执行SQL查询操作。而代码中使用了Java提供的JDBC(Java Database Connectivity
)来实现与之数据库的连接和操作,这里我就不再赘述。
如下是详细的代码解读,请同学们耐心听完。
-
我先定义了数据库的连接URL、用户名和密码。增强代码之间的解耦。
-
在main方法中,先注册MySQL的JDBC驱动程序(
com.mysql.cj.jdbc.Driver
)。如果是要连接其他的数据库比如Oracle,或者非关系型数据库,例如Redis等,这里又是不同的注册方式,这里我就日后再给大家科普 -
通过
DriverManager
的getConnection
方法,传入连接URL、用户名和密码建立与数据库的连接。 -
创建
Statement
对象,通过该对象可以执行SQL语句,例如我定义了一个查询SQL,然后并将查询结果保存在ResultSet对象中。 -
通过
while
循环遍历ResultSet
对象,获取结果对象中的每一条查询对象,并将结果打印出来,这里是做演示而已,如果涉及到真实场景,肯定就是返回到页面了。 -
在代码的最后,使用finally块来关闭
ResultSet
、Statement
和Connection
对象,释放资源。
除了如上实现步骤外,这里同学们需要注意的是,代码中使用了try-catch块来捕获可能出现的异常,并进行相应的处理。在这里,ClassNotFoundException
是检查在运行时是否找到指定的驱动程序类,SQLException
是处理与数据库相关的操作异常。
总而言之,代码演示的目的是如何连接MySQL,并执行一个简单的查询SQL语句,并打印结果。如上就是针对案例代码的解读了,如果你想模仿,具体的查询参数需要同学们根据本地的数据库来配置。
应用场景案例
虽然说数据库的案例如上只是简单演示了一下,但对于数据库连接,它在实际应用中有着广泛的应用场景。在此,我给大家介绍一些常见的场景,例如:
- 数据存储和检索:连接数据库可以方便地将数据存储在数据库中,并从数据库中检索数据。
- 数据分析和报表生成:数据库连接可以用于从数据库中检索数据,并对数据进行分析和报表生成。
- 用户认证和权限控制:连接数据库可以用于验证用户的身份,并对用户的权限进行控制。
- 实时数据处理:连接数据库可以用于处理实时数据,如实时日志分析等。
- 电子商务和在线支付:数据库连接可以用于处理电子商务和在线支付相关的数据。
这些只是数据库连接的一些典型的应用场景,实际应用中还有更多的可能性,就不一一举例赘述啦,更多的是靠同学们去挖掘与探索。
优缺点分析
然后,万物都离不开理性分析,一个东西被开发或者被研制,都有其优劣,对于数据库的使用,它有着一些明显的优点和缺点。总结如下:
优点
- 灵活性和可扩展性:使用数据库连接可以方便地切换不同类型的数据库,并支持灵活的扩展和定制。
- 性能:数据库连接可以利用数据库的性能优化特性,提高数据的访问效率。
- 安全性:数据库连接可以通过加密等方式保证数据的安全传输。
- ...
缺点
- 复杂性:数据库连接的使用需要一定的编程知识和经验,对于初学者来说可能会有一定的学习和使用成本。
- 性能:数据库连接可能会引入一定的性能开销,特别是在高并发的情况下。
- 依赖性:数据库连接可能依赖于特定的数据库驱动程序或数据库版本,如果数据库驱动程序或数据库版本发生变化,可能需要对代码进行相应的更改。
类代码方法介绍
Connection接口
DriverManager.getConnection(String url, String user, String password)
:根据指定的URL、用户名和密码建立与数据库连接,使用非常方便。
Statement接口
createStatement()
:创建一个Statement对象,用于执行静态SQL语句。executeQuery(String sql)
:执行给定的SQL语句,返回一个ResultSet对象,用于检索查询的结果集。
ResultSet接口
next()
:将光标从当前位置向前移一行。getInt(int columnIndex)
:以int类型返回当前行指定列的值。getString(int columnIndex)
:以String类型返回当前行指定列的值。
测试用例
以下是一个简单的测试用例,用于演示数据库连接的使用:实际上就是上述案例的升级版本,虽然原理相同,但是我想给大家演示的目的是加强同学们对其使用的熟练程度与理解程度。
测试代码
测试代码如下,仅供参考:
public class DatabaseConnection {
private static final String DB_URL = "jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; // 数据库连接URL
private static final String USER = "root"; // 数据库用户名
private static final String PASSWORD = "123456"; // 数据库密码
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 注册JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
// 打开连接
connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
// 执行查询
statement = connection.createStatement();
String sql = "SELECT * FROM user";
resultSet = statement.executeQuery(sql);
// 处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String sex = resultSet.getString("sex");
// 打印结果
System.out.println("id: " + id + ", name: " + name + ", sex: " + sex);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭连接
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试结果
针对如上测试代码,这里我本地进行实际测试一波,结果仅供参考,有条件的同学们也可以自己本地实践一下。
如下我给同学们看下我的数据库查询表中的落地数据,以便于同学们理解并供核对数据的真实性,而并非伪造。
测试代码解析
针对如上测试代码,这里我具体给大家逐字逐句的剖析下,手把手教学。希望同学们能够理解更透彻,以最大努力帮助大家掌握。
如上案例,我展示了如何使用 JDBC(Java Database Connectivity)连接到 MySQL 数据库,执行查询,并处理结果。下面是对案例代码的逐行解读:
import java.sql.*;
这些 import 语句允许你在代码中使用 java.sql
包中的类和接口,这是 JDBC 的核心包。
public class DatabaseConnection {
定义一个名为 DatabaseConnection
的公共类。
private static final String DB_URL = "jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
private static final String USER = "root";
private static final String PASSWORD = "123456";
这些是类级别的常量,用于存储数据库连接信息。DB_URL
包含了数据库的 JDBC URL,USER
是数据库的用户名,PASSWORD
是对应的密码。
public static void main(String[] args) {
这是 Java 程序的入口点,main
主函数方法。
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
声明了三个变量,用于存储数据库连接、语句对象和结果集。
try {
开始一个 try
块,用于捕获和处理可能发生的异常。
// 注册JDBC驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
使用 Class.forName
方法加载 MySQL JDBC 驱动类。这是必须的步骤,以便 JVM 能够识别和使用 JDBC 驱动。
// 打开连接
connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
使用 DriverManager.getConnection
方法建立到数据库的连接。
// 执行查询
statement = connection.createStatement();
String sql = "SELECT * FROM user";
resultSet = statement.executeQuery(sql);
创建一个 Statement
对象,然后执行一个 SQL 查询字符串,并将结果存储在 ResultSet
对象中。
// 处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String sex = resultSet.getString("sex");
// 打印结果
System.out.println("id: " + id + ", name: " + name + ", sex: " + sex);
}
遍历 ResultSet
对象,逐行读取数据并打印。
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
这两个 catch
块用于捕获和处理 ClassNotFoundException
和 SQLException
。
} finally {
finally
块用于确保即使发生异常,资源也能被正确关闭。
// 关闭连接
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在这个 try-catch
结构中,关闭 ResultSet
、Statement
和 Connection
对象。如果在关闭过程中发生 SQLException
,则捕获并打印堆栈跟踪。
总言而之,案例演示了如何安全连接数据库、执行查询、处理结果,并确保所有资源在使用后都被正确关闭。这是 JDBC 编程的基本模式,适用于大多数数据库交互场景。
小结
这里,基本要接近尾声了,给大家做个小结,通过本文的介绍,我们了解了Java中使用JDBC进行数据库连接的方法。我们通过源代码解析了解了具体的实现细节,并探讨了数据库连接的应用场景和优缺点。在类代码方法介绍中,我们讲解了一些关键的接口方法。最后,我们给出了一个简单的测试用例,帮助同学们更好地理解和应用所学知识。
总结
最后,我想说的是,数据库连接是Java开发中非常重要的一部分。它使我们能够方便地与各种不同类型的数据库进行交互,并进行数据的存储和检索。通过本文的学习,我们对Java中使用JDBC进行数据库连接有了更深入的了解。希望读者通过本文的学习,能够快速入门数据库连接的知识,并能够在实际开发中灵活应用。在以后的学习和实践中,能够快速掌握如何与数据库进行交互。虽然这是最简单的交互方式之一,毕竟后续你们学习了我写的Springboot零基础教程,你们就会发现,压根不需要这样去配置,而是灵活的通过配置文件+读取的方式,即可连接数据库。
... ...
ok,以上就是我这期的全部内容啦。每篇都是实打实的项目实战经验所撰。只要你每天学习一个奇淫小知识,日积月累下去,你一定能成为别人眼中的大佬的!功不唐捐,久久为功!
「赠人玫瑰,手留余香」,咱们下期拜拜~~