将JTable数据转换为UPDATE语句

时间:2015-08-19 17:58:02

标签: java sql

我希望能够将JTable中的数据转换为UPDATE语句,以便我可以获取表内容并使用现有的SQL连接转移到DB中。

例如

Example data

UPDATE Products SET ProductID="JUICE32", ProdName="Orange Juice", Stock=190, Price=8.00 WHERE ProductID="JUICE32";
UPDATE Products SET ProductID="SOAP123", ProdName="Deluxe Soap", Stock=500, Price=15.99 WHERE ProductID="SOAP123";
UPDATE Products SET ProductID="TOWEL12", ProdName="Towel", Stock=0, Price=25.50 WHERE ProductID="TOWEL12";

请注意,我不允许编辑主键。这是故意的

2 个答案:

答案 0 :(得分:2)

您可以使用PreparedStatment使代码更易于理解和维护。

我不是SQL专家,但代码类似于:

String sql = "UPDATE Products SET ProductID = ?, ProdName = ?, Stock = ?, Price = ? WHERE ProductID = ?";

PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString( 1, table.getValueAt(row, 0) );
stmt.setString( 2, table.getVAlueAt(row, 1) );
stmt.setInteger( 3, table.getVAlueAt(row, 2) );
stmt.setDouble( 4, table.getVAlueAt(row, 3) );
stmt.setString( 5, table.getValueAt(row, 0) );
stmt.executeUpdate();
stmt.close();

希望你能得到这个想法。使用"?"构建SQL语句。对于可变数据。然后你只需设置每个"?"的值。 PreparedStatement会担心格式正确等等。更不容易出错。

另外,我不确定您的代码为什么设置产品ID。我原以为你只需要设置3个值就可以了。

编辑:

为了使上述更加通用,您可以执行以下操作:

public void updateTable(JTable table)
{
    String sql = createSql(table);

    for (int i = 0; i < table.getRowCount(); i++)
    {
        updateRow(sql, table, i);
    }
}


public String createSql(JTable table)
{
    StringBuilder sql = new StringBuilder();
    sql.append("UPDATE " + tableName + " SET ");

    for (int i = 0; i < table.getColumnCount(); i++)
    {
        sql.append(table.getColumnName(i) + " = ?";
        sql.append(i + 1 == table.getColumnCount() ? " " : ", ");
    }

    return sql.toString();
}

public void updateRow(String sql, JTable table int row)
{
    PreparedStatement stmt = connection.prepareStatement(sql.toString());

    for (int i = 0; i <table.getColumnCount(); i++)
    {
        stmt.setObject( i + 1, table.getValueAt(row, i) );
    }

    stmt.setObject(table.getColumnCount, table.getValueAt(row, i));
    stmt.executeUpdate();
    stmt.close();
}

答案 1 :(得分:1)

到目前为止,我的代码只支持BigDecimal,String,Integer和Boolean类型,但添加更多内容应该相对容易(查看switch语句内部)

public String getUpdateStmt(JTable JTable1, String tableName)
{
    String update = "";
    for (int i = 0; i < JTable1.getRowCount(); i++)
    {
        update += "UPDATE " + tableName + " SET";
        for (int j = 0; j < JTable1.getColumnCount(); j++)
        {
            update += " " + JTable1.getColumnName(j) + "=";
            switch (JTable1.getValueAt(i, j).getClass().getTypeName())
            {
                case "java.lang.String":
                    update += "\"" + JTable1.getValueAt(i, j) + "\"";
                    break;
                case "java.math.BigDecimal": //all these don't need quotes etc
                case "java.lang.Integer":
                case "java.lang.Boolean":
                    update += JTable1.getValueAt(i, j);
                    break;
                default:
                    System.err.println(JTable1.getValueAt(i, j).getClass().getTypeName());
            }
            if (!(j + 1 == JTable1.getColumnCount()))//stops insertion of comma on last value
            {
                update += ",";
            }
        }
        update += " WHERE " + JTable1.getColumnName(0) + "=\"" + JTable1.getValueAt(i, 0) + "\"";//Where clause using primary key
        update += ";\n";//ends SQL statement
    }

    System.err.println(update); //debugging
    return update;
}

executeSQL(String stmt);方法中正常使用

我只想在做项目时发布我的发现。我已经在互联网上搜索了这个,并且找不到将jtable更改为SQL的方法。
请告诉我可以添加的任何改进,因为我打算帮助很多人