2017-04-26 31 views
0

此源代码如何创建新的数据库记录?我正在逆向工程一个Java应用程序,并且我自己没有太多的Java经验。我期望看到像“INSERT INTO ShipBargePipe(列)VALUES(值)等等。但我看到的只是一个dbTransfers对象,没有别的。有没有人有任何想法这是如何工作的?此代码如何在没有任何插入语句的情况下在MySQL中创建新记录?

在此先感谢。

`

int insertSBP(String direction, int selectedTransferTypeNumber, int selectedSBPNumber, Timestamp shouldStart, int barrels, String notes) 
    throws NumberFormatException, SQLException 
    { 
    int newTransferNumber = -1; 
    Connection conn = null; 
    try 
    { 
     int userNumber = GV.user.getUserNumber(); 

     conn = GV.getConnection(false); 

     ResultSetCA selectedProducts = (ResultSetCA)this.jListProducts.getSelectedVectors(); 
     ResultSetCA selectedSources = null; 
     ResultSetCA selectedDestinations = null; 
     if (direction.equals("Outbound")) { 
     selectedSources = (ResultSetCA)this.jListSourceTanks.getSelectedVectors(); 
     } else { 
     selectedDestinations = (ResultSetCA)this.jListDestinationTanks 
      .getSelectedVectors(); 
     } 
     this.dbTransfers.resetChanged(); 

     this.dbTransfers.setInt(selectedTransferTypeNumber, "transferTypeNumber"); 
     this.dbTransfers.setInt(userNumber, "userNumber"); 
     this.dbTransfers.setTimeStamp(shouldStart, "ShouldStartStamp"); 
     this.dbTransfers.setInt(selectedSBPNumber, "SBPNumber"); 
     this.dbTransfers.setString(notes, "Notes"); 
     this.dbTransfers.setInt(barrels, "BarrelsRequested"); 
     this.dbTransfers.insert(conn); 

     newTransferNumber = DbObject.lastId(conn); 
     if (direction.equals("Outbound")) { 
     for (int counter = 0; counter < selectedSources.size(); counter++) 
     { 
      int tankNumber = selectedSources.getInt(counter, 0); 
      int customerNumber = selectedSources.getInt(counter, 2); 

      this.dbTransferTank.resetChanged(); 
      this.dbTransferTank.setInt(newTransferNumber, "transferNumber"); 
      this.dbTransferTank.setInt(tankNumber, "tankNumber"); 
      this.dbTransferTank.setString("s", "sourceDest"); 
      this.dbTransferTank.setInt(customerNumber, "customerNumber"); 
      this.dbTransferTank.setNull("startBarrels"); 
      this.dbTransferTank.insert(conn); 
     } 
     } else { 
     for (int counter = 0; counter < selectedDestinations.size(); counter++) 
     { 
      int tankNumber = selectedDestinations.getInt(counter, 0); 
      int customerNumber = selectedDestinations.getInt(counter, 2); 

      this.dbTransferTank.resetChanged(); 
      this.dbTransferTank.setInt(newTransferNumber, "transferNumber"); 
      this.dbTransferTank.setInt(tankNumber, "tankNumber"); 
      this.dbTransferTank.setString("d", "sourceDest"); 
      this.dbTransferTank.setInt(customerNumber, "customerNumber"); 
      this.dbTransferTank.setNull("startBarrels"); 
      this.dbTransferTank.insert(conn); 
     } 
     } 
     for (int counter = 0; counter < selectedProducts.size(); counter++) 
     { 
     int productNumber = selectedProducts.getInt(counter, 0); 
     this.dbProductTransfer.resetChanged(); 
     this.dbProductTransfer.setInt(newTransferNumber, "transferNumber"); 
     this.dbProductTransfer.setInt(productNumber, "productNumber"); 
     this.dbProductTransfer.insert(conn); 
     } 
     conn.commit(); 
    } 
    catch (SQLException e) 
    { 
     if (conn != null) { 
     conn.rollback(); 
     } 
     throw e; 
    } 
    return newTransferNumber; 
    } 

`

编辑*这里是DBOBJECT插入方法和它的依赖createInsert方法。

我t看起来像动态循环遍历列来构建SQL查询字符串。也许有一种方法可以在mysql数据库上启用日志记录,这样我就可以准确地看到查询字符串对它的运行情况了吗?

`

String createInsert() 
    throws SQLException 
    { 
    String fieldNames = ""; 
    String values = ""; 
    for (int i = 0; i < this.fields.length; i++) { 
     if (this.fields[i].isChanged()) { 
     if (fieldNames.equals("")) 
     { 
      fieldNames = this.fields[i].getName(); 
      values = "?"; 
     } 
     else 
     { 
      fieldNames = fieldNames + ", " + this.fields[i].getName(); 
      values = values + ",?"; 
     } 
     } 
    } 
    if (this.fields.equals("")) { 
     throw new SQLException("The table " + this.tableName + 
     " does not have anything to insert"); 
    } 
    return createInsert(this.schema + "." + this.tableName, fieldNames, values); 
    } 

`

`

public void insert(Connection conn) 
    throws SQLException 
    { 
    Statement stmt = null; 
    PreparedStatement ps = null; 
    int i = 0; 
    int j = 1; 
    try 
    { 
     String dml = createInsert(); 
     printDebug(dml); 
     ps = conn.prepareStatement(dml); 
     for (i = 0; i < this.fields.length; i++) { 
     if (this.fields[i].isChanged()) 
     { 
      this.fields[i].setInPreparedStatement(ps, j); 
      if (this.fields[i].getObject() == null) { 
      printDebug(j + ": " + this.fields[i].getObject()); 
      } else { 
      printDebug(j + ": '" + this.fields[i].getObject() + "'"); 
      } 
      j++; 
     } 
     } 
     int v = ps.executeUpdate(); 
     if (v != 1) { 
     throw new SQLException("I can not insert the table " + this.tableName); 
     } 
    } 
    finally 
    { 
     resetChanged(); 
     if (ps != null) { 
     ps.close(); 
     } 
     if (stmt != null) { 
     stmt.close(); 
     } 
    } 
    } 

`

编辑*进一步挖掘后,我启用对MySQL的记录,它表明我exaclty是怎么回事幕后新增/删除新纪录等。

`

170426 15:39:16  4 Query  SET autocommit=0 
       4 Prepare  [5] SELECT transfertypenumber, transfertypename, abbreviation FROM rc.transfertypes WHERE transfertypename= ? 
       4 Execute  [5] SELECT transfertypenumber, transfertypename, abbreviation FROM rc.transfertypes WHERE transfertypename= 'Tank' 
       4 Prepare  [6] INSERT INTO rc.transfers(transfertypenumber, usernumber, shouldstartstamp, notes, barrelsrequested) VALUES (?,?,?,?,?) 
       4 Execute  [6] INSERT INTO rc.transfers(transfertypenumber, usernumber, shouldstartstamp, notes, barrelsrequested) VALUES (5,49,'2017-04-26 15:39:05','ZACKSCRIVEN',999) 
       4 Prepare  [7] SELECT last_insert_id() 
       4 Execute  [7] SELECT last_insert_id() 
       4 Prepare  [8] INSERT INTO rc.transfertank(transfernumber, tanknumber, sourcedest, customernumber) VALUES (?,?,?,?) 
       4 Execute  [8] INSERT INTO rc.transfertank(transfernumber, tanknumber, sourcedest, customernumber) VALUES (76265,1,'s',18) 
       4 Prepare  [9] INSERT INTO rc.transfertank(transfernumber, tanknumber, sourcedest, customernumber) VALUES (?,?,?,?) 
       4 Execute  [9] INSERT INTO rc.transfertank(transfernumber, tanknumber, sourcedest, customernumber) VALUES (76265,9,'d',18) 
       4 Prepare  [10] INSERT INTO rc.producttransfer(transfernumber, productnumber) VALUES (?,?) 
       4 Execute  [10] INSERT INTO rc.producttransfer(transfernumber, productnumber) VALUES (76265,21) 
       4 Query  commit 

`

+0

我可以看到'INSERT'语句;它由这个调用产生:'this.dbTransfers.insert(conn);'。 – axiac

回答

1

dbTransfers和dbTransferTank似乎代表某种ORM(对象关系映射)的对象。 insert语句不是由这段代码直接调用,而是嵌入到调用这些对象各自的.insert方法的行中。

+0

谢谢!我深入了解它,这绝对是它在做什么。从理论上讲,在编写代码时更容易。除非我试图对其进行反向工程,并且我不能轻松访问查询字符串。也许有一种方法可以使MySQL日志的每个查询都运行在它上面? –

+0

这可能会浪费时间。如果您认为影响插入的所有内容都发生在对“.resetChanged()”的调用和对“.insert()”的后续调用之间,则中间的行会告诉您确切哪些列正在更新。列名似乎是这些“.setInt”,“.setNull”等调用的最后一个参数。 MySQL有一个“慢日志”功能,但你可能会获得比你想要的更多的日志。 –

+0

它似乎让我感兴趣。 请参阅编辑 –

相关问题