在springboot入口处调用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class XxxServerBootstrap implements CommandLineRunner {
@Autowired
private SchemaExecutor schemaExecutor;
@Override
public void run(String... strings) throws Exception {
schemaExecutor.execute();
}
public static void main(String[] args) {
SpringApplication.run(XxxServerBootstrap.class, args);
}
}
具体实现参考:
import com.google.common.io.Files;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Component
public class SchemaExecutor {
private final Logger logger = LoggerFactory.getLogger(SchemaExecutor.class);
@PersistenceContext
private EntityManager entityManager;
@Transactional(rollbackOn = Exception.class)
public void execute() {
List<String> lines = readScripts();
for (String line : lines) {
Query query = entityManager.createNativeQuery(line);
int row = query.executeUpdate();
logger.info("execute {} return row {}", line, row);
}
}
private List<String> readScripts() {
List<String> lines = new ArrayList<>(0);
try {
File[] files = new File(getRuntimePath()).listFiles((pathname) -> pathname.getName().endsWith(".sql"));
for (File file : files) {
lines.addAll(Files.readLines(file, Charset.defaultCharset()));
file.delete();
}
return lines;
} catch (IOException e) {
logger.info("not found file schema.sql");
return lines;
}
}
private String getRuntimePath() {
String locationPath = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
File runtimePath;
try {
locationPath = URLDecoder.decode(locationPath, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
File locationFile = new File(locationPath);
runtimePath = matchParent(locationFile, ".jar!");
if (runtimePath == null) {
runtimePath = matchParent(locationFile, "classes");
} else {
runtimePath = runtimePath.getParentFile();
}
if (runtimePath == null) {
throw new RuntimeException("not find current program runtime path");
}
return URI.create(runtimePath.getPath()).getPath();
}
private File matchParent(File file, String name) {
File parent = file;
while (parent != null) {
if (parent.getAbsolutePath().endsWith(name)) {
return parent;
}
parent = parent.getParentFile();
}
return null;
}
}
依赖的jar包:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6a833c3f97404d03ba44b5c4976f8115.png)