我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java打印表格将ResultSet中的数据打印成表格问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java打印表格将ResultSet中的数据打印成表格问题

问题描述

MySQL的查询语句输出如下:

mysql> select * from instructor;
+-------+------------+------------+-----------+
| ID    | name       | dept_name  | salary    |
+-------+------------+------------+-----------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00  |
| 12121 | Wu         | Finance    | 90000.00  |
| 15151 | Mozart     | Music      | 40000.00  |
| 22222 | Einstein   | Physics    | 95000.00  |
| 25566 | Brown      | Biology    | 100000.00 |
| 30765 | Green      | Music      | NULL      |
| 32343 | El Said    | History    | 60000.00  |
| 33456 | Gold       | Physics    | 87000.00  |
| 45565 | Katz       | Comp. Sci. | 75000.00  |
| 58583 | Califieri  | History    | 62000.00  |
| 76543 | Singh      | Finance    | 80000.00  |
| 76766 | Crick      | Biology    | 72000.00  |
| 77987 | Kim        | Physics    | 98000.00  |
| 83821 | Brandt     | Comp. Sci. | 92000.00  |
| 88877 | Perry      | Finance    | 125000.00 |
| 88878 | Perry      | Finance    | 125000.00 |
| 98345 | Kim        | Elec. Eng. | 80000.00  |
+-------+------------+------------+-----------+
17 rows in set (0.04 sec)

使用JDBC执行上述的查询语句,将结果集中的查询结果以表格的形式打印出来。

思路

  • 通过结果集的元数据可以知道结果集中的列数,和列名.
  • 然后遍历结果集,分别统计每一列中的最大字符数。
  • 然后通过System.out.printf()方法进行格式化输出。

实现

package tools;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;


public class ResultSetPrinter {
    public static void printResultSet(ResultSet rs) throws SQLException {
        ResultSetMetaData resultSetMetaData = rs.getMetaData();
        // 获取列数
        int ColumnCount = resultSetMetaData.getColumnCount();
        // 保存当前列最大长度的数组
        int[] columnMaxLengths = new int[ColumnCount];
        // 缓存结果集,结果集可能有序,所以用ArrayList保存变得打乱顺序.
        ArrayList<String[]> results = new ArrayList<>();
        // 按行遍历
        while (rs.next()) {
            // 保存当前行所有列
            String[] columnStr = new String[ColumnCount];
            // 获取属性值.
            for (int i = 0; i < ColumnCount; i++) {
                // 获取一列
                columnStr[i] = rs.getString(i + 1);
                // 计算当前列的最大长度
                columnMaxLengths[i] = Math.max(columnMaxLengths[i], (columnStr[i] == null) ? 0 : columnStr[i].length());
            }
            // 缓存这一行.
            results.add(columnStr);
        }
        printSeparator(columnMaxLengths);
        printColumnName(resultSetMetaData, columnMaxLengths);
        printSeparator(columnMaxLengths);
        // 遍历集合输出结果
        Iterator<String[]> iterator = results.iterator();
        String[] columnStr;
        while (iterator.hasNext()) {
            columnStr = iterator.next();
            for (int i = 0; i < ColumnCount; i++) {
                // System.out.printf("|%" + (columnMaxLengths[i] + 1) + "s", columnStr[i]);
                System.out.printf("|%" + columnMaxLengths[i] + "s", columnStr[i]);
            }
            System.out.println("|");
        }
        printSeparator(columnMaxLengths);
    }

    
    private static void printColumnName(ResultSetMetaData resultSetMetaData, int[] columnMaxLengths) throws SQLException {
        int columnCount = resultSetMetaData.getColumnCount();
        for (int i = 0; i < columnCount; i++) {
            // System.out.printf("|%" + (columnMaxLengths[i] + 1) + "s", resultSetMetaData.getColumnName(i + 1));
            System.out.printf("|%" + columnMaxLengths[i] + "s", resultSetMetaData.getColumnName(i + 1));
        }
        System.out.println("|");
    }

    
    private static void printSeparator(int[] columnMaxLengths) {
        for (int i = 0; i < columnMaxLengths.length; i++) {
            System.out.print("+");
            // for (int j = 0; j < columnMaxLengths[i] + 1; j++) {
            for (int j = 0; j < columnMaxLengths[i]; j++) {
                System.out.print("-");
            }
        }
        System.out.println("+");
    }

}

测试

package tools;
import java.sql.*;

public class Test {
    private static String driver = "com.mysql.cj.jdbc.Driver";
    private static String URL = "jdbc:mysql://127.0.0.1:3306/university?serverTimezone=UTC";
    private static String user = "root";
    private static String password = "root";

    
    private static void JDBCexample() {
        // 1.加载数据库驱动
        try {

            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        testStatement();
    }

    
    private static void testStatement() {
        try (// 2.打开数据库连接
             Connection conn = DriverManager.getConnection(URL, user, password);
             // 3.创建语句
             Statement stmt = conn.createStatement()) {
            // 模拟SQL注入
            testSqlInjecton(stmt);

        } catch (SQLException sqle) {
            System.out.println("SQLException : " + sqle);
        }
    }

    
    private static void testSqlInjecton(Statement stmt) throws SQLException {
        String name = "X' or 'Y' = 'Y";
        String sql = "select * from instructor where name = '" + name + "'";
        ResultSet rs = stmt.executeQuery(sql);
        ResultSetPrinter.printResultSet(rs);
    }

    public static void main(String[] args) {
        JDBCexample();
    }
}

运行结果

+-----+----------+----------+---------+
|   ID|      name| dept_name|   salary|
+-----+----------+----------+---------+
|10101|Srinivasan|Comp. Sci.| 65000.00|
|12121|        Wu|   Finance| 90000.00|
|15151|    Mozart|     Music| 40000.00|
|22222|  Einstein|   Physics| 95000.00|
|25566|     Brown|   Biology|100000.00|
|30765|     Green|     Music|     null|
|32343|   El Said|   History| 60000.00|
|33456|      Gold|   Physics| 87000.00|
|45565|      Katz|Comp. Sci.| 75000.00|
|58583| Califieri|   History| 62000.00|
|76543|     Singh|   Finance| 80000.00|
|76766|     Crick|   Biology| 72000.00|
|77987|       Kim|   Physics| 98000.00|
|83821|    Brandt|Comp. Sci.| 92000.00|
|88877|     Perry|   Finance|125000.00|
|88878|     Perry|   Finance|125000.00|
|98345|       Kim|Elec. Eng.| 80000.00|
+-----+----------+----------+---------+

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java打印表格将ResultSet中的数据打印成表格问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java打印表格将ResultSet中的数据打印成表格问题

这篇文章主要介绍了java打印表格将ResultSet中的数据打印成表格问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-26

python 中怎么使用printTable()函数表格打印

这期内容当中小编将会给大家带来有关python 中怎么使用printTable()函数表格打印,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。编写一个名为printTable()的函数,它接受字符串的列表的
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录