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);
    }

    /**
     * 输出列名.
     *
     * @param resultSetMetaData 结果集的元数据对象.
     * @param columnMaxLengths  每一列最大长度的字符串的长度.
     * @throws SQLException
     */
    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("|");
    }

    /**
     * 输出分隔符.
     *
     * @param columnMaxLengths 保存结果集中每一列的最长的字符串的长度.
     */
    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";

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

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

    /**
     * 测试Statement的用法.
     */
    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);
        }
    }

    /**
     * 模拟SQL注入.
     *
     * @param stmt Statement对象.
     * @throws SQLException
     */
    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|
+-----+----------+----------+---------+

总结

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

(0)

相关推荐

  • java中ResultSet遍历数据操作

    1.查找数据库中表的列名 <pre name="code" class="html">String sql = "select *from tblmetadatainfo"; ResultSet rs = MySqlHelper.executeQuery(sql, null); String str=""; try { ResultSetMetaData rsmd = rs.getMetaData(); for (

  • JAVA导出EXCEL表格的实例教学

    小伙伴们,最近比较忙,没什么时间写,今天给大家分享的是JAVA如何导出EXCEL表格,因为最近有做这样一个功能,所以分享出来,如有不对之处,敬请指正. 在许多企业办公系统中,经常会有用户要求,需要对数据进行统计并且可以直接下载Excel文件,这样子的话,既然客户提出了要求,我们就应该去满足吖,毕竟客户是上帝嘛,那么我们如何去实现呢?且看我为你一一道来. POI简介:Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其中有用于操作Excel

  • sqlserver和java将resultSet中的记录转换为学生对象

    目录 1.Student.java 2.DBUtil.java 3.result.java 4.实现结果 要将结果转化为对象,所以第一步要创建一个对象: 1.Student.java public class Student { //学号.姓名.班级.性别.专业.学院 //类中的属性一定要跟数据库中的一摸一样 包括名称,数据类型 private String 学号; private String 姓名; private String 班级; private String 性别; private

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

    目录 问题描述 思路 实现 测试 运行结果 总结 问题描述 MySQL的查询语句输出如下: mysql> select * from instructor;+-------+------------+------------+-----------+| ID    | name       | dept_name  | salary    |+-------+------------+------------+-----------+| 10101 | Srinivasan | Comp. Sc

  • Java编程实现向文本文件中读取数据之Scanner用法示例

    本文实例讲述了Java编程实现向文本文件中读取数据之Scanner用法.分享给大家供大家参考,具体如下: 使用Scanner类来读取文件 我们使用Scanner类来从键盘上读取数据,也可以使用Scanner类来从文本文件中读取数据,我们先来看一个实例代码 package com.li; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.*; public class Mai

  • java获取两个数组中不同数据的方法

    本文实例讲述了java获取两个数组中不同数据的方法.分享给大家供大家参考.具体实现方法如下: public static <T> List<T> compare(T[] t1, T[] t2) { List<T> list1 = Arrays.asList(t1); List<T> list2 = new ArrayList<T>(); for (T t : t2) { if (!list1.contains(t)) { list2.add(t)

  • 用java实现在txt文本中写数据和读数据的方法

    向文本中写数据,一般这些数据我们用来做自动化测试.通过我们制定的一些生成数据的规则,能够快速写数据到文本中. 下面是写数据到txt文本(当然我们可以根据自己的需要写到doc.docx.xlx.xlsx等格式的文件中)的代码: import java.io.File; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) {

  • Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

    SqlSessionTemplate SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用. 当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的.此外,它管理session的生命周期,包

  • java从输入流中获取数据并返回字节数组示例

    复制代码 代码如下: import java.io.ByteArrayOutputStream;import java.io.InputStream;//从输入流中获取数据并以字节数组返回public class StreamTool {    /**     * 从输入流获取数据     * @param inputStream     * @return     * @throws Exception     */    public static byte[] readInputStrea

  • java如何更改数据库中的数据

    java更改数据库中的数据 不废话,上代码 package com.ningmeng; import java.sql.*; /** * 1:更改数据库中的数据 * @author biexiansheng * */ public class Test04 { public static void main(String[] args) { // TODO Auto-generated method stub try { Class.forName("com.mysql.jdbc.Driver&

  • Java各种锁在工作中使用场景和细节经验总结

    目录 1.synchronized 1.1.共享资源初始化 2.CountDownLatch 2.1.场景 2.2.实现 3.总结 1.synchronized synchronized 是可重入的排它锁,和 ReentrantLock 锁功能相似,任何使用 synchronized 的地方,几乎都可以使用 ReentrantLock 来代替,两者最大的相似点就是:可重入 + 排它锁,两者的区别主要有这些: ReentrantLock 的功能更加丰富,比如提供了 Condition,可以打断的加

  • Java利用剪贴板实现交换程序间数据的方法

    本文实例讲述了Java利用剪贴板交换程序间数据的实现方法.在图形化系统中,系统剪贴板非常重要,很难想象一个没有剪贴板功能的图形化操作系统使用起来会是怎样.本例就实现了Java 程序与所在系统的剪贴板的数据交流,当单击"Paste"按钮后,Java 程序从系统剪贴板中取得数据并显示在一个JTextArea 组件中:当单击"Copy"按钮后,文本区中的选中文本将被传送到系统剪贴板上. 首先必须得到系统剪贴板的实例引用,java.awt.Toolkit 类中提供了getS

  • 如何在Java程序中访问mysql数据库中的数据并进行简单的操作

    在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据并进行简单的操作,具体详情请看下文. 创建一个javaProject,并输入如下java代码: package link; import java.sql.*; /** * 使用JDBC连接数据库MySQL的过程 * DataBase:fuck, table:person: * 使用myeclipse对mysql数据库进行增删改查的基本操作. */ public

随机推荐