一括実行Sql文、MySQLストアド・プロシージャJava再現

5862 ワード

  ,          ,                ,              ,        sql    ,           ,                  ,              Java  ,         。

一、MySQLストアド・プロシージャ:例:UpdateSeriesDataInfo--ストアド・プロシージャ・パラメータ:Id 1 int,Id 2 int
BEGIN       
        declare oldId int;
        declare newId int;
        select id into oldId from A where id = Id1;
        select id into newId from B where id = Id2;

        UPDATE mt_model SET sid = Id1, bid = newId WHERE id = Id2;

        UPDATE other.info c SET c.sid= Id1, c.bid = newId WHERE c.id = Id2;

       //             
        call other_db.`ChangeSeriesOfData`(Id1, Id2);
    END

二、Javaはストレージプロセスを再現し、大量にSqlを実行する:StringBuilder方法を通じて、ストレージプロセス中の複数のsql文をつなぎ合わせることができ、";を使用して分割を行い、一括して実行します.
    private static void updateSeriesDataInfo(int seriesId) {
        StringBuilder sb = new StringBuilder();

        sb.append("--- sql ---" + ";");
        sb.append("--- sql ---");
        //sql   
        String[] sqls = sb.toString().split(";");
        //    
        execute(sqls);

//               call other_db.`ChangeSeriesOfData`(Id1, Id2);
        callDBProcedure("CALL other_db.`ChangeSeriesOfData`(?, ?)", Id1, Id2);
    }

Testライブラリのストアド・プロシージャを呼び出します.
    /**
     *   Test       
     * @param sql :         
     * @param id1   :   1 
     * @param id2   :   2
     */
    public static void callDBProcedure(String sql, int id1, int id2) {
        CallableStatement statement = null;
        Connection conn = null;
        try {
            conn = getDbConnectionForTest();
            statement = conn.prepareCall(sql);
            statement.setInt(1, id1);
            statement.setInt(2, id2);
            statement.execute();
        } catch (SQLException e) {
            logger_.info(e.getMessage());
        } finally {
            Toolkit.close(conn, null, statement);
        }
    }

    private static Connection getDbConnectionForTest() {
        return DbConnectionManager.getConnection(DbConnectionManager.DS,
                "test");
    }

一括実行sql:(PreparedStatementのexecuteBatchメソッドを使用しても実行できます)
    /**
     *     sql
     * @param sqls : sql  
     */
    public static void execute(String[] sqls) {
        Connection conn = ToolkitgetMySqlConnection();
        for (int i = 0; i < sqls.length; i++) {

            PreparedStatement ps = null;
            try {
                String sql = sqls[i];
                logger_.info("execute sql : " + sql);
                ps = conn.prepareStatement(sql);
                if (sql.startsWith("SELECT") || sql.startsWith("select")) {
                    ps.executeQuery();
                } else {
                    ps.executeUpdate();
                }
            } catch (SQLException e) {
                logger_.info(e.getMessage());
            } finally {
                Toolkit.close(ps);
            }
        }
        Toolkit.close(conn);
    }