Spring загрузка. Запуск SQL-скриптов и получение данных о запуске приложения
Я разрабатываю приложение загрузки spring. На данный момент некоторые из моих конфигураций жестко закодированы (например, свойства Hystrix).
Итак, я хотел бы получить эти конфиги в момент запуска приложения или сразу после этого.
Можно ли это сделать с помощью spring загрузки? Я хочу запустить SQL script при запуске и получить данные.
Как следует извлекать и сохранять свойства/конфиги в моем приложении?
Я использую MyBatis и Oracle DB.
Ответы
Ответ 1
По умолчанию Spring-Boot загружает data.sql
и/или data-${platform}.sql
.
Однако имейте в виду, что скрипт будет загружаться при каждом запуске, поэтому я думаю, что имеет больше смысла (по крайней мере для производства), чтобы просто иметь значения, уже присутствующие в базе данных, а не вставляться повторно при каждом запуске. Я лично использовал инициализацию базы данных только для целей тестирования/разработки при использовании базы данных памяти. Тем не менее, эта функция предоставляется Spring-Boot.
источник: spring-boot-howto-database-initialization:
Spring JDBC имеет функцию инициализации источника данных. Spring Boot позволяет он по умолчанию и загружает SQL из стандартных расположений schema.sql и data.sql (в корне пути к классам). Кроме того, Spring Boot будет загрузите файлы schema- $ {platform}.sql и data- $ {platform}.sql (если присутствует).
SRC/основные/ресурсы/data- oracle.sql:
insert into...
insert into...
- Вы можете определить платформу с помощью:
spring.datasource.platform=oracle
.
- Вы можете изменить имя сценария sql для загрузки с помощью:
spring.datasource.data=myscript.sql
.
- Наряду с
data.sql
Spring-boot также загружает schema.sql
(до data.sql
).
- Вы также можете иметь логику "обновить или вставить" в вашем data.sql: oracle sql: update, если существует, иначе вставьте
Ответ 2
Если вы хотите вставить данные, основанные на некоторой бизнес-логике, я бы порекомендовал вам использовать прослушиватель событий. Таким образом, в основном при запуске приложения "OnApplicationEvent", так как он аннотирован @EventListener, будет вызываться автоматически.
Кроме того, так как в вашем случае вам нужно получить данные, вы просто используете свой объект репозитория, чтобы получить данные.
Вот один пример:
@Component
public class OnApplicationStartUp {
@Autowired
private ServiceRepository repository;
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
//Write your business logic here.
if (repository.findAll().size() <= 0) {
preloadData();
}else{
fetchData();
}
}
private void preloadData() {
List<Service> services = new ArrayList<>();
Service someService= new Service("name", "type");
services.add(someService);
...
...
repository.saveAll(services);
}
}
Ответ 3
Если вы получаете из файла application.properties, вы можете использовать класс Environment.
Вот так
Autowired
private Environment environment;
...
environment.getProperty("propertyName")
или вы можете определить свой собственный файл свойств. тогда вы можете получить от него
@PropertySource(name = "myProperties", value = "example.properties")
аннотация
Вам нужно использовать аннотацию @Value, чтобы получить определенное значение из файла свойств, который вы определили.
@Value("${propertyNameInYourPropertFile}")
private String url;
И вы хотите что-то запустить, когда приложение только запущено, вы можете использовать это перед методом
@EventListener(ApplicationReadyEvent.class)
Но нужно использовать @Service или @Component Annotation, у какого класса есть метод.
В общем, вы можете использовать это.
example.properties:
url=yourValue
userName=yourDBUserName
password=yourDBPassword
пример класса:
@Service
@PropertySource(name = "myProperties", value = "example.properties")
public class Start{
@Value("${url}")
private String url;
@Value("${userName}")
private String userName;
@Value("${password}")
private String password;
//Run this method when application started
@EventListener(ApplicationReadyEvent.class)
public ResultSet getConnection()
{
//Connect to Database
Connection connection = null;
String QUERY="your sql query";
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
connection = DriverManager.getConnection(url, userName, password );
} catch (SQLException e) {
}
//Run your query
Statement stmt = null;
try {
stmt = connection.createStatement();
} catch (SQLException e1) {
e1.printStackTrace();
}
ResultSet rs = null;
try {
rs = stmt.executeQuery(QUERY);
} catch (SQLException e1) {
e1.printStackTrace();
}
return rs;
}
}