복붙노트

[SQL] 스프링 JDBC를 사용하는 경우 (+20 라인 SQL) 긴 청소 방법을 구체화하기 위해? [닫은]

SQL

스프링 JDBC를 사용하는 경우 (+20 라인 SQL) 긴 청소 방법을 구체화하기 위해? [닫은]

나는 속성 \ SQL \ XML 파일에 내 응용 프로그램에서 일부 대형 쿼리를 구체화하고 싶다. 사람이 깨끗한 방식으로이를 달성 방법에 대한 몇 가지 권장 사항이있는 경우 그러나 궁금했다. 대부분의 결과는 ORM 프레임 워크를 사용하는 것이 좋습니다하지만이 때문에 일부 데이터 제한에 적용되지 않습니다.

내가 한 번 봐했다 : 자바 - 외부 파일에 보관 SQL 문을하지만,이 propertyName 형식을 .1하고, 각각의 이상 20 개 라인이 깨끗하게 보이지 않는입니다 몇 쿼리 0.2 등.

해결법

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

    1.당신은 XML 파일에 쿼리를 넣을 수 있습니다

    당신은 XML 파일에 쿼리를 넣을 수 있습니다

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    
    <properties>
    <entry key="getPersonById">
        <![CDATA[
            Select Name From Person 
            Where Id =?     
        ]]>
    
    </entry>    
    <entry key="getPersonBySSN">
        <![CDATA[
    
        ]]>
    </entry>
    
    </properties>
    

    Spring 애플리케이션 컨텍스트에서이 XML 파일을로드

    <bean id="queryProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations" value="classpath:/queries.xml" />
    </bean>
    

    당신의 DAO 클래스에서이 빈을 주입

    <bean id="myDAO" class="com.xyz.dao.MyDAOImpl">
      <property name="queryProps" ref="queryProps" />
    </bean>
    

    당신의 DAO 클래스에 queryProps을 정의하고 이에 대한 setter 메소드를 가지고하는 것을 잊지 마세요

     private Properties queryProps;
    

    지금 당신은이처럼 DAO에서 쿼리를 액세스 할 수 있습니다 -

     String query = queryProps.getProperty("getPersonById");
    

    도움이 되었기를 바랍니다.

  2. ==============================

    2.나는 얼마 전에 같은 문제에 직면하고, YAML 함께했다. 당신이 당신의 쿼리 파일에 다음처럼 작성할 수 있습니다 그것은 여러 줄 문자열 속성 값을 지원합니다 :

    나는 얼마 전에 같은 문제에 직면하고, YAML 함께했다. 당신이 당신의 쿼리 파일에 다음처럼 작성할 수 있습니다 그것은 여러 줄 문자열 속성 값을 지원합니다 :

    selectSomething: >
      SELECT column1, column2 FROM SOMETHING
    
    insertSomething: >
      INSERT INTO SOMETHING(column1, column2)
      VALUES(1, '1')
    

    여기에, selectSomething 및 insertSomething 쿼리 이름입니다. 그래서 정말 편리하고 매우 적은 특수 문자가 포함되어 있습니다. 쿼리는 빈 라인으로 구분되며, 각 쿼리 텍스트는 들여 쓰기를해야합니다. 쿼리가 절대적으로 다음 완벽하게 유효 그래서, 자신의 들여 쓰기를 포함 할 수 있습니다 :

    anotherSelect: <
      SELECT column1 FROM SOMETHING
      WHERE column2 IN (
        SELECT * FROM SOMETHING_ELSE
      )
    

    그런 다음 아래의 코드를 사용하여, SnakeYAML 라이브러리의 도움으로 해시 맵에 파일의 내용을 읽을 수 있습니다 :

    import org.apache.commons.io.FilenameUtils;
    import org.apache.commons.io.FileUtils;
    import java.io.FileReader;
    
    import org.yaml.snakeyaml.Yaml;
    import java.io.File;
    import java.io.FileNotFoundException;
    
    public class SQLReader {
      private Map<String, Map> sqlQueries = new HashMap<String, Map>();
    
      private SQLReader() {
        try {
          final File sqlYmlDir = new File("dir_with_yml_files");
          Collection<File> ymlFiles = FileUtils.listFiles(sqlYmlDir, new String[]{"yml"}, false);
          for (File f : ymlFiles) {
            final String fileName = FilenameUtils.getBaseName(f.getName());
            Map ymlQueries = (Map)new Yaml().load(new FileReader(f));
            sqlQueries.put(fileName, ymlQueries);
          }
        }
        catch (FileNotFoundException ex) {
          System.out.println("File not found!!!");
        }
      }
    }
    

    지도의지도 위의 예에서 쿼리 이름 / 문자열을 포함하는지도에 각 YAML 파일을 매핑 생성됩니다.

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

    3.이 판 카지 대답 무슨에 추가됩니다. 이것은 하나의 속성 XML 및 사용은 autowiring에에서 CDATA이 없습니다. 내가 코멘트 섹션에서이 작업을 수행해야한다면 내가 코드를 포맷 할 수 없습니다로, 대답은이를 추가했다.

    이 판 카지 대답 무슨에 추가됩니다. 이것은 하나의 속성 XML 및 사용은 autowiring에에서 CDATA이 없습니다. 내가 코멘트 섹션에서이 작업을 수행해야한다면 내가 코드를 포맷 할 수 없습니다로, 대답은이를 추가했다.

    당신이 Spring 애플리케이션 컨텍스트 XML 파일에서 네임 스페이스 다음했는지 확인.

    xmlns:util="http://www.springframework.org/schema/util
    

    스프링 애플리케이션 컨텍스트 XML에 다음 빈을 추가

    <util:properties id="sqls" location="classpath:oracle/sqls.xml" />
    

    파일 sqls.xml의 내용입니다

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
        <comment>Employee Queries</comment>
        <entry key="employee.insert">
            INSERT
            INTO EMPLOYEE
              (
                ID,
                NAME,
                AGE,
                DEPARTMENT
              )
            VALUES
              (
                EMPLOYEE_SEQ.NEXTVAL,
                ?,
                ?,
                ?
              )
        </entry>
    </properties>
    

    속성 아래와 같이를 autowire

    @Autowired
    @Qualifier("sqls")
    private Properties sqls;
    

    코드 속성에서 SQL 쿼리를 얻을 수 있습니다

    String sql = sqls.getProperty("employee.insert");
    
  4. ==============================

    4.당신은 라인의 끝에 \를 넣어 프로퍼티 파일에서 여러 쿼리를 할 수 있습니다. 예를 들면

    당신은 라인의 끝에 \를 넣어 프로퍼티 파일에서 여러 쿼리를 할 수 있습니다. 예를 들면

    queries.myquery = select \
    foo, bar \
    from mytable \
    where baz > 10
    
  5. ==============================

    5.JdbcTestUtils에서보세요 및 방법 "executeSqlScript"및 "스크립트를 읽기".

    JdbcTestUtils에서보세요 및 방법 "executeSqlScript"및 "스크립트를 읽기".

  6. from https://stackoverflow.com/questions/15433032/clean-way-to-externalize-long-20-lines-sql-when-using-spring-jdbc by cc-by-sa and MIT license