准备工作
- 启动MySQL服务器:在mac系统中,有两种方法可以启动MySQL服务器,一种是在系统设置中找到MySQL(亮绿点即表示打开的状态)后点击打开服务即可:
另一种是在命令行中打开,在mac中,打开终端,输入:
sudo /usr/local/mysql/support-files/mysql.server start
即可,(其他操作系统的命令略有不同,在mysql官网上都能找到)
- 创建一个表,为了方便查看,我使用Navicat Premium(一个功能强大的数据库管理工具)在我事先创建好的数据库中,执行以下SQL语句来创建一个表并插入数据
(由于我本人对物理学史颇有研究,于是我让ai给我一组关于物理学家的数据)
-- 创建 physicists 表
CREATE TABLE physicists (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
birthdate DATE,
deathdate DATE,
research VARCHAR(255)
);
-- 插入示例数据
-- 批量插入真实物理学家数据
INSERT INTO physicists (name, birthdate, deathdate, research)
VALUES
('Isaac Newton', '1643-01-04', '1727-03-31', 'Classical mechanics, gravitation'),
('Albert Einstein', '1879-03-14', '1955-04-18', 'Relativity, Quantum mechanics'),
('Marie Curie', '1867-11-07', '1934-07-04', 'Radioactivity'),
('Niels Bohr', '1885-10-07', '1962-11-18', 'Quantum mechanics, Atomic structure'),
('Richard Feynman', '1918-05-11', '1988-02-15', 'Quantum electrodynamics'),
('Stephen Hawking', '1942-01-08', '2018-03-14', 'Black holes, Cosmology'),
('Nikola Tesla', '1856-07-10', '1943-01-07', 'Electricity, Magnetism'),
('Werner Heisenberg', '1901-12-05', '1976-02-01', 'Quantum mechanics'),
('Max Planck', '1858-04-23', '1947-10-04', 'Quantum theory'),
('Erwin Schrödinger', '1887-08-12', '1961-01-04', 'Quantum mechanics');
这样一张表就建立好了,完成了准备工作,接下来我将要以输出这张表的所有内容为例,介绍使用JDBC的步骤
使用步骤详讲(配套代码)
继上一章中的使用步骤,构建一个JDBC应用程序大概可以分为六个步骤:
下面我将要以输出为例一一介绍每一个步骤的具体实现:
1. 导入包
- 点击文件,选择项目结构
- 选择类,选择Java
- 找到你下载好的jdbc文件夹,里面有个jar包,选择这个包(注意,这个文件夹的位置应该放在和你的项目一个目录下,否则无法选中)
- 选好后的界面如下(点击应用后再点击确定)
然后就可以正常的在代码中import你需要用到的类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
2. 注册JDBC驱动程序
//驱动程序类名
String driver = "com.mysql.cj.jdbc.Driver";
// 加载驱动程序
// 加载并注册指定的JDBC驱动程序。它通过给定的驱动程序类名,在运行时将驱动程序加载到内存中,并使其可供使用。
// 这个过程是通过查找并加载指定类的字节码文件来完成的。一旦驱动程序类被加载和注册,就可以与特定的数据库进行连接和交互。
Class.forName(driver);
3. 打开连接
//声明Connection对象
// Connection 对象代表着与数据库的一个连接,它用于在 Java 程序和数据库之间建立通信通道。
Connection con;
//URL指向要访问的数据库名--my_database
String url = "jdbc:mysql://localhost:3306/my_database";
//MySQL配置时的用户名
String user = "root";
//MySQL配置时的密码
String password = "zap200429";
// getConnection()方法,连接MySQL数据库!!
// Connection 对象代表着与数据库的一个连接,它用于在 Java 程序和数据库之间建立通信通道。
// 通过调用 getConnection() 方法,可以使用指定的数据库 URL、用户名和密码来获取与数据库的连接。
con = DriverManager.getConnection(url,user,password);
// System.out.println(con); // com.mysql.cj.jdbc.ConnectionImpl@6f1de4c7
// 检查是否连接成功
if(!con.isClosed())
System.out.println("Succeeded connecting to the Database!");
4. 执行查询并保存查询结果
// 创建statement类对象,用来执行SQL语句!!
// Statement 对象是 Java 中执行 SQL 语句的接口之一。它是在特定数据库连接上创建的,用于执行静态的 SQL 语句并返回结果。
// 通过使用 Statement 对象,可以执行插入、更新、删除等 SQL 数据操作语句,
// 也可以执行查询语句并获取查询结果。使用 Statement 对象时,SQL 语句是作为字符串直接传递给执行方法
Statement statement = con.createStatement();
//要执行的SQL语句
String sql = "select * from physicists;";
// ResultSet类,用来存放获取的结果集!!
// 使用 Statement 对象的 executeUpdate() 方法执行插入、更新、删除等 SQL 数据操作语句、
// 使用 executeQuery() 方法执行查询语句
// ResultSet 是 Java 中用于表示数据库查询结果集的对象。
// 它提供了一种行式的、可向前遍历的方式,用于访问和处理从数据库查询语句返回的数据。
// ResultSet 对象通常由 Statement 或 PreparedStatement 对象的 executeQuery() 方法返回
// ResultSet 对象提供了一系列方法来获取和操作查询结果的数据,包括获取不同类型的列值、移动结果集的指针、检索元数据等
ResultSet rs = statement.executeQuery(sql);
// System.out.println(rs); //com.mysql.cj.jdbc.result.ResultSetImpl@682b2fa
5. 从结果集中提取数据
// ResultSetMetaData类,用于描述 ResultSet(结果集)对象的元数据(metadata)的接口
// ResultSetMetaData 是 Java 中用于描述 ResultSet(结果集)对象的元数据(metadata)的接口
// 它提供了关于结果集中列的信息,例如列名、数据类型、列宽度等。
// getMetaData():获取结果集的元数据,包括列的名称、类型等详细信息。返回的是一个 ResultSetMetaData 对象
ResultSetMetaData metaData = rs.getMetaData(); // 利用MetaData获取column的数目和名字
// getColumnCount()返回column数量
int columnCount = metaData.getColumnCount();
// 格式化输出时的字符间的长度
int[] colSizes = {7, 20, 15, 15, 37, 20};
// 输出列名
// 列索引是从1开始
for (int i = 0; i < columnCount; i++) {
// 设置格式化字符
String format_col = String.format("%%-%ds", colSizes[i]);
// getColumnName()返回列名(从1索引)
System.out.printf(format_col, metaData.getColumnName(i + 1));
}
System.out.println(); // 换行
// 构建待输出的数据的数组
String[] values = new String[columnCount];
// 获取每行数据并输出
// next():将结果集的指针向下移动一行。如果有更多的行,返回 true,否则返回 false。
while(rs.next()){
// getString(columnName)、getInt(columnName) 等:获取指定列名的对应数据类型的值。
// getXXX(columnIndex):根据列的索引(从1开始)获取对应数据类型的值。
// System.out.println(rs); // com.mysql.cj.jdbc.result.ResultSetImpl@477b4cdf
// 获取当前行的每一个column的数据
// (values.length == columnCount)
for (int i = 0; i < values.length; i++) {
values[i] = rs.getString(metaData.getColumnName(i + 1));
}
//输出结果(格式化输出)
for (int i = 0; i < columnCount; i++) {
// 设置格式化字符
String format_col = String.format("%%-%ds", colSizes[i]);
// 输出
System.out.printf(format_col, values[i]);
}
System.out.println(); // 换行
}
6. 释放资源
rs.close();
con.close();
整理后的代码如下:
package com.fitst.Print;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
public class PrintTest {
public static void main(String[] args) {
//声明Connection对象
// Connection 对象代表着与数据库的一个连接,它用于在 Java 程序和数据库之间建立通信通道。
Connection con;
//驱动程序类名
String driver = "com.mysql.cj.jdbc.Driver";
//URL指向要访问的数据库名--my_database
String url = "jdbc:mysql://localhost:3306/my_database";
//MySQL配置时的用户名
String user = "root";
//MySQL配置时的密码
String password = "zap200429";
//遍历查询结果集
try {
// 加载驱动程序
// 加载并注册指定的JDBC驱动程序。它通过给定的驱动程序类名,在运行时将驱动程序加载到内存中,并使其可供使用。
// 这个过程是通过查找并加载指定类的字节码文件来完成的。一旦驱动程序类被加载和注册,就可以与特定的数据库进行连接和交互。
Class.forName(driver);
//1.getConnection()方法,连接MySQL数据库!!
// Connection 对象代表着与数据库的一个连接,它用于在 Java 程序和数据库之间建立通信通道。
// 通过调用 getConnection() 方法,可以使用指定的数据库 URL、用户名和密码来获取与数据库的连接。
con = DriverManager.getConnection(url,user,password);
// System.out.println(con); // com.mysql.cj.jdbc.ConnectionImpl@6f1de4c7
// 检查是否连接成功
if(!con.isClosed())
System.out.println("Succeeded connecting to the Database!");
//2.创建statement类对象,用来执行SQL语句!!
// Statement 对象是 Java 中执行 SQL 语句的接口之一。它是在特定数据库连接上创建的,用于执行静态的 SQL 语句并返回结果。
// 通过使用 Statement 对象,可以执行插入、更新、删除等 SQL 数据操作语句,
// 也可以执行查询语句并获取查询结果。使用 Statement 对象时,SQL 语句是作为字符串直接传递给执行方法
Statement statement = con.createStatement();
//要执行的SQL语句
String sql = "select * from physicists;";
//3.ResultSet类,用来存放获取的结果集!!
// 使用 Statement 对象的 executeUpdate() 方法执行插入、更新、删除等 SQL 数据操作语句、
// 使用 executeQuery() 方法执行查询语句
// ResultSet 是 Java 中用于表示数据库查询结果集的对象。
// 它提供了一种行式的、可向前遍历的方式,用于访问和处理从数据库查询语句返回的数据。
// ResultSet 对象通常由 Statement 或 PreparedStatement 对象的 executeQuery() 方法返回
// ResultSet 对象提供了一系列方法来获取和操作查询结果的数据,包括获取不同类型的列值、移动结果集的指针、检索元数据等
ResultSet rs = statement.executeQuery(sql);
// System.out.println(rs); //com.mysql.cj.jdbc.result.ResultSetImpl@682b2fa
System.out.println("-----------------");
System.out.println("执行结果如下所示:");
System.out.println("-----------------");
System.out.println();
// 4.ResultSetMetaData类,用于描述 ResultSet(结果集)对象的元数据(metadata)的接口
// ResultSetMetaData 是 Java 中用于描述 ResultSet(结果集)对象的元数据(metadata)的接口
// 它提供了关于结果集中列的信息,例如列名、数据类型、列宽度等。
// getMetaData():获取结果集的元数据,包括列的名称、类型等详细信息。返回的是一个 ResultSetMetaData 对象
ResultSetMetaData metaData = rs.getMetaData(); // 利用MetaData获取column的数目和名字
// getColumnCount()返回column数量
int columnCount = metaData.getColumnCount();
// 格式化输出时的字符间的长度
int[] colSizes = {7, 20, 15, 15, 37, 20};
// 输出列名
// 列索引是从1开始
for (int i = 0; i < columnCount; i++) {
// 设置格式化字符
String format_col = String.format("%%-%ds", colSizes[i]);
// getColumnName()返回列名(从1索引)
System.out.printf(format_col, metaData.getColumnName(i + 1));
}
System.out.println(); // 换行
// 构建待输出的数据的数组
String[] values = new String[columnCount];
// 获取每行数据并输出
// next():将结果集的指针向下移动一行。如果有更多的行,返回 true,否则返回 false。
while(rs.next()){
// getString(columnName)、getInt(columnName) 等:获取指定列名的对应数据类型的值。
// getXXX(columnIndex):根据列的索引(从1开始)获取对应数据类型的值。
// System.out.println(rs); // com.mysql.cj.jdbc.result.ResultSetImpl@477b4cdf
// 获取当前行的每一个column的数据
// (values.length == columnCount)
for (int i = 0; i < values.length; i++) {
values[i] = rs.getString(metaData.getColumnName(i + 1));
// 等价于 values[i] = rs.getString(i + 1);
}
//输出结果(格式化输出)
for (int i = 0; i < columnCount; i++) {
// 设置格式化字符
String format_col = String.format("%%-%ds", colSizes[i]);
// 输出
System.out.printf(format_col, values[i]);
}
System.out.println(); // 换行
}
rs.close();
con.close();
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
执行结果如下:
由于对输出排版的追求,我在输出的部分使用格式化输出,导致输出部分的代码篇幅可以有点冗长,但核心部分只是其中的几行代码,有想要研究的朋友可自行复制更改和测试。