java - 删除数据库插入的冗余

标签 java mysql sql

我有几乎相同的两种方法用于插入 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_IOCSqlQuery.INSERT_ORDERsql.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/

相关文章:

java - 使用 contentprovider 的 boolean 方法总是返回 true?

java - 这个错误在java中意味着什么?

mysql - 从表中选择每个用户的前 3 个查看图像

如果发现重复项,MYSQL 查询是否更新字段?

java - Vaadin 获取 init 外部字符串的值

java - JSyn:两个 channel 上的正弦波

php - 是否可以使用 PDO 在插入中嵌入 select 语句

mysql - Docker - 我的 MySQL 数据库应该位于容器内部还是外部?

sql - 如何将单个列值拆分为多个列值?

sql - 如何在 SQL (Postgres) 中查找子字符串