Java操作SQL脚本时如何设置变量替换${schema}类占位符?
SQL文件变量替换解决方案
你当前使用的MyBatis ScriptRunner 工具类本身就内置了${}格式占位符的替换能力,无需额外引入第三方工具库,修改代码即可直接实现需求。
方案1:使用ScriptRunner内置变量替换功能(推荐)
ScriptRunner 提供setVariable(key, value)方法,会自动匹配SQL文件中${key}格式的占位符做替换,修改后的代码如下:
// 完整可运行代码 import org.apache.ibatis.jdbc.ScriptRunner; import java.io.BufferedReader; import java.io.FileReader; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class App { public static void runscripts(Connection conn, String schema) throws Exception{ try { ScriptRunner sr = new ScriptRunner(conn); // 替换${schema}占位符为传入的schema值 sr.setVariable("schema", schema); // 可选:关闭控制台执行日志打印,不需要可以删掉 sr.setLogWriter(null); Reader reader = new BufferedReader(new FileReader("/Users/sampleScript.sql")); sr.runScript(reader); } catch (Exception e) { e.printStackTrace(); }finally{ conn.close(); } } public static void main( String[] args ) throws Exception { Properties prop = new Properties (); prop.put("user", "bbb"); prop.put("password", "xxx#"); prop.put("db", "SIMPLE_DEMO"); String url = "xxxx://aaaa."; Connection conn = DriverManager.getConnection(url, prop); // 传入要设置的schema值PUBLIC runscripts(conn, "PUBLIC"); } }
执行后SQL文件中的${schema}会自动替换为PUBLIC,实际执行的建表语句为CREATE OR REPLACE TABLE PUBLIC.cricketers_data(...)。
注意事项
你当前SQL脚本中的INSERT语句没有加schema前缀,建议修改为INSERT INTO ${schema}.cricketers_data values(...),避免执行时因为默认schema不匹配找不到表的问题。
方案2:自定义变量替换逻辑(无需依赖ScriptRunner特性)
如果需要自己实现通用的变量替换逻辑,可以先读取SQL文件内容做全局替换后再执行,示例代码如下:
import java.nio.file.Files; import java.nio.file.Paths; import java.util.Map; import java.io.StringReader; // 通用SQL变量替换方法 public static String replaceSqlPlaceholders(String sqlFilePath, Map<String, String> placeholderMap) throws Exception { String sqlContent = Files.readString(Paths.get(sqlFilePath)); for (Map.Entry<String, String> entry : placeholderMap.entrySet()) { sqlContent = sqlContent.replace("${" + entry.getKey() + "}", entry.getValue()); } return sqlContent; } // runscripts方法中调用示例 String replacedSql = replaceSqlPlaceholders("/Users/sampleScript.sql", Map.of("schema", "PUBLIC")); Reader reader = new StringReader(replacedSql); sr.runScript(reader);
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

