如何在 java 中的 con.commit() 之后刷新表?

Posted

技术标签:

【中文标题】如何在 java 中的 con.commit() 之后刷新表?【英文标题】:How to refresh table after con.commit() in java? 【发布时间】:2020-07-03 15:56:31 【问题描述】:

我正在使用 java 在表 MY_TABLE 中创建一个新寄存器,然后,我正在执行查询以获取该表的 max(id)。但是,Java 正在获取前一个。我的意思是:

mybean.store(con)
con.commit();
pstm = con.prepareStatement("SELECT MAX (ID) FROM MY_TABLE");
                rs = pstm.executeQuery();
                while (rs.next())
                    id =  rs.getString("ID");
                    System.out.println("id: " +id);
                

在 con.commit() 之前;该表的 max(ID)=3

在 com.commit() 之后,表的 max(ID)=4

但我得到 MAX(ID)=3

有人可以帮我解决这个问题吗?

【问题讨论】:

不应该是rs.getString(1)之类的吗?该查询中不存在 ID 列。 跟进@TheImpaler 的评论 - 如果您希望将包含 MAX 函数结果的列命名为 ID,那么您需要在查询中为其提供一个名称:SELECT MAX (ID) AS ID FROM MY_TABLE 或 @ 987654326@ 都会这样做 - 我更喜欢前者,因为它更容易理解。 【参考方案1】:

你正在这样做;如果这返回错误的结果,或者您的数据库不包含您认为它包含的内容,或者您​​的数据库引擎已损坏(mysql 经常损坏,可能就是问题所在。解决方法是不使用 mysql),或者您的代码是破碎的。您的 sn-p 包含错误(第一行后没有分号),因此这不是直接粘贴而是修改;通常,您应该准确粘贴表现出您不理解的行为的代码,因为如果您对其进行编辑或尝试在不运行简化的情况下对其进行简化,您可能会不小心删除了可以解释您所观察到的内容的内容。

更一般地说,如果您想要的只是为自动增量列生成的 ID,那么您不是这样做的。您可以使用语句的.getGeneratedKeys() 方法来获取这些;作为executeUpdate 通话的一部分,您可能需要传入Statement.RETURN_GENERATED_KEYS

【讨论】:

【参考方案2】:

    如果您没有参数化查询,则不需要PreparedStatement。在这种情况下,我会使用Statement

    您不需要while (rs.next()),因为您的查询将返回单个值。我会使用if (rs.next())

    您的查询没有名为ID 的字段,因此rs.getString("ID") 将抛出SQLException。您应该在查询中使用rs.getString(1) 或使用别名(例如,下面示例中的maxId)。此外,您应该使用getInt 而不是getString

    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT MAX(ID) AS maxId FROM MY_TABLE");
    int id = Integer.MIN_VALUE;
    if (rs.next()) 
        id = rs.getInt(1);  
        //id = rs.getInt("maxId");  
    
    System.out.println(id); 
    

【讨论】:

以上是关于如何在 java 中的 con.commit() 之后刷新表?的主要内容,如果未能解决你的问题,请参考以下文章

java中jdbc多表操作如何事物回滚

数据库(批处理事物

python3.3.1中sqlite3问题

JDBC高级特性事务并发控制和行集

深入理解 Spring 事务原理

深入理解 Spring 事务原理