ProgramingTip

JDBC와 MySQL을 사용하여 .sql 펼쳐보기 실행

bestdevel 2020. 11. 14. 10:54
반응형

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 펼쳐지는 방법이 있습니까?


확인. 프로젝트 에서이 클래스를 여기에서 사용할 수 있습니다 (파일 길이 때문에 pastebin에 게시 됨). 그러나 아파치라는 정보를 유지하는 것을 잊지 않습니다.

JDBC ScriptRunner

구문이 제거 된 iBatis ScriptRunner의 일부입니다.

이렇게 사용할 수 있습니다.

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

그게 다야!


나는 이것에 대해 많은 연구를 했고 봄부터 좋은 유틸리티를 발견했다 . SimpleJdbcTestUtils.executeSqlScript(...)더 유지 관리되고 테스트되기 때문에 실제로 사용하는 최상의 솔루션 이라고 생각 합니다.

편집 : SimpleJdbcTestUtils더 이상 사용하지 않는 문서. 당신은 그리합니다 JdbcTestUtils. 링크를 업데이트했습니다.


Spring Framework ResourceDatabasePopulator가 도움 될 수 있습니다. MySQL과 JDBC를 사용하고 말했듯이 MySQL 지원 DataSource인스턴스가 준비되어 있어 가정 해 보겠습니다 . 또한 MySQL 펼쳐진 파일이 클래스 경로를 테스트 수 가정합니다. WAR 레이아웃을 사용 중이고 펼쳐 파일이 디렉토리 src/main/webapp/resources/mysql-scripts/...또는 src/test/resources/mysql-scripts/.... 다음 다음 그런 ResourceDatabasePopulator과 같은 SQL를 실행 펼쳐 하는 사용할 수 있습니다 .

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();
    }
  }

@Pantelis Sopasakis

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

수정 사항을 추적하기가 더 신뢰할 수 있습니다.


SQL 펼쳐보기 관련하여 (저도 사용하고 있음) 다음 코드를 발견했습니다.

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의이 구현은 TRIGGERS 또는 PROCEDURES를 컴파일해야하는 경우 중요한 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를 사용하여 파일을 한 줄씩 읽습니다.
그리고 마지막으로 read 문을 실행합니다.

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 저장 프로 시저에 액세스 할 수 있습니까?

오라클 JDBC 드라이버 자주 묻는 질문은 더 많은 정보를 가지고 :

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

// 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 () 메서드에 내용을 공급할 수 있어야합니다.


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

  1. sqlCommand
  2. srcFiles 3.fileset 구성

이 작업을 수행 할 방법이 없습니다.

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

또는 ibatis 의 ScriptRunner (com.ibatis.common.jdbc.ScriptRunner)를 사용해보십시오 . 그러나 스크립트를 실행하기 위해 전체 라이브러리를 포함하는 것은 약간 어리석은 일입니다.

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

반응형