当前位置: 首页 > 知识库问答 >
问题:

这段代码是如何在没有任何insert语句的情况下在MySQL中创建新记录的?

范宏大
2023-03-14

这个源代码是如何创建一个新的数据库记录的?我正在对一个Java应用进行逆向工程,我自己也没有太多的Java经验。我希望看到类似“insert INTO ShipBargePipe(columns)VALUES(VALUES)等,但我看到的只是一个dbTransfers对象,没有其他东西。有人知道这是如何工作的吗?

提前道谢。

`

  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;
  }

`

Edit*这里是dbObject insert方法及其依赖的createInsert方法。

它看起来像是动态地在列中循环来构建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的日志记录,当添加/删除新记录等时,它会向我精确地显示幕后发生了什么。

`

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

`

共有1个答案

杭泉
2023-03-14

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

 类似资料:
  • 你能给我解释一下这段代码吗,为什么我们没有任何返回类型,代码仍然工作正常?

  • 本文向大家介绍如何在没有在MySQL INSERT INTO语句中指定列名的情况下将值插入列中?,包括了如何在没有在MySQL INSERT INTO语句中指定列名的情况下将值插入列中?的使用技巧和注意事项,需要的朋友参考一下 为了在没有在INSERT INTO语句中指定列名的情况下将值插入列中,我们必须提供与表中列数匹配的值数,同时还要注意该列的数据类型。 示例 在下面的示例中,我们插入了值,但

  • 每次我在eclipse中创建一个android项目时,除了作为项目添加的appcompat_v7之外,它都以错误“没有找到与给定名称匹配的资源:attr xxx”开始。 我找到了一种方法来解决此问题,方法是完全删除操作栏,避免使用少于API 11,修改所有XML文件并删除创建的appcompat_v7项目。但是,这个解决方案很繁琐,每次我需要创建一个简单的项目时都必须完成。 我的问题不是“什么是a

  • 我正在上一门Java课程,我们还没有正式学习if语句。我在学习,看到了这个问题:

  • 我正在遵循Oracle的教程在JavaFX中创建TableView。在这个截图中,我复制并粘贴了代码,发现了几个错误,教程中没有提到这些错误。 TableView上的警告显示: TableView是原始类型。对泛型类型TableView的引用 表列上的警告说: 表列是一个原始类型。对泛型类型TableCol列的引用 addAll方法上的警告是: 类型安全:方法addAll(Object…)属于原始

  • 我们有一个应用程序,将部署在具有不同IP的服务器上。JNLP是在构建时生成的。因此,我们定义了没有代码库的JNLP: 然而,当第二次启动这个应用程序时(从第一次启动时创建的桌面图标),代码库被设置为本地文件系统,这是绝对无用的。我希望Java Webstart在第一次启动应用程序时使用实际的源地址设置代码库。这似乎不是真的。 我如何准备一个通用的JNLP,它可以在不同的服务器上使用而无需修改?