这个源代码是如何创建一个新的数据库记录的?我正在对一个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
`
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,它可以在不同的服务器上使用而无需修改?