批量执行Sql语句,MySQL存储过程Java复现

通常,我们在进行数据操作时,通过定义存储过程会带来很大的便捷,但是如果存储过程中间出现错误,并且该过程中执行sql语句众多,排查错误就会变得很困难,会花费很大的时间去查找确认错误的缘由,可以将原定义的存储过程改写为Java代码,这样方便错误的排查。

一、MySQL存储过程:
示例:UpdateSeriesDataInfo
- - 存储过程参数:Id1 int, Id2 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);
    }

你可能感兴趣的:(MySQL,Java)