我有几乎相同的两种方法用于插入 MySQL 表,其中后者有一个参数,即 PaymentRequest
。现在,第一种方法在代码库中的相当多实例中使用,但这些实例没有
PaymentRequest
字段,这让我很烦恼,因为其余代码是一样的。
public final void insertOrder(final LocalOrderImpl o, final boolean retryCommit, final boolean withExecutableNominal,
final boolean withIocOrderId) throws SQLException {
Long orderId = null;
if (retryCommit) {
Object[] params =
new Object[]{o.getUserId(), o.getLimit(), o.getNominal(), o.getState(), o.getPause_no_credit(), o.getMarketId(),
o.getType(), o.getExchangeId(), o.getOriginalRate(), o.getShadowOrderId(),
withExecutableNominal ? o.getNominal() : null, o.getIocOrderNumber()};
orderId = insertOrderWithRetry(new InsertOrderWithRetryParams(params, withIocOrderId));
} else if (withIocOrderId && Config.IOC_ORDER_ID_COL) {
sqlProcessor.execute(SqlQuery.INSERT_ORDER_WITH_IOC, o.getUserId(), o.getLimit(), o.getNominal(), o.getState(),
o.getPause_no_credit(), o.getMarketId(), o.getType(), o.getExchangeId(), o.getOriginalRate(), o.getShadowOrderId(),
withExecutableNominal ? o.getNominal() : null, o.getIocOrderNumber());
orderId = readLastOrderId();
} else {
sqlProcessor.execute(SqlQuery.INSERT_ORDER, o.getUserId(), o.getLimit(), o.getNominal(), o.getState(), o.getPause_no_credit(),
o.getMarketId(), o.getType(), o.getExchangeId(), o.getOriginalRate(), o.getShadowOrderId(),
withExecutableNominal ? o.getNominal() : null);
orderId = readLastOrderId();
}
o.setOrderNumber(orderId);
log.debug("Inserted {} order id db: {}, nominal {}, limit {}", o.isBuyOrder() ? "buy" : "sell", o.getOrderId(),
NumberUtils.toExternal(o.getNominal()), NumberUtils.toExternal(o.getLimit()));
}
这是我用 PaymentRequest
字段新编写的方法。
/**
* @param o
* @param retryCommit
* @param withExecutableNominal
* @throws SQLException
* @implNote stores the payment request Id in the orderbook table
*/
public final void insertOrder(final LocalOrderImpl o, final PaymentRequest paymentRequest, final boolean retryCommit, final boolean withExecutableNominal,
final boolean withIocOrderId) throws SQLException {
Long orderId = null;
if (retryCommit) {
Object[] params =
new Object[]{paymentRequest.getId(), o.getUserId(), o.getLimit(), o.getNominal(), o.getState(), o.getPause_no_credit(), o.getMarketId(),
o.getType(), o.getExchangeId(), o.getOriginalRate(), o.getShadowOrderId(),
withExecutableNominal ? o.getNominal() : null, o.getIocOrderNumber()};
orderId = insertOrderWithRetry(new InsertOrderWithRetryParams(params, withIocOrderId));
} else if (withIocOrderId && Config.IOC_ORDER_ID_COL) {
sqlProcessor.execute(SqlQuery.INSERT_ORDER_WITH_IOC, paymentRequest.getId(), o.getUserId(), o.getLimit(), o.getNominal(), o.getState(),
o.getPause_no_credit(), o.getMarketId(), o.getType(), o.getExchangeId(), o.getOriginalRate(), o.getShadowOrderId(),
withExecutableNominal ? o.getNominal() : null, o.getIocOrderNumber());
orderId = readLastOrderId();
} else {
sqlProcessor.execute(SqlQuery.INSERT_ORDER, paymentRequest.getId(), o.getUserId(), o.getLimit(), o.getNominal(), o.getState(), o.getPause_no_credit(),
o.getMarketId(), o.getType(), o.getExchangeId(), o.getOriginalRate(), o.getShadowOrderId(),
withExecutableNominal ? o.getNominal() : null);
orderId = readLastOrderId();
}
o.setOrderNumber(orderId);
log.debug("Inserted {} order id db: {}, nominal {}, limit {}", o.isBuyOrder() ? "buy" : "sell", o.getOrderId(),
NumberUtils.toExternal(o.getNominal()), NumberUtils.toExternal(o.getLimit()));
}
SqlQuery.INSERT_ORDER_WITH_IOC
和 SqlQuery.INSERT_ORDER
在 sql.yml
文件中编写了几乎相同的 SQL 查询。有什么建议如何消除代码的冗余吗?
最佳答案
请参阅:How to Create a Stored Procedure
创建两个存储过程,一个用于
SqlQuery.INSERT_ORDER_WITH_IOC
另一个用于 SqlQuery.INSERT_ORDER
。
使用上面的链接了解如何在 mySql 中创建存储过程。
然后使用此链接 How to use JDBC Callable Statements to Exceute Stored Procedures 。这将为您提供有关如何与他们互动的信息。
祝你好运!
牛仔。
关于java - 删除数据库插入的冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48708299/