通常,我们在进行数据操作时,通过定义存储过程会带来很大的便捷,但是如果存储过程中间出现错误,并且该过程中执行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);
}