DB

JDBC 기본 코드

짱코딩러 2022. 8. 9. 16:51

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(urluserpwd)

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