java

java main method 로 db 연결

초이짬 2017. 11. 23. 16:10
728x90

cron으로 배치를 만들때 데몬으로 만들어서 돌릴때 이용가능하다. (비추) 일반적 구조가 아닐때 사용하고
클래스패스 지정이 귀찮아진다 이걸 바탕으로 jar로 뽑은 다음에 실행하는게 더 좋을 듯 하다. 테스트는 추후..
그리고...저걸 class 실행 시킬때는 해당 패키지 상위에서
ex)db패키지 위에
java db.DBCon
이렇게 하는데 그러면 에러가 난다 중간에 오라클 드라이버 로드에 대한 classpath를 안줘서다
결론은
java -classpath 클래스풀주소\ojdbc5.jar; db.DBCon 이다
그래서 걍 jar로 익스포트해서 실행시키는게 제일 속 편할듯...


**이클립스에서 구동시에는 run application 으로 실행 하면 당연히 ojdbc를 로딩 못하니 에러가 난다

이럴땐 메뉴의 Run > Run Configuration 을 들어가서 java application 항목 밑에 있는 클래스 네임에 classpath 탭에 가서

User Entries에 Add Jars 로 ojdbc 를 추가 해주면 된다.


package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBCon {
static String url;

public static void main(String[] args) {
url = "jdbc:oracle:thin:@url:포트:db명"; // url 형식
Connection conn = null;
Statement stmt = null; 
PreparedStatement pstmt = null;
ResultSet rs = null;
String col1 = null;
String col2 = null;
String col3 = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); // JDBC 드라이버 로드
conn = DriverManager.getConnection(url, "사용자", "비번"); // 데이터베이스 연결(id/pw)
if (conn == null) {
System.out.println("연결실패");
} else {
System.out.println("연결성공");

String sql = "SELECT CTEST1,CTEST2,REG_DT FROM TEST";
//stmt = conn.createStatement();     //이건 사용안함(정적쿼리시 사용)
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
// 출력
while (rs.next()) {
col1 = rs.getString(1);
col2 = rs.getString(2);
col3 = rs.getString(3);
System.out.print(col1 + ", " + col2 + ": " + col3);
}
}
} catch (ClassNotFoundException ce) {
ce.printStackTrace();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {

try { // 연결 해제(한정돼 있으므로)
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException se2) {
se2.printStackTrace();
}
}
}
}



상기 소스에서 statement 와 preparestatement를 같이 썻는데

쿼리조건절에 ? 의 파라미터를 안받을 경우는 statement만 써도 된다

statement 와 prepare 의 차이는 캐싱을 사용하는냐 안하는냐의 차이다.

파라미터 조건이 ? 으로 셋을 이용해서 넣는다는 의미는 바인딩 시키기에

디비에서 쿼리를(오라클경우) 공유풀영역에 넣고 사용할때 재사용이 가능해서

속도 향상도 온다. 하지만 소스가 번잡해지니 간단하게 돌릴경우는 statement 만을 써도 된다


예전에 작성한 건데 생각없이 써놓고 확인 하다 발견해서 사족을 단다.

728x90