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

Java REST API启动时自动执行MySQL查询的实现方案

实现Java REST API启动时自动执行MySQL查询

下面分两种常见场景给出解决方案:

一、Spring Boot项目(主流方案)

1. 直接使用data.sql/schema.sql文件

这是Spring Boot自带的最简单方式:

  • 把你的MySQL查询语句按顺序放到src/main/resources目录下的data.sql(用于插入数据)或schema.sql(用于创建表结构)中。
  • 在application.properties(或application.yml)里添加配置,确保启动时执行:
# 每次启动都执行SQL,适合开发环境;生产环境可按需改为never或when-missing
spring.sql.init.mode=always
# 指定SQL文件编码,避免乱码
spring.sql.init.encoding=UTF-8

注意:如果SQL语句中有多个命令,用分号分隔即可,Spring Boot会自动解析执行。

2. 自定义启动执行逻辑(更灵活)

如果需要更复杂的控制(比如条件执行、动态生成SQL),可以用CommandLineRunner或ApplicationRunner:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class StartupSqlExecutor implements CommandLineRunner {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void run(String... args) throws Exception {
        // 执行单条SQL
        jdbcTemplate.execute("INSERT INTO your_table (col1, col2) VALUES ('val1', 'val2')");
        
        // 批量执行多条SQL
        String[] sqlStatements = {
            "CREATE TABLE IF NOT EXISTS your_table (id INT PRIMARY KEY AUTO_INCREMENT, col1 VARCHAR(255), col2 VARCHAR(255))",
            "INSERT INTO your_table (col1, col2) VALUES ('val3', 'val4')"
        };
        
        for (String sql : sqlStatements) {
            jdbcTemplate.execute(sql);
        }
    }
}

二、非Spring Boot的普通Java项目

如果是普通Java REST API(比如用Jersey、Spark等框架),可以在启动入口加载SQL文件并执行:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;
import java.util.List;

public class ApiStartup {
    public static void main(String[] args) {
        // 数据库连接参数
        String url = "jdbc:mysql://localhost:3306/your_db";
        String user = "root";
        String password = "your_pwd";
        
        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             BufferedReader reader = new BufferedReader(new InputStreamReader(ApiStartup.class.getResourceAsStream("/init.sql")))) {
            
            // 读取SQL文件内容,按分号分割语句(注意处理语句内的分号,比如字符串中的)
            StringBuilder sqlBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sqlBuilder.append(line.trim());
            }
            List<String> sqlStatements = Arrays.asList(sqlBuilder.toString().split(";"));
            
            // 执行每条SQL
            for (String sql : sqlStatements) {
                if (!sql.trim().isEmpty()) {
                    stmt.execute(sql);
                }
            }
            
            System.out.println("初始化SQL执行完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 启动你的REST API服务...
    }
}

把你的SQL语句放到src/main/resources/init.sql文件中即可。

关键注意事项

  • 避免重复插入:如果是插入数据,建议用INSERT INTO ... ON DUPLICATE KEY UPDATE ...或者REPLACE INTO语法,防止主键冲突。
  • 权限检查:确保数据库用户拥有执行这些SQL的权限(比如CREATE、INSERT、ALTER等)。
  • SQL文件格式:保证SQL文件编码为UTF-8,避免中文乱码。

内容的提问来源于stack exchange,提问作者charbs29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:40:31