JDBC
Q. JDBC란 무엇인가?
자바에서 데이터베이스를 표준화 된 방법으로 접속할 수 있도록 만든 API 규격.
쉽게 말하자면, 자바에서 데이터베이스에 있는 데이터들을 불러 사용할 수 있도록 하는 방법
이다.
Q. JDBC를 사용하기 위해서는 따로 설치가 필요한가?
JDBC를 사용하기 위해서는 이클립스 파일에 라이브러리를 추가해야 한다.
라이브러리가 없다면 Mysql jdbc 드라이버에서 Connector J를 설치하면 된다.
혹여나 본인의 드라이버를 확인해보라.
C:\app\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar
이 경로를 통하여 확인해보아라.
JDBC 라이브러리를 확보했다면, 이클립스 프로젝트에서 Build Path*를 클릭하여 External Jar Add로 ojdbc6.jar 파일을 추가해주면 된다.
Q. 이제 JDBC로 프로그램을 작성하는 방법을 알려달라. 이제는 알 때가 되었다.
JDBC는 첫 번째 질문에서 말했듯, 자바에서 데이터베이스에 있는 데이터들을 불러와 이용하
기 위하여 사용한다 했다. 사실 이 문장은 본인에게 리마인드 시키기 위하여 적어보았다.
프로그래밍 단계는 다음과 같다.
Q. 인터뷰이가 불법으로 퍼온 그림을 보니 JDBC 프로그래밍 단계에 대해 대강 그림이 그려
진다. 이제 코드로 보여달라.
알았다.
//JDBC 드라이버 로드
import java.sql.DriverManager;
Class.forName("com.mysql.jdbc.Driver");
이 단계는 ‘나 라이브러리에서 이 부분을 사용할꺼야’라고 명시해주는 부분이다. 이 라이브러
리는 자바에 DB를 연결하고 이를 사용하겠다는 것을 알린다. 이 부분은 JDBC 사용의 시작을
알리는 총포탄과 같다.
//데이터베이스 연결
import java.sql.Connection;
Connection conn = null;
String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:xe*";
String id ="student";
String pw ="1234";
conn = DriverManager.getConnection(jdbcUrl, id, pw)*;
이 단계는 말 그대로 데이터베이스에 연결하는 부분이다. DriverManager.getConnection에 데
이터베이스의 url을 적어주고, 데이터베이스에서 사용하던 id와 패스워드를 적어 연결해준다.
*DriverManager의 getConnection() 메서드는 static이다. tmi인가.
*url 구성은 ‘JDBC:밴더이름:thin:@IP주소:포트번호:스키마이름’ 으로 구성되어 있다.
//Statement 생성, SQL문 전송, 결과 받기
JDBC에서 이 부분이 핵심이다. 이 세 단계는 한꺼번에 보는 것이 이해가 빠르다. 귀찮아서 그
런 것이 아니라 정말이다.
이 단계는 크게 두 개로 나눌 수 있다.
- INSERT, UPDATE, DELETE 하는 경우
- SELECT 하는 경우
좀 더 구체적으로 살펴 보겠다.
(1)DB에 값을 INSERT, UPDATE, DELETE하는 방법
여기서 중요한 키워드는 이것이다.
Statement, PreparedStatement, executeUpdate().
(1)번 방법은 또 두 가지 방법으로 나눌 수 있다.
(1)-1 Statement를 사용하는 경우
(1)-2 PreparedStatement를 사용하는 경우
(1)-1 Statement를 사용하는 경우
Statement stmt = conn.createStatement()*;
stmt.executeUpdate(“insert into test values ('"+username"','"+email')");
*여기서 중요한 부분이 있다면, Statement를 Connection에서 가져오는
것이다.
(1)-2 PreparedStatement를 사용하는 경우
(1)-1 Statement 경우보다 성능이 좋다. 많이 사용된다. 많이 사용해라. (밑에서 정정한다)
뭐, 굳이 PreparedStatement를 사용하는 편리한 방법을 말하자면,
SQL을 먼저 완성시켜라. 변수는 ?처리.
그 이후, setString()/setInt()를 이용하여 ?자리에 값을 집어 넣어라.
ex)
PreparedStatement pstmt = conn.prepareStatement(“insert into test values(?,?)”)*;
pstmt.setString(1,request.getParameter("username"));
pstmt..setString(2, request.getParameter("email"));
pstmt.executeUpdate()*; //실행
* PreparedStatement도 Connection에서 가져온다.
* executeUpdate()은 실행버튼과 같다. 그런데 주의해야 할 점은 executeUpdate()는 int 타입
을 반환한다. 반환값은 결과를 처리한 횟수이다. 못 믿겠다면, 다음과 같은 코드를 실행한다.
int resultCnt = pstmt.executeUpdate(); //실행
System.out.println(resultCnt + "개의 행이 입력되었습니다.");
(2) DB에서 값을 가져와 Select 하는 방법(조회)
여기서 중요한 키워드들은 이것이다.
Statement, ResultSet, executeQuery(), rs.next(), while(rs.next()), rs.close()
다행히도 (2)번의 방법은 (1)번과 다르게 하나 뿐이다. 이제는 과정을 알아보자.
/먼저, DB에서 테이블 형태로 데이터들을 불러 온다.
중요한 건, 이 때 받는 데이터 형태는 ‘테이블 형태’라는 거다.
Statement stmt = conn.createStatement()*;
String sql1= “select * from dept order by dpetno”;
ResultSet rs =stmt.executeQuery(sql1);*
boolean exists = rs.next();
*그렇다. Statement는 Connection에서 받아온다.
*(1)번은 executeUpdate(sql), (2)번은 executeQuery(sql)이다.똑똑히 기억하시길.
(p)
데이터를 받았으면 우리가 읽을 수 있어야 하지 않겠나. getString()/getInt()
메서드를 사용한다.
String code = rs.getString(“code”);*
int price = rs.getInt(“price”);
*getString(“컬럼이름”)이다. 테이블의 특정 컬럼을 선택하여 읽어 오는 것이다.
컬럼이름을 사용하기 귀찮다면, 테이블의 컬럼 위치를 넣어도 된다. 예를 들어
테이블에서 첫 번째 컬럼 이름이 name이라면, getString(1);
(p)
그런데 가만, 가만, 나는 컬럼1의 데이터 쫙, 컬럼2의 데이터 쫙 이렇게 읽어
오기 싫다. 나는 DB의 테이블 상의 데이터들 처럼 조화롭게 데이터들을 뽑고
싶다.
⇒ 그럼 while문을 쓴다.
while(rs.next()) {
name = rs.getString(1); // or rs.getString(“name”);
age = rs.getInt(2); // or rs.getInt(“email”);
}
row 한 칸 돌아서 데이터들을 가져온 후, 다음 칸으로 내려가 데이터들을
가져오기를 반복한다.
//연결 해체(.close())
이제 나는 ResultSet으로 하고싶은 일이 없다. 할일을 다했다.
⇒ 닫아준다.
rs.close();
필수다.
[정정하는 부분]
Insert/ Update/ Delete를 하는 방법에는 두 가지가 있다.
(1) stmt.executeUpdate("insert into dept values('Ryu', '20', 'Marketing')");
(2) PreparedStatement pstmt = conn.prepareStatement(“insert into test values(?,?)”);
pstmt.setString(1,request.getParameter("username"));
pstmt..setString(2, request.getParameter("email"));
pstmt.executeUpdate()*;
pstmt.executeUpdate()*;
위 예제처럼 '? '처리 1개 이상인 경우에는 PreparedStatement를 쓰는 것이
좋다. 왜냐하면 '?'처리 경우에는 Statement보다는 PreparedStatement가
성능이 좋기 때문이다.
반대로 ?가 없을 경우에는 Statement로 처리하는 것이 더욱 간결하고 편하다.
Select 하는 방법에도 두 가지가 있다.
(1) ResultSet rs = stmt.executeQuery("select * from dept");
rs.next();
(2) sql = "select * from emp where ename = '" + ? + "' order by name";
ResultSet rs= pstmt.executeQuery(sql);
while(rs.next()){
String name = rs.getString(1);
}
설명은 위와 같다.
Q. 코드와 글이 어지럽게 흩어져 있어서, 이해가 잘 안된다. 예시 코드를 내놓아라.
싸갈쓰가 바갈쓰다. 다음은 예시 코드이다.
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 JDBCOracleExample {
public static void main(String[] args) {
Connection conn = null;
String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:xe";
String id ="student";
String pw ="1234";
try {
//1. 데이터베이스의 드라이버를 로드.
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. 데이터베이스 연결
conn = DriverManager.getConnection(jdbcUrl, id, pw);
System.out.println("Oracle 데이터베이스에 연결되었습니다.");
//<데이터 베이스 값 입력하기_PreparedStatement, setString(), executeUpdate()>
String sql ="insert into dept values(?, ?, ?)"; //deptno, dname, loc
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 50);
pstmt.setString(2, "MARKETING");
pstmt.setString(3, "SEOUL");
int resultCnt = pstmt.executeUpdate(); //실행
System.out.println(resultCnt + "개의 행이 입력되었습니다.");
System.out.println("-----------------------------------------");
//<데이터 읽어오기_Statement, Resultset, rs.next()>
//3. Statement 생성: sql문 데이터베이스로 실행 요청 하기위해 생성
Statement stmt = conn.createStatement();
//4. 요청할 SQL문
String sql1="select * from dept order by deptno";
//Select의 결과를 Resultset 객체에 담는다.
ResultSet rs = stmt.executeQuery(sql1);
System.out.println("[부서리스트] ");
while(rs.next()) {
System.out.println("----------------------------");
System.out.println("부서번호: " + rs.getInt("deptno"));
System.out.println("부서이름: " + rs.getString(2));
System.out.println("부서위치: " + rs.getString("loc"));
}
System.out.println("----------------------------");
rs.close();
stmt.close();
//3.데이터 베이스의 연결 종료
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("데이터베이스 드라이버를 찾을 수 없습니다.");
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
댓글 없음:
댓글 쓰기