복붙노트

[SPRING] 응용 프로그램 시작 /로드 중에 SQL을 실행하여 데이터베이스를 채우는 방법

SPRING

응용 프로그램 시작 /로드 중에 SQL을 실행하여 데이터베이스를 채우는 방법

응용 프로그램을로드하는 동안 mysql 데이터베이스에 일부 데이터를로드하려고합니다. 나는 응용 프로그램을위한 데이터베이스를 관리하기 위해 Hibernate를 사용하고있다. 부트 스트랩을 사용하여 그루비에서 할 수 있지만 자바로 구현하고 싶습니다. Spring MVC 기반의 웹 애플리케이션이라는 것을 말씀 드리고 싶습니다.

인터넷에서 검색하는 동안 import_file이라는 hibernate 속성을 사용하여 찾을 수 있지만 대체 경로를 찾고 있습니다.

해결법

  1. ==============================

    1.Spring의 DataSourceInitializer를 활용할 수도있다. 다음은 Java Config의 예제입니다.

    Spring의 DataSourceInitializer를 활용할 수도있다. 다음은 Java Config의 예제입니다.

    @Bean
    public DataSourceInitializer dataSourceInitializer() {
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));
    
            DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
            dataSourceInitializer.setDataSource(dataSource());
            dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
            return dataSourceInitializer;
        }
    
  2. ==============================

    2.Spring은 DatabasePopulator를 사용하여 이미 콘텐츠로 데이터베이스를 초기화하는 방법을 제공합니다. Spring Batch 샘플 애플리케이션에 대한 간단한 예가 나와 있습니다. 이 코드에서 볼 클래스는 ResourceDatabasePopulator입니다. 또 다른 예제는 Spring Social 프로젝트 샘플이다.

    Spring은 DatabasePopulator를 사용하여 이미 콘텐츠로 데이터베이스를 초기화하는 방법을 제공합니다. Spring Batch 샘플 애플리케이션에 대한 간단한 예가 나와 있습니다. 이 코드에서 볼 클래스는 ResourceDatabasePopulator입니다. 또 다른 예제는 Spring Social 프로젝트 샘플이다.

  3. ==============================

    3.Spring 컨텍스트 설정에서 ApplicationListener의 인스턴스를 등록하기 위해 갈 것입니다. ContextRefreshedEvent는 애플리케이션 컨텍스트가 초기화되거나 새로 고쳐질 때 신호를받습니다. 이 순간 이후에 데이터베이스를 설정할 수 있습니다.

    Spring 컨텍스트 설정에서 ApplicationListener의 인스턴스를 등록하기 위해 갈 것입니다. ContextRefreshedEvent는 애플리케이션 컨텍스트가 초기화되거나 새로 고쳐질 때 신호를받습니다. 이 순간 이후에 데이터베이스를 설정할 수 있습니다.

    아래에는 ApplicationListener 구현 (데이터베이스 작업 수행을 담당하는 DAO에 따라 다름)과이를 구현하는 데 필요한 Spring 구성 (Java 및 XML 모두)이 나와 있습니다. 앱과 관련된 구성을 선택해야합니다.

    Java 기반 구성

    @Configuration
    public class JavaConfig {
    
        @Bean
        public ApplicationListener<ContextRefreshedEvent> contextInitFinishListener() {
            return new ContextInitFinishListener(personRepository());
        }
    
        @Bean
        public PersonRepository personRepository() {
            return new PersonRepository();
        }
    }
    

    XML

        <bean class="com.package.ContextInitFinishListener">
            <constructor-arg>
                <bean class="com.package.PersonRepository"/>
            </constructor-arg>
        </bean>
    

    다음은 ContextInitFinishListener 클래스의 코드입니다.

    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    
    public class ContextInitFinishListener implements ApplicationListener<ContextRefreshedEvent> {
    
        private PersonRepository personRepository;
    
        public ContextInitFinishListener(PersonRepository personRepository) {
            this.personRepository = personRepository;
        }
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            //populate database with required values, using PersonRepository
        }
    }
    

    참고 : PersonRepository 예제의 목적을위한 그냥 일반적인 DAO, 그것은 당신의 응용 프로그램에서 사용하는 DAO를 나타내는 것을 의미합니다

  4. ==============================

    4.내 봄 부팅 콘솔 응용 프로그램 테스트에서 아래와 같이 사용했습니다.

    내 봄 부팅 콘솔 응용 프로그램 테스트에서 아래와 같이 사용했습니다.

    ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();
     rdp.addScript(new ClassPathResource("sql/create-tables.sql"));
     rdp.execute(dataSource);
    

    응용 프로그램의 유형 또는 데이터 계층화 된 프레임 워크에 따라 데이터 소스를 가져 오는 다양한 방법이 있습니다.

    당신이 사용할 수있는 봄 부팅 atoconfigured h2 데이터 원본을 사용하여 u r 경우.

    @Autowired
    Datasource datasource;
    

    외부 구성 클래스를 통해 데이터 소스를 얻는 방법은 다음과 같습니다.

    @Value("${spring.datasource.driver-class-name}")
    private String driverClass;
    
    @Value("${spring.datasource.url}")
    private String dbUrl;
    
    @Value("${spring.datasource.username}")
    private String dbUserName;
    
    @Value("${spring.datasource.password}")
    private String dbPassword;
    
    
    @Bean
    public DataSource dataSource(){
        SingleConnectionDataSource dataSource = new 
        SingleConnectionDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(dbUserName);
        dataSource.setPassword(dbPassword);
        dataSource.setSuppressClose(true);
        dataSource.setAutoCommit(true);
        return dataSource;
    }
    

    이 나를 위해 일한 알 쿼리를 계속 만들려면 - tables.sql에서 실행해야합니다.

  5. from https://stackoverflow.com/questions/23029722/how-to-execute-sql-insert-queries-to-populate-database-during-application-start by cc-by-sa and MIT license