(1) : java.sql.Connection - DB에 연결
(2) : java.sql.Statement - SQL을 담은 내용
(3) : java.sql.ResultSet - SQL 요청 응답
✅ 순서
(1) : jar 파일이 제공하는 클래스가 있는지 확인
Class.forName("oracle.jdbc.driver.OracleDriver");
// 반드시 try-catch로 예외처리해야함 (ClassNotFoundException) -> 클래스가 없을 경우 예외처리
(2) : DriverManager 클래스를 이용하여 접속 객체 만들기 -> 커넥션
얻기
getConnection 메소드를 이용하여 DB가 있는 URL에 접속! -> 3개의 매개변수 필요!
커넥션 생성에 대해 더 자세하게 알려면 ->
첫번째 인수 : 접속할 DB의 주소, 버전정보, 포트번호(String) 오라클 : jdbc:oracle:thin:@ip주소:포트번호:버전 두번째 인수 : DB접속 계정명 (String) 세번재 인수 : DB접속 계정 비밀번호 (String
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe",
"student", // DB 계정명
"student"); // DB 계정 비밀번호
(3) : 접속된 DB에 SQL문을 실행하고 결과를 가져오기
(3)-1 : 쿼리문 작성
String sql = "SELECT * FROM MEMBER";
(3)-2 : Statement 객체 가져오기
Connection 클래스가 제공하는 멤버메소드인 createStatement() 메소드를 이용
Statement stmt = conn.createStatement(); // // SQLException 해야함
(3)-3 : 쿼리문 실행
ResultSet rs = stmt.executeQuery(sql);
// Statement가 제공하는 executeQuery() 실행하고 반환은 ResultSet 객체로 받는다
SELECT : executeQuery("sql문") 실행 -> ResultSet 객체를 반환 [하나의 객체 자체 (여러컬럼 있음)]
INSERT, UPDATE, DELETE : executeUpdate("sql문") 실행 -> int 반환
(3)-4 : 반환된 값 이용하기 (ResultSet 또는 int)
ResultSet 객체 자료형
-> Iterator 방식과 동일 ( 다음 데이터를 갖고 올 수 있음)
-> ResultSet객체가 제공하는 메소드를 이용해서 컬럼별 값을 가져올 수 있음
ResultSet 메소드
-> next() : 데이터의 다음 row를 지정 [반환형 : boolean]
-> get[String,Int,Date]("컬럼명"||인덱스번호)
getString() : char, varchar2, nchar, nvarchar2 자료형을 가져올 때
getInt() / getDouble() : number 자료형을 가져올 때
getDate() / getTimeStamp() : date, timestamp 자료형을 가져올 때
// 하나의 데이터를 가져올 때 경우
rs.next(); // 1번째 row를 지칭
String memberId = rs.getString("member_id"); // 문자열 자료형인 member_id 컬럼을 가져옴
String memberPwd = rs.getString("member_pwd"); // 문자열 자료형인 member_pwd 컬럼을 가져옴
int age = rs.getInt("age"); // 숫자 자료형인 age 컬럼을 가져옴
Date enrollDate = rs.getDate("enroll_date"); // 날짜 자료형인 enroll_date 컬럼을 가져옴
// 다수의 데이터를 가져올 때 경우
// 반복문을 사용하여 next() 함수를 사용한다
while(rs.next()) {
String memberId = rs.getString("member_id");
String memberPwd = rs.getString("member_pwd");
int age = rs.getInt("age");
Date enrollDate = rs.getDate("enroll_date");
System.out.println(memberId + " "+ memberPwd+" "+age+" "+enrollDate);
}
(4) 생성한 객체는 반드시 반환해줘야함 -> (close) 메소드
finally {
//5. 생성한 객체를 반드시 반환해줘야한다
// Connection, Statement, ResultSet
// close() 메소드를 이용해서 반환을 한다.
// 생성한 역순으로 반환해줌
try {
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(conn!=null)conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
위에서 배운 모든 내용을 코드로 정리하기
package com.jdbc.controller;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.jdbc.model.vo.Member;
public class BasicJdbcTest {
public static void main(String[] args) {
// finally 부분에다 쓰기 위해서 맨위에다 선언함
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
// jdbc를 이용해서 오라클 연동해보기
// 1. 오라클에서 제공하는 ojdbc.jar 파일을 버전에 맞춰서 다운로드
// 2. 이클립스에서 프로젝트를 생성하고 생성된 프로젝트 라이브러리에 다운받은 jar 파일을 추가한다
// 프로젝트 (애플리케이션)에서 DB에 접속하기
// 1. jar 파일이 제공하는 클래스가 있는지 확인하기 -> jar 파일 등록여부 확인
// jar파일 없거나 오타나면 오류남
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. DriverManager 클래스를 이용해서 접속하는 객체를 만들어준다.
// DrvierManager 클래스가 제공하는 getConnection() static 메소드를 이용해서
// Connection 객체를 가져온다. -> getConnection() 메소드는 Connection 객체를 반환
// getConnection 이용하기 -> 3개의 매개변수가 선언되어있음
// 첫번째 인수 : 접속할 DB의 주소, 버전정보, 포트번호(String)
// 접속할 DBMS별로 문자열 패턴을 정해놓음!
// 오라클 : jdbc:oracle:thin:@ip주소:포트번호:버전
// 두번째 인수 : DB접속 계정명 (String)
// 세번재 인수 : DB접속 계정 비밀번호 (String)
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe",
"student",
"student");
// 트렌젝션을 개발자가 직접 처리하겠다.
conn.setAutoCommit(false); // 자동커밋하지 못하도록 막음
System.out.println("DB 접속 확인 완료"); // 잘접속했는지 확인 문구
// 3. 접속된 DB에 SQL문을 실행하고 결과를 가져와야함
// SQL문을 실행하기 위해서 실행할 객체가 필요함
// StateMent, PreparedStateMent : 문자열로 작성한 sql 구문을 연결된 DB에서
// 실행하는 객체
// sql문을 실행하려면 Statement의 멤버메소드 executeQuery(), executeUpdate() 메소드를 이용
// SELECT : executeQuery("sql문") 실행 -> ResultSet 객체를 반환
// INSERT, UPDATE, DELETE : executeUpdate() 실행 -> int 반환
// 3.1) 쿼리문 작성하기
// member 테이블에 있는 아이디가 admin인 사원 조회하기
// SELECT * FROM MEMBER WHERE MEMBER_ID = 'admin';
// 문자열 변수에 sql문을 저장할때는 ;를 생략한다!
// String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = 'admin'";
// 등록된 회원 전체 가져오기
String sql = "SELECT * FROM MEMBER";
// 3.2) Statement 객체 가져오기
// import할때 인터페이스꺼 import 하기
// Connection 클래스가 제공하는 멤버메소드인 createStatement() 메소드를 이용
stmt = conn.createStatement(); // SQLException 해줘야함
// 3.3) 쿼리문 실행하기
// Statement가 제공하는 executeQuery() 실행하고 반환은 ResultSet 객체로 받는다
rs = stmt.executeQuery(sql);
System.out.println(rs);
// 3.4) ResultSet 이용하기 (Iterator 방식과 동일함 (다음 데이터를 가져옴))
// 반환된 SELECT 문의 실행결과는 ResultSet객체가 제공하는 메소드를 이용해서
// 컬럼별 값을 가져온다.
// next() : 데이터의 row를 지정 -> row 데이터를 가져옴 [반환형: booelan]
// get자료형[String,Int,Date]("컬럼명"||인덱스번호)
// getString() : char, varchar2, nchar, nvarchar2 자료형을 가져올 때
// getInt()/getDouble() : number 자료형을 가져올 때
// getDate() / getTimeStamp() : date, timestamp 자료형을 가져올 때
// rs.next(); // 1번째 row를 지칭
// //컬럼명과 테이블명은 대소문자 구분 안함
// String memberId = rs.getString("member_id");
// String memberPwd = rs.getString("member_pwd");
// int age = rs.getInt("age");
// // SQL date를 import하는것이 좋음
// Date enrollDate = rs.getDate("enroll_date");
// 다수의 데이터 가져오기
// while(rs.next()) {
// String memberId = rs.getString("member_id");
// String memberPwd = rs.getString("member_pwd");
// int age = rs.getInt("age");
// Date enrollDate = rs.getDate("enroll_date");
// System.out.println(memberId + " "+ memberPwd+" "+age+" "+enrollDate);
// }
// DB의 row를 가져왔을때 자바에서는 클래스로 저장해서 관리
// row 한개만 가져올때 경우
// Member m = new Member();
// while(rs.next()) {
// m.setMemberId(rs.getString("member_Id"));
// m.setMemberPwd(rs.getString("member_pwd"));
// m.setMemberName(rs.getString("member_name"));
// m.setGender(rs.getString("gender"));
// m.setAge(rs.getInt("age"));
// m.setEmail(rs.getString("email"));
// m.setPhone(rs.getString("phone"));
// m.setAddress(rs.getString("address"));
// m.setHobby(rs.getString("hobby"));
// m.setEnrollDate(rs.getDate("enroll_date"));
//
// System.out.println(m);
// }
// row 여러개를 가져올 때 경우
// member 리스트에는 Member 객체만 들어갈수있다
List<Member> members = new ArrayList();
while(rs.next()) {
Member m = new Member();
m.setMemberId(rs.getString("member_id"));
m.setMemberPwd(rs.getString("member_pwd"));
m.setMemberName(rs.getString("member_name"));
m.setGender(rs.getString("gender"));
m.setAge(rs.getInt("age"));
m.setEmail(rs.getString("email"));
m.setPhone(rs.getString("phone"));
m.setAddress(rs.getString("address"));
m.setHobby(rs.getString("hobby"));
m.setEnrollDate(rs.getDate("enroll_date"));
members.add(m);
}
members.forEach((m)-> System.out.println(m));
// DML구문 실행하기
// insert, update, delete문
// 트렌젝션처리를 해줘야한다
// 1. sql문 작성 -> 리터럴 형태에 맞춰서 작성해야함
sql = "INSERT INTO MEMBER VALUES('inhoru','inhoru',"
+ "'최인호','M',26,'inhoru@inhoru.com',"
+ "'0101234145','금천구','영화감상,애니감상,코딩',SYSDATE)";
int result = stmt.executeUpdate(sql);
// 트렌젝션구문으로 처리하기
if(result>0) conn.commit(); // 행이 잘 삽입됬으면 커밋
else conn.rollback(); // 그렇지 않으면 되돌리기
System.out.println(result);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}finally {
//5. 생성한 객체를 반드시 반환해줘야한다
// Connection, Statement, ResultSet
// close() 메소드를 이용해서 반환을 한다.
// 생성한 역순으로 반환해줌
try {
if(rs!=null)rs.close(); // 값이 널값일때 .연사자로 접근하면 Nullpoint 예외처리 발생하기때문
if(stmt!=null)stmt.close();
if(conn!=null)conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}