You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:15:01