Java에서 DB를 연결하기 위해 우선 드라이브를 로드해야 한다.
>>> Project(로드할 프로젝트) > properties > Java Build Path > Add External JARs > ojdbc8.jar
>>> 파일 열기를 통해 JDBC 드라이버 로딩을 완료했다.
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:orcl";
String db_id = "scott";
String db_pw = "tiger";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
>>> Class.forName("driver")을 사용해서 Driver Class를 로딩하고 객체를 생성한다. 생성된 객체는 DriverManager에 등록된다. DriverManager 클래스는 로드된 JDBC 드라이버를 통해 Connection을 활성화해주는 객체이다. DriverManager.getConnection() 메서드로 Connection 객체를 생성해준다.(Connection은 DB와 연결하는 객체)
>>> DriverManager.getConnection() 메서드는 db_url, db_id, db_pw를 매개변수로 갖는다
Connection conn = null; //DB 연결을 위한 Connection 객체
PreparedStatement psmt = null; //Connection을 통해 sql 명령을 실행 객체
ResultSet rs = null; //sql 쿼리 실행 후 반환된 결과 값을 저장하는 객체
try {
conn = DBConnectionManager.getConnection();
//쿼리문!
String sql = "insert into t_person_info "
+ " values ( (select NVL(MAX(id),0)+1 FROM t_person_info), ?)";
psmt = conn.prepareStatement(sql);
//psmt.setInt(1, 23); //쿼리문 where절 ?를 변수에 값 세팅
psmt.setString(1, name);
int cnt = psmt.executeUpdate();
System.out.println("처리결과:" + cnt);
//DB에 쿼리문 실행
//쿼리 결과를 반환 -> 활용
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBConnectionManager.close(rs, psmt, conn);
}
>>> PreparedStatement() 메서드는 sql문을 전달해 PreparedStatement 객체를 생성한다. PreparedStatement는 SQL문을 실행하고 결과를 반환하는 기능들을 캡슐화한 인터페이스이다. PreparedStatement는 Statement를 상속받고 있다.
>>> SQL문의 ?
는 setString()
메서드로 값을 넣어줄 수 있다. setString(n, 변수(or 값))
의 매개변수로 n은 SQL문의 물음표(?)의 위치를, 변수(or 값)에는 넣어줄 값을 받을 수 있다.
SQL문 실행 시 출력되는 데이터베이스 결과 값을 나타내는 테이블이다.
Connection conn = null; //DB 연결을 위한 Connection 객체
PreparedStatement psmt = null; //Connection을 통해 sql 명령을 실행 객체
ResultSet rs = null; //sql 쿼리 실행 후 반환된 결과 값을 저장하는 객체
try {
conn = DBConnectionManager.getConnection();
//쿼리문!
String sql = "SELECT empno, ename empname, job, mgr, hiredate, sal, comm, deptno "
+ " FROM emp WHERE empno = ? OR ename = ?";
psmt = conn.prepareStatement(sql);
psmt.setInt(1, 7782); //쿼리문 where절 ?를 변수에 값 세팅
psmt.setString(2, "FORD");
rs = psmt.executeQuery(); //쿼리를 실행!!하고 저장!
//rs.next() >>> return값이 boolean으로 넘어옴
//ResultSet next() 메소드는 결과 데이터 다음행 다음행 다음행 이동.
//return true/false -> 값이 있다 없다!
while(rs.next()) {
System.out.println(rs.getInt("empno"));
System.out.println(rs.getString("empname")); //별칭을 지은경우 별칭으로 불러야함
System.out.println(rs.getString("job"));
System.out.println(rs.getInt("mgr"));
System.out.println(rs.getDate("hiredate"));
System.out.println(rs.getInt("sal"));
System.out.println(rs.getInt("comm"));
System.out.println(rs.getInt("deptno"));
}
//DB에 쿼리문 실행
//쿼리 결과를 반환 -> 활용
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBConnectionManager.close(rs, psmt, conn);
}
>>> executeQuery() 메서드를 사용해 SQL문을 실행 후 결과를 저장한다. next()메서드를 통해 테이블의 다음 행을 가리켜주고, 반환된 결과를 값이 있으면 true, 없으면 false로 리턴해준다. 이후 getInt(), getStrung(), getDate()등의 메서드를 통해 값을 가져올 수 있다.
try {
if(rs != null) {
rs.close();
}
if(psmt != null) {
psmt.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //연결을 종료
>>> 통로를 연결하고 작업을 완료한 후에는 연결했던 통로를 다시 닫아주어야 한다. 닫아야할 값이 null이면 에러가 발생하기때문에 if문으로 null이 아닌 경우에만 실행할 수 있게 조건을 걸어준다.
DBConnectionManager라는 클래스를 생성하여 다음과 같이 Connection과 close 메소드를 생성해두면 간편하게 처리하고 사용할 수 있다.
import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBConnectionManager {
//DB 연결을 도와주는 기능을 가진 클래스
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:orcl";
String db_id = "scott";
String db_pw = "tiger";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close(ResultSet rs, PreparedStatement psmt, Connection conn) {
try {
if(rs != null) {
rs.close();
}
if(psmt != null) {
psmt.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //연결을 종료
}
}