此源代码如何创建新的数据库记录?我正在逆向工程一个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
`
我可以看到'INSERT'语句;它由这个调用产生:'this.dbTransfers.insert(conn);'。 – axiac