JDBC : 어댑터같은거임. 나라마다 다른 어댑터를 가져가는것처럼!
얘 자체로 기능이 있는건 아니지만 얘를 거치면 코드 안바꾸고도
여러 포맷의 데이터베이스랑 연결할 수 있음!
대신 포멧마다 JDBC드라이버(실제 구동 코드를 가짐)를 다운받아줘야 함
private static final String driver = "oracle.jdbc.driver.OracleDriver";
private static final String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
private static final String user = "scott";
private static final String pwd = "tiger";
String query2 = "SELECT * FROM Member"; //Member테이블에 있는 모든 쿼리를 조회하겠다
1.드라이버 로드하기
Class.forName(driver);
2.연결(인증된 결과를 통해 연결이 확립됨)
Connection conn = DriverManager.getConnection(url, user, pwd)
3.문장(쿼리)실행(객체생성)
Statement stmt = conn.createStatement();
4.결과집합 사용하기
ResultSet rs = stmt.executeQuery(query2);
=>결과 집합이 만들어지고, 그 결과집합을 사용하기 위헤
커서와 빈그릇(ResultSet)이 생성됨
5.레코드 호출
rs.next();
=>레코드의 앞머리에 있던 커서가 다음 레코드로 움직이면서 데이터가 그릇에 담김
BoF(Before of File)부터 EoF(End og File)까지 싹 훑음
6.데이터를 꺼냄(타입에 따라 get- 적어줌)
Sting title = re.getSting("title");
7.다 썼으면 역순으로 반납해준다.
rs.close();
stmt.close();
conn.close();
(3.)에서 Statement를 쓸때는 (4.)결과집합을 사용(실행)하면서(커서와 빈그릇(ResultSet)이 생성될때) sql을 전달했는데
PreparedStatement는 미리 sql문을 준비해서(이미 쿼리문을 갖고잇음) 나중에 실행만 할 수 있게 되어있음.
(실행시에 값(sql)을 넣지않음)
때문에 물음표에 값을 채워줄 수 있는것!
(4.)실행할때는 1.쿼리를 할지 2.업데이트를 할지 골라서 입력해줘야 한다.(리턴 타입이 다르기때문에)
1.executeQuery : SELECT는 결과집합이 있기 때문에 Query를 이용해서 ResultSet(결과집합)을 받는다
2.executeUpdate : INSERT, UPDATE,DELETE등 조작을 할때는 결과집합이 없기때문에 Update사용해서 int(몇개 업데이트 했는지)를 받는다.
필터링, 정렬, 그룹화 등 조건을 넣어주고 싶다면
이렇게 하지 말고
if(rs.getInt("height")>170)
System.out.print(", 키는>>" + rs.getInt("height"));
이렇게 해주는 게 좋아요
query2 = "SELECT * FROM Member WHERE heigth>170";
자바는 UI 레이아웃 만, 데이터 가공처리는 SQL이 해주는 것입니다.
기본 코드
package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Program {
private static final String driver = "oracle.jdbc.driver.OracleDriver";
private static final String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
private static final String user = "scott";
private static final String pwd = "tiger";
private static final String query2 = "SELECT * FROM Member WHERE height>170";
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//먼저 예외 다 던져줌
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, pwd);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query2);
//레코드 요청, 데이터 가져오기
if(rs.next()) { //다음값이 있으면 true, 없으면 false
String name = rs.getString("name"); //칼럼명은 대소문자 구분 안해도됨
System.out.println(name);
}//데이터가 없으면 아무것도 안뜸!
//레코드의 모든 컬럼 출력해보기
while (rs.next()) { //요소가 있는동안 반복
//getInt(n)함수는 n순서의 열에있는 데이터를 받아옴
//rs.getString("컬럼명") "컬럼명"인 컬럼의 데이터 받아옴
System.out.print("아이디는>>" + rs.getString("id"));
System.out.print(", 이름은>>" + rs.getString("name"));
System.out.print(", 키는>>" + rs.getInt("height")); //170이상만 출력되도록 설정해둠.
System.out.print(", 체중은>>" + rs.getInt("weight"));
System.out.print(", 나이는>>" + rs.getInt("age"));
System.out.println();
}
rs.close();
stmt.close();
conn.close();
}
}
PreparedStatement사용
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class CPoolMemberTest {
private static final String driver = "oracle.jdbc.driver.OracleDriver";
private static final String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
private static final String user = "scott";
private static final String pwd = "tiger";
private static final int initialCons = 5; // 최초 생성되는 커넥션 풀 객체수
private static final int maxCons = 20; // 최대 생성 커넥션 풀 객체수
private static final boolean block = true;
private static final long timeout = 10000; // 최대 연결 시간
public static void main(String[] args) {
Connection conn;
Statement stmt;
ResultSet rs;
ConnectionPool cp;
try {
Class.forName(driver);
System.out.println("Oracle 드라이버 로딩 성공");
cp = new ConnectionPool(url, user, pwd, initialCons, maxCons, block, timeout);
System.out.println("ConnectionPool 생성...");
conn = cp.getConnection();
System.out.println("Connection 생성 성공");
//변수랑 바인딩되는 부분은 물음표로 채워줬음(직접 쓰면 따옴표도 헷갈리고 번거로워서)
//물음표를 채워줄때는 Statement가 아니라 PreparedStatement를 사용해줘야 한다.
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO Member VALUES ( ?,?,?,?,? )");
System.out.println("PreparedStatement 생성 성공");
// 첫번째 물음표
pstmt.setString(1, "0008"); //인덱스는 0아니고 1부터 시작합니다
// 두번째 물음표+ 문장 세팅
pstmt.setString(2, "박지성");
pstmt.setInt(3, 178);
pstmt.setInt(4, 67);
pstmt.setInt(5, 23);
pstmt.executeUpdate(); // 실행
// 세번째 물음표
pstmt.setString(1, "0009");
pstmt.setString(2, "임꺽정");
pstmt.setInt(3, 167);
pstmt.setInt(4, 45);
pstmt.setInt(5, 18);
pstmt.executeUpdate();
/*
* String query = "SELECT * FROM Member where name= ?" ;
* pstmt.setString(1,"홍길동"); 다음문장 이렇게 써도 됨
*/
// 문자열 연산할때 오류를 피하려고 prepareStatement객체를 썼다.
String query = "SELECT * FROM Member";
pstmt = conn.prepareStatement(query);
System.out.println(query);
rs = pstmt.executeQuery();
while (rs.next()) { // 레코드 없을 때 까지 뿌려
System.out.print("이름은>>" + rs.getString("id"));
System.out.print("이름은>>" + rs.getString("name"));
System.out.print(" 키는>>" + rs.getInt("height"));
System.out.print(" 체중은>>" + rs.getInt("weight"));
System.out.print(" 나이는>>" + rs.getInt("age"));
System.out.println();
}
rs.close();
pstmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
'DB' 카테고리의 다른 글
JDBC 입력, 수정, 삭제 (0) | 2022.08.09 |
---|---|
JDBC 트랜잭션 (0) | 2022.08.09 |
SQL 롤 권한 제어 (0) | 2022.08.09 |
SQL 사용자 관리 (0) | 2022.08.08 |
SQL 인덱스 (0) | 2022.08.08 |