使用 JDBC 从 MySQL 列获取 :Jan 01, 1970 输出

Posted

技术标签:

【中文标题】使用 JDBC 从 MySQL 列获取 :Jan 01, 1970 输出【英文标题】:Getting :Jan 01, 1970 output with JDBC from MySQL columns 【发布时间】:2016-05-23 01:55:38 【问题描述】:

我正在尝试将来自 mysql 服务器的表数据显示到我正在创建的 JFrame 中。尽管其他一切都很好,但我似乎无法从相应列中获取正确的 TIME 数据。

下面是我的代码以及输出示例!

package pkginterface;

import java.awt.*; 
import java.sql.*;
import java.util.*;
import javax.swing.*; 
import javax.swing.table.*;
import java.time.*;


public class Staff_Info extends JFrame

public Staff_Info()

    ArrayList columnNames = new ArrayList();
    ArrayList data = new ArrayList();

    String url = "jdbc:mysql://localhost:3306/cinema";
    String userid = "root";
    String password = "password";
    String sql = "SELECT * FROM TimeTable";


    try (Connection connection = DriverManager.getConnection( url, userid, password );
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery( sql ))
    
        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();


        for (int i = 1; i <= columns; i++)
        
            columnNames.add( md.getColumnName(i) );
        


        while (rs.next())
        
            ArrayList row = new ArrayList(columns);

            for (int i = 1; i <= columns; i++)
            
                row.add( rs.getObject(i) );
            

            data.add( row );
        
    
    catch (SQLException e)
    
        System.out.println( e.getMessage() );
    


    Vector columnNamesVector = new Vector();
    Vector dataVector = new Vector();

    for (int i = 0; i < data.size(); i++)
    
        ArrayList subArray = (ArrayList)data.get(i);
        Vector subVector = new Vector();
        for (int j = 0; j < subArray.size(); j++)
        
            subVector.add(subArray.get(j));
        
        dataVector.add(subVector);
    

    for (int i = 0; i < columnNames.size(); i++ )
        columnNamesVector.add(columnNames.get(i));

    //  Create table with database data    
    JTable table = new JTable(dataVector, columnNamesVector)
    
        public Class getColumnClass(int column)
        
            for (int row = 0; row < getRowCount(); row++)
            
                Object o = getValueAt(row, column);

                if (o != null)
                
                    return o.getClass();
                
            

            return Object.class;
        
    ;

    JScrollPane scrollPane = new JScrollPane( table );
    getContentPane().add( scrollPane );

    JPanel buttonPanel = new JPanel();
    getContentPane().add( buttonPanel, BorderLayout.SOUTH );
    pack();



public static void main(String[] args)

    Staff_Info frame = new Staff_Info();
    frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible(true);


And here you can see the above output!

我正在使用 MySQL Workbench 和 NetBeans 开发 Ubuntu 14.04。

timetable_starttime 和 timetalbe_endtime 字段在它们的表创建中都有 TIME 数据类型,只要一个有效的插入字段。

Here you can see the MySQL Select * statement for that table.

我发现这与 Epoch 时间有关,但我无法找到问题的实际解决方案!

任何帮助将不胜感激!

感谢您的宝贵时间!

【问题讨论】:

你能分享你的表定义吗? 显然timetable_starttimetimetalbe_endtime 数据类型应该是TIME 而不是DATE 这是表定义! i.imgur.com/XwnhjMa.jpg ...我的意思是我的主要帖子上的时间不是日期... @Sarriman - 请不要分享图片,您可以复制该文本并将其粘贴到您的问题中 【参考方案1】:

对于this documentation,对rs.getObject(i) 的调用将为您的TIME 列返回java.sql.Time 的实例。

java.sql.Timejava.util.Date 的子类

很遗憾,JTable 没有为java.sql.Time 设置默认的Renderer。但是 does have one 是 java.util.Date - 它使用短日期格式进行显示 - 默认只显示日期部分,对于 Time 来说全为零 - 所以它总是 1970 年 1 月 1 日

那么如何解决这个问题?

使用特定的时间渲染器将自定义渲染器添加到您的 JTable:

TableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() 

    SimpleDateFormat f = new SimpleDateFormat("HH:mm:ss");

    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) 
        if( value instanceof Time) 
            value = f.format(value);
        
        return super.getTableCellRendererComponent(table, value, isSelected,
                hasFocus, row, column);
    
;
table.setDefaultRenderer(Time.class, tableCellRenderer);

祝你好运。

【讨论】:

非常感谢!我会立即尝试将其“挖掘”到代码中!

以上是关于使用 JDBC 从 MySQL 列获取 :Jan 01, 1970 输出的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 从 MySQL 获取图像

JDBC、MySQL:从 PreparedStatement 执行获取回行数据

从 jdbc/postgresql 获取新创建表的列元数据

JDBC从连接池获取连接

如何从给定表中获取唯一列?

Informix JDBC PySpark 将列名中的结果作为列值读取