programing

JDBC와 함께 MySQL을 사용한 .sql 스크립트 실행

sourcejob 2022. 12. 13. 20:06
반응형

JDBC와 함께 MySQL을 사용한 .sql 스크립트 실행

JDBC와 함께 MySQL을 사용하기 시작했습니다.

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///x", "x", "x");
stmt = conn.createStatement();
stmt.execute( "CREATE TABLE amigos" +
            "("+
            "id          int AUTO_INCREMENT          not null,"+
            "nombre      char(20)                    not null,"+
            "primary key(id)" +
            ")");

3~4개의 테이블을 만들어야 하는데, 이건 별로인 것 같아요.

MySQL JDBC에서 .sql 스크립트를 실행하는 방법이 있습니까?

네. 이 클래스는 프로젝트 내에서 사용할 수 있습니다(파일 길이 때문에 페이스트빈에 게시).그러나 Apache 라이센스 정보는 반드시 보관하십시오.

JDBC 스크립트러너

종속성이 제거된 iBatis ScriptRunner의 바가지입니다.

이렇게 쓸 수 있어요.

Connection con = ....
ScriptRunner runner = new ScriptRunner(con, [booleanAutoCommit], [booleanStopOnerror]);
runner.runScript(new BufferedReader(new FileReader("test.sql")));

바로 그거야!

나는 이것에 대해 많은 조사를 했고 봄부터 좋은 활용도를 발견했다.사용하는 것 같아요.SimpleJdbcTestUtils.executeSqlScript(...)유지 보수와 테스트가 보다 용이하기 때문에 실제로는 최적의 솔루션입니다.

집::SimpleJdbcTestUtils을 사용하다 하면 됩니다.JdbcTestUtils링크를 갱신했습니다.

프레임워크의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★」ResourceDatabasePopulator도움이 될 수도 있습니다. MySQL을 하는 MySQL JDBC가 DataSource readyinstance ready ("instance ready").또한 MySQL 스크립트 파일이 클래스 경로 검색 가능하다고 가정합니다.이 WAR 디렉토리에 src/main/webapp/resources/mysql-scripts/... ★★★★★★★★★★★★★★★★★」src/test/resources/mysql-scripts/... 이렇게 하면 ResourceDatabasePopulatorSQL을 사용하다

import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;

DataSource dataSource = getYourMySQLDriverBackedDataSource();

ResourceDatabasePopulator rdp = new ResourceDatabasePopulator();    
rdp.addScript(new ClassPathResource(
                        "mysql-scripts/firstScript.sql"));
rdp.addScript(new ClassPathResource(
                        "mysql-scripts/secondScript.sql"));

try {
        Connection connection = dataSource.getConnection();
        rdp.populate(connection); // this starts the script execution, in the order as added
    } catch (SQLException e) {
        e.printStackTrace();
    }

';'로 분할된 단순한 SQL 스크립트의 경우 이 간단한 함수를 사용할 수 있습니다.코멘트를 삭제하고 문을 하나씩 실행합니다.

  static void executeScript(Connection conn, InputStream in)
    throws SQLException
  {
    Scanner s = new Scanner(in);
    s.useDelimiter("/\\*[\\s\\S]*?\\*/|--[^\\r\\n]*|;");

    Statement st = null;

    try
    {
      st = conn.createStatement();

      while (s.hasNext())
      {
        String line = s.next().trim();

        if (!line.isEmpty())
          st.execute(line);
      }
    }
    finally
    {
      if (st != null)
        st.close();
    }
  }

@판텔리스 소파사키스

GitHub에서 약간 변경된 버전: https://gist.github.com/831762/

거기서 수정 내용을 추적하는 것이 더 쉽습니다.

SQL Script Runner(나도 사용 중)에 대해 다음과 같은 코드를 발견했습니다.

for (int i = 0; i < cols; i++) {
  String value = rs.getString(i);
  print(value + "\t");
}

단, getString(int) 메서드의 API 문서에는 인덱스가 1로 시작하는 것으로 기재되어 있으므로 다음과 같이 됩니다.

for (int i = 1; i <= cols; i++) {
  String value = rs.getString(i);
  print(value + "\t");
}

둘째, 이 ScriptRunner 구현에서는 SQL 스크립트의 DELIMITER 문을 지원하지 않습니다.이것은 트리거 또는 프로시저를 컴파일할 필요가 있는 경우에 중요합니다.그래서 ScriptRunner의 수정 버전인 http://pastebin.com/ZrUcDjSx을 만들었습니다.이것이 도움이 되었으면 합니다.

또 다른 흥미로운 옵션은 Jisql을 사용하여 스크립트를 실행하는 것입니다.소스 코드를 사용할 수 있으므로 응용 프로그램에 포함시킬 수 있습니다.


편집: 주의 깊게 살펴보았습니다.다른 것에 삽입하면 소스 코드를 변경해야 합니다.

이것을 사용할 수 있습니까?

public static void executeSQL(File f, Connection c) throws Exception {
    BufferedReader br = new BufferedReader(new FileReader(f));
    String sql = "", line;
    while ((line = br.readLine()) != null) sql += (line+"\n");
    c.prepareCall(sql).execute(sql);
}

이 함수는 SQL 파일과 DB 연결을 가져옵니다.그런 다음 java.io에서 BufferedReader를 사용하여 파일을 한 줄씩 읽습니다.
마지막으로 읽기 스테이트먼트를 실행합니다.

Java 8+ 버전:

public static void executeSQL(Path p, Connection c) throws Exception {
    List<String> lines = Files.readAllLines(p);
    String s = String.join("\n", lines.toArray(new String[0]));
    c.prepareCall(s).execute(s);
}

코드 쓰기 대상:

  1. 다수의 SQL 문이 포함된 파일을 읽습니다.
  2. 각 SQL 문을 실행합니다.

Oracle PL/SQL의 경우 Oracle JDBC 드라이버는 실제로 스토어드 프로시저 및 익명 블록(PL/SQL 고유 표기법)을 포함한 전체 SQL 스크립트의 실행을 참조하십시오.

JDBC 드라이버는 PL/SQL 스토어드 프로시저에 액세스할 수 있습니까?

자세한 내용은 Oracle JDBC 드라이버 FAQ를 참조하십시오.

Oracle JDBC 드라이버는 PL/SQL 저장 프로시저 및 익명 블록 실행을 지원합니다.SQL92 이스케이프 구문과 Oracle PL/SQL 블록 구문을 모두 지원합니다.Oracle JDBC 드라이버에서는 다음 PL/SQL 콜이 동작합니다.

// SQL92 syntax
CallableStatement cs1 = conn.prepareCall
                       ( "{call proc (?,?)}" ) ; // stored proc
CallableStatement cs2 = conn.prepareCall
                       ( "{? = call func (?,?)}" ) ; // stored func
// Oracle PL/SQL block syntax
CallableStatement cs3 = conn.prepareCall
                       ( "begin proc (?,?); end;" ) ; // stored proc
CallableStatement cs4 = conn.prepareCall
                       ( "begin ? := func(?,?); end;" ) ; // stored func

파일을 읽고 내용을 prepareCall()-method에 입력할 수 있어야 합니다.

Maven SQL 플러그인 이 플러그인을 사용하여 SQL 문 또는 파일 목록을 실행합니다.

  1. sql 명령어
  2. srcFiles 3. 파일세트컨피규레이션

이걸 하는 방법은 정말 없어요.

Runtime.exec(String[])을 통해 mysql 명령줄 클라이언트를 실행하여 이 옵션을 결정할 때 이 문서를 읽을 수 있습니다.

또는 ScriptRunner(com.ibatis.common.jdbc)를 사용해 보겠습니다.ScriptRunner)를 소개합니다.하지만 스크립트를 실행하기 위해 라이브러리 전체를 포함하는 것은 조금 바보같습니다.

여기 제게 효과가 있었던 빠르고 더러운 해결책이 있습니다.

public void executeScript(File scriptFile) {
  Connection connection = null;
  try {
    connection = DriverManager.getConnection(url, user, password);
    if(scriptFile.exists()) {
      var buffer = new StringBuilder();
      var scanner = new Scanner(scriptFile);
      while(scanner.hasNextLine()) {
        var line = scanner.nextLine();
        buffer.append(line);
        // If we encounter a semicolon, then that's a complete statement, so run it.
        if(line.endsWith(";")) {
          String command = buffer.toString();
          connection.createStatement().execute(command);
          buffer = new StringBuilder();
        } else { // Otherwise, just append a newline and keep scanning the file.
          buffer.append("\n");
        }
     }
    }
    else System.err.println("File not found.");
  } catch (SQLException e) {
    e.printStackTrace();
} finally {
  if(connection != null) connection.close();
}

언급URL : https://stackoverflow.com/questions/1044194/running-a-sql-script-using-mysql-with-jdbc

반응형