SQL 스크립트를 실행하고 애플리케이션 부팅 시 데이터를 얻는 방법
Spring Boot 어플리케이션을 개발 중입니다.현재 일부 구성은 하드 코딩되어 있습니다(Hystrix 속성 등).
따라서 어플리케이션 부팅 시 또는 그 직후에 이러한 설정을 취득하고 싶습니다.
Spring Boot을 사용하여 할 수 있습니까?부팅 시 SQL 스크립트를 실행하여 데이터를 가져오는 것을 의미합니다.
응용 프로그램에 속성/구성 검색 및 저장 방법
MyBatis와 Oracle DB를 사용하고 있습니다.
" " " " " " " " 를 로드합니다.data.sql
"/"/"data-${platform}.sql
.
단, 스크립트는 시작할 때마다 로드되기 때문에 (적어도 실가동 시에는) 처음부터 다시 삽입하지 않고 데이터베이스에 이미 존재하는 값만 갖는 것이 더 타당하다고 생각합니다.저는 개인적으로 메모리 데이터베이스를 사용할 때 테스트/개발 목적으로만 데이터베이스 초기화를 사용했습니다.단, 이는 Spring-Boot에서 제공하는 기능입니다.
소스: spring-boot-how-to-foot-initialization:
Spring JDBC에는 Data Source 이니셜라이저 기능이 있습니다.Spring Boot은 기본적으로 이 기능을 활성화하고 표준 위치 schema.sql 및 data.sql(클래스 경로 루트)에서 SQL을 로드합니다.또한 Spring Boot은 schema-${platform.sql 및 data-${platform.sql 파일(있는 경우)을 로드합니다.
src/main/data-backets/data-backets.sql:
insert into...
insert into...
- 은 다음과 같이 할 수 .
spring.datasource.platform=oracle
. - 할 수 .「 SQL 」 。
spring.datasource.data=myscript.sql
. - ★★★★★★와 함께
data.sql
schema.sql
)data.sql
를 참조해 주세요. - 데이터에 "업데이트 또는 삽입" 논리를 사용할 수도 있습니다.sql: oracle sql: update(존재하는 경우)
가 있었던 은 에에과 what what what를 사용한 것이다.DataSourceInitializer
:
@Bean
public DataSourceInitializer dataSourceInitializer(@Qualifier("dataSource") final DataSource dataSource) {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
초기화 중에 데이터베이스를 설정하고 파기 중에 데이터베이스를 정리하는 데 사용됩니다.
시작 후 sql 스크립트에서 데이터를 로드하려면 ResourceDatabasePopulator 클래스 개체를 다음과 같이 사용합니다.
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;
@Component
public class InitializeData {
@Autowired
private DataSource dataSource;
@EventListener(ApplicationReadyEvent.class)
public void loadData() {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(false, false, "UTF-8", new ClassPathResource("data.sql"));
resourceDatabasePopulator.execute(dataSource);
}
}
sql 파일에서 데이터를 쉽게 로드할 수 있고 sql 파일 내에서 잘못된 sql 문이 무시되기 때문에 걱정하지 않습니다.
비즈니스 로직을 기반으로 데이터를 삽입하려면 이벤트 리스너를 사용하는 것이 좋습니다.따라서 기본적으로 응용 프로그램 부팅 시 @EventListener 메서드로 주석이 붙어 있는 "OnApplicationEvent"가 자동으로 호출됩니다.
또한 데이터를 가져와야 하는 경우와 마찬가지로 저장소 개체를 사용하여 데이터를 가져오기만 하면 됩니다.
예를 들어 다음과 같습니다.
@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);
}
}
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을 사용해야 합니다.이 경우 Class에는 메서드가 있습니다.
네, 이거 쓰셔도 돼요.
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;
}
}
Global Bean 합니다.
파일: @Scope(scopeName = Web Application Context)._SCOPE_APPLICATION)
이 Bean은 Bean 초기화 중에 데이터베이스 테이블에서 데이터를 가져오는(구성 속성 유지 관리) 업무를 담당합니다.@PostConstructure @ @ @ @ @ @ @ @ @ 。
이 메서드는 데이터베이스 테이블에서 구성 파라미터를 가져오는 로직을 가집니다.를 들어 네이티브됩니다.
는, 같은 애플리케이션내의 다른 콘텍스트의 모든 콩에 사용할 수 있습니다.
「Configuration Properties(설정 속성)」를 참조해 주세요.
★★★
Commons Configuration 도 : Apache Commons Database Configuration <--
메모: 캐시를 지원하지 않습니다.그러나 데이터베이스 구성 속성은 응용 프로그램 시작 시 한 번만 로드해야 하므로 캐싱이 필요하지 않습니다.
★★★
Trandational Old way : Property Place Holder Configr : 프로퍼티 플레이스 홀더 설정.
이 구현에는 구성 속성을 유지하는 데이터베이스 테이블에서 데이터를 가져오는 논리가 있어야 합니다.
스프링 부트 시 JDBC를 사용하여 데이터베이스 초기화(schema.sql 및 data.sql 실행)
주의: 다음 절차를 따르십시오.
샘플 프로젝트 pom.xml을 만듭니다(사용자의 버전에 따라 편집).
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.1</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>Init_Sql_Script</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Init_Sql_Script</name> <description>Initialize a Database Using Basic SQL Scripts</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
응용 프로그램 속성 및 DB에 직원과 같은 새 DB 이름 만들기
# connection code for spring boot to your DB spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/employee spring.datasource.username=Hari spring.datasource.password=1998 spring.jpa.hibernate.ddl-auto=none #--- control the sql db initialization (from schema.sql and data.sql)--- spring. SQL.init.mode=always #---if any error it skips the script and executes the next script---- #spring.sql.init.continue-on-error=true
리소스 폴더에 두 개의 SQL 파일(schema.sql-create table 쿼리와 data.sql-insert 쿼리)을 생성합니다.
db를 체크한 후 어플리케이션을 실행합니다.해 보세요.
나에게도 잘 먹혀들었으면 좋겠다.
언급URL : https://stackoverflow.com/questions/39280340/how-to-run-sql-scripts-and-get-data-on-application-startup
'programing' 카테고리의 다른 글
Internet Explorer 8에서 정의되지 않은 JSON 개체 (0) | 2023.04.03 |
---|---|
Reactive Web Server Factory 빈이 없어 Reactive Web Application Context를 시작할 수 없습니다. (0) | 2023.04.03 |
Jackson Java 라이브러리를 사용하여 Java 맵의 래핑을 해제하고 시리얼화할 수 없는 이유는 무엇입니까? (0) | 2023.04.03 |
데이터를 재초기화하는 방법MVC에서 Ajax를 사용하여 서버에서 새로 가져온 데이터가 있는 테이블 (0) | 2023.03.29 |
React Native 스타일링의 구성요소 간 간격 (0) | 2023.03.29 |