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
相关产品推荐
相关产品推荐

