准备工作

  1. 启动MySQL服务器:在mac系统中,有两种方法可以启动MySQL服务器,一种是在系统设置中找到MySQL(亮绿点即表示打开的状态)后点击打开服务即可:

mysql 输出db文件_数据库

另一种是在命令行中打开,在mac中,打开终端,输入:

sudo /usr/local/mysql/support-files/mysql.server start

即可,(其他操作系统的命令略有不同,在mysql官网上都能找到)

  1. 创建一个表,为了方便查看,我使用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的步骤

mysql 输出db文件_结果集_02

使用步骤详讲(配套代码)

继上一章中的使用步骤,构建一个JDBC应用程序大概可以分为六个步骤:

mysql 输出db文件_mysql_03

下面我将要以输出为例一一介绍每一个步骤的具体实现:

1. 导入包

  1. 点击文件,选择项目结构

mysql 输出db文件_结果集_04

  1. 选择类,选择Java

mysql 输出db文件_System_05

  1. 找到你下载好的jdbc文件夹,里面有个jar包,选择这个包(注意,这个文件夹的位置应该放在和你的项目一个目录下,否则无法选中)

mysql 输出db文件_mysql 输出db文件_06

  1. 选好后的界面如下(点击应用后再点击确定)

mysql 输出db文件_mysql 输出db文件_07

然后就可以正常的在代码中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());
        } 
    }
}

执行结果如下

mysql 输出db文件_数据库_08

由于对输出排版的追求,我在输出的部分使用格式化输出,导致输出部分的代码篇幅可以有点冗长,但核心部分只是其中的几行代码,有想要研究的朋友可自行复制更改和测试。