java:把查询结果存储到resultSet对象中,在把该对象的数据放置在一个JTable对象中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java:把查询结果存储到resultSet对象中,在把该对象的数据放置在一个JTable对象中相关的知识,希望对你有一定的参考价值。

那么该如何修改表格中单元格的数据呢?
如果是一个二维数组放置在个JTable的话,可以使用下表来定位某个单元格并设置数据,但是对于一个ResultSet对象的话,好像不可以啊,该如何解决??求教高手

参考技术A 我只能给你说明一下思路了。
1建立一个二组数组
2取得你要填充的结果集
3
for(循环)
将每一条记录填充到二级数组里的一个单元里去

4在tableModel中将数组的每条记录顺序添加,或是直接在初始化的那里指定二维数组和列名。追问

我改好了,但是有一点不明白,如果把数据存入到二维数组中的话,可以通过 数组名称[row][col]来修改该二维数组中某个单元格的数据,但是如果是一个ResulSet对象的话,能否修改呢?也就是说修改后的数据会不会更新到该ResultSet对象中呢?

追答

无论你想将修改后的数据存到程序的内存中,还是后台的数据库中,这些都是可以通过拼装SQL语句或是用纯字符串及数组的操作实现的。你的概念有些笼统,你是想存入数据库呢,还是让程序运行时动态监测每个单元格的数据?

追问

是这样的,我想做的 是当把表格 中的某个单元格修改后,更新后的数据自动录入到数据库。(效率有点低)

参考技术B 如果需要在线修改结果集,就得采用 可滚动、可更新的结果集。
Part Code:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
...
后面的就是JTable 的操作追问

你好,请教你一个问题,在AbstractTableModel,如果是一个二维数组可以很轻松的修改单元格某个值,即(setValueAt在AbstractTableModel中被监听了)
public void setValueAt(Object value, int row, int col)
shuzu[row][col]=value;

那是一整个resultSet结果集该如何修改呢?

参考技术C 先把resultSet放到一个二维数组不就行了,很简单的啦。追问

关键是直接把结果集放置在JTable更加方便,而且如果定义二维数组的话,必须采用动态的Arraylist或者Vertor很不方便

JDBC ResultSet 存储查询结果失败

【中文标题】JDBC ResultSet 存储查询结果失败【英文标题】:JDBC ResultSet fails to store query results 【发布时间】:2015-12-01 16:58:26 【问题描述】:

我目前正在尝试通过 JDBC 在 Oracle 数据库上运行查询。我已经在 SQLDeveloper 中测试了我的查询,但是当我尝试在我的 Java 程序中运行查询时,我的 ResultSet rs.next() 结果返回 false(意味着 rs 中没有存储任何内容)。

我的代码如下:

public static void testFunction() 
    Properties properties = new Properties();
    properties.put("user", "USERNAMEHERE");
    properties.put("password", "PASSWORDHERE");

    String URL = "jdbc:oracle:thin:@abc:123:def456";
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    String sqltxt = "SELECT a.MESSAGE, a.DATE, a.ID_NUM, b.MESSAGE, b.ANOTHER_ID FROM USER.SOME_TABLE_NAME a INNER JOIN USER.DIFFERENT_TABLE_NAME b on a.MESSAGE = b.MESSAGE where a.DATE= '1-December-2014' and b.ANOTHER_ID = 3 and a.ID_NUM IN(0, 100)";


    try 
        conn = DriverManager.getConnection(URL, properties);
        stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        rs = stmt.executeQuery();
        System.out.println("Records exist? " + rs.next());
     catch (Exception e) 
        e.printStackTrace();
     finally 
        try  if (rs != null) rs.close();  catch (Exception e) ;
        try  if (stmt != null) stmt.close();  catch (Exception e) ;
        try  if (conn != null) conn.close();  catch (Exception e) ;
    

我注意到,每当我向 sqltxt 添加 WHERE 子句时,我的 rs.next() 就会产生 false。

感谢任何见解,如果我碰巧自己找到了解决方案,我会在这里发布。

编辑:这是上面相同的代码,但对 sqltxt 的查询不同:

public static void testFunction() 
    Properties properties = new Properties();
    properties.put("user", "USERNAMEHERE");
    properties.put("password", "PASSWORDHERE");

    String URL = "jdbc:oracle:thin:@abc:123:def456";
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = '01-December-2015'";

    try 
        conn = DriverManager.getConnection(URL, properties);
        stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        rs = stmt.executeQuery();
        System.out.println("Records exist? " + rs.next());
     catch (Exception e) 
        e.printStackTrace();
     finally 
        try  if (rs != null) rs.close();  catch (Exception e) ;
        try  if (stmt != null) stmt.close();  catch (Exception e) ;
        try  if (conn != null) conn.close();  catch (Exception e) ;
    

【问题讨论】:

我会尝试评论/删除部分查询以缩小问题范围。 (如果你身边有一些 DBA,a.DATE= '1-December-2014' 很可疑) 我用更简单的 SQL 语句添加了代码的替代版本,它仍然给我错误,但我希望它有助于缩小问题 :) 我认为问题出在:... DATE= '1-December-2014' ....。将其更改为DATE = to_date('2014-12-01', 'yyyy-mm-dd' )。永远不要依赖隐式转换,它们可以在某些环境(语言设置)中工作,但在其他环境中可能会失败。 尝试使用 '2015-12-01' 作为日期值(另请参阅:docs.oracle.com/cd/E17952_01/refman-5.1-en/…) @Abhishek 看看下面的答案。 【参考方案1】:

您应该避免在 SQL 文本中使用硬编码的日期。尤其是 Oracle,它需要大量的工作。这里有两个答案,一个使用硬编码日期,另一个正确利用您的PreparedStatement 对象的力量:

在线日期

public static void testFunction() 
    Properties properties = new Properties();
    properties.put("user", "USERNAMEHERE");
    properties.put("password", "PASSWORDHERE");

    String URL = "jdbc:oracle:thin:@abc:123:def456";
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = to_date('01-December-2015', 'dd-month-yyyy')";

    try (Connection conn = DriverManager.getConnection(URL, properties);
        PreparedStatement stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        ResultSet rs = stmt.executeQuery();) 

        System.out.println("Records exist? " + rs.next());
     catch (Exception e) 
        e.printStackTrace();
    

(有关在 Oracle 中硬编码日期的更多信息,请参阅:http://www.techonthenet.com/oracle/functions/to_date.php)

通过参数化 SQL 的日期

public static void testFunction() 
    Properties properties = new Properties();
    properties.put("user", "USERNAMEHERE");
    properties.put("password", "PASSWORDHERE");

    String URL = "jdbc:oracle:thin:@abc:123:def456";
    String sqltxt = "SELECT MESSAGE FROM USER.SOME_TABLE WHERE DATE = ?";

    try (Connection conn = DriverManager.getConnection(URL, properties);
        PreparedStatement stmt = conn.prepareStatement(sqltxt, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        ResultSet rs = stmt.executeQuery();) 

        stmt.setDate(1, Date.valueOf(LocalDate.now().withYear(2015).withMonth(12).withDayOfMonth(1)));
        System.out.println("Records exist? " + rs.next());
     catch (Exception e) 
        e.printStackTrace();
    

阅读:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html,了解有关在 Java 中使用参数化 SQL 的更多信息。

【讨论】:

非常感谢,我很喜欢参数化的SQL方法 @Abhishek 一定要对每一个提供价值的答案进行投票。 @BasilBourque 我投了赞成票,但我还没有足够的声誉让它在整个网站上得到反映

以上是关于java:把查询结果存储到resultSet对象中,在把该对象的数据放置在一个JTable对象中的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的resultset详解

Java 中的resultset详解

JDBC ResultSet 存储查询结果失败

sql查询出来的内容存入map,然后把他们遍历出来

Java -- JDBC 学习--通过 ResultSet 执行查询操作

如何把ResultSet转换成Java对象