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에 게시 됨). 그러나 아파치라는 정보를 유지하는 것을 잊지 않습니다.
구문이 제거 된 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);
}
다음에 코드 작성 :
- 여러 SQL 문이 포함 된 파일을 읽습니다.
- 각 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 문을 실행합니다.
- sqlCommand
- 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
'ProgramingTip' 카테고리의 다른 글
VSCode의 .js 파일에서 jsx 코드를 주석 처리하는 방법은 무엇입니까? (0) | 2020.11.14 |
---|---|
해결 실패 : com.google.firebase : firebase-core : 16.0.1 (0) | 2020.11.14 |
Erlang에서 trace 및 dbg 사용 (0) | 2020.11.14 |
Android에서 난독 화 된 (ProGuard 사용) 애플리케이션으로 행동하는 방법은 무엇입니까? (0) | 2020.11.14 |
IF EXISTS 하위 쿼리와 함께 SQL Select 문을 사용하는 방법은 무엇입니까? (0) | 2020.11.14 |