20/12/20

아라·2020년 12월 20일
0

국비교육

목록 보기
30/30

JDBC 연결

public class DBUtil {

	private static Connection conn;
	
	/**
	 * 데이터 베이스 연결 메소드입니다.
	 * @return 연결된 Connection 객체를 반환합니다.
	 */
	public static Connection open() {
		String url="jdbc:oracle:thin:@localhost:1521:xe";
		String id="hr";
		String pw="*******";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, id, pw);
			return conn; // 성공하면 접속된 Connection 반환
		} catch (Exception e) {
			System.out.println("DBUtil.open()");
			e.printStackTrace();
		}
		
		return null; // 실패하면 null 반환
	}
	
	/**
	 * 데이터 베이스 연결 메소드입니다.
	 * @param server 접속할 서버 주소입니다.
	 * @param id 접속할 계정명입니다.
	 * @param pw 접속할 비밀번호입니다.
	 * @return 연결된 Connection 객체를 반환합니다.
	 */
	public static Connection open(String server, String id, String pw) {
		String url="jdbc:oracle:thin:@"+server+":1521:xe";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, id, pw);
			return conn; // 성공하면 접속된 Connection 반환
		} catch (Exception e) {
			System.out.println("DBUtil.open()");
			e.printStackTrace();
		}
		
		return null; // 실패하면 null 반환
	}
	
}

Statement 클래스

  • SQL 구문을 실행해주는 역할(대리자)
  • 모든 SQL을 실행할 수 있다.

Statement 클래스 종류

  1. Statement
  • 기본 클래스
stat=conn.createStatement();
// statement는 쿼리를 날릴 수 있는 기능만 가지고 있고,
// 어떤 서버에 어떤 계정으로 연결해서 실행할지는 모른다.
// 그래서 connection에다가 붙여서 실행.
// stat -(의존)-> connection
				
// *** SQL 종류 -> 반환값 O, X 미리 구분해야 함!
// 반환값이 있느냐 없느냐에 따라 메서드가 달라지기 때문
// 1. 반환값 없는 쿼리 실행
// stat.executeUpdate(sql)
				
// 2. 반환값 있는 쿼리 실행
// stat.executeQuery(sql)
				
int result=stat.executeUpdate(sql); // SQL Developer에서 Ctrl + Enter한 것과 동일
// executeUpdate의 반환값 int(result값)는 적용된 행의 숫자를 돌려준 것. 결과셋 X
				
if (result==1) {
	System.out.println("등록 성공");
}else {
	System.out.println("등록 실패");
}
				
// 열었던 순서의 반대로 닫기
// 자원 해제 필수(**********)
stat.close();
conn.close();
private static void m9() {
		
	Connection conn = null;
	Statement stat = null;
	ResultSet rs = null;

	try {
		conn = DBUtil.open();
		stat = conn.createStatement();

		// 요구사항) 영업부 직원수와 영업부 직원 명단을 출력하시오.
		// 1. select count(*) as cnt from tblInsa where buseo='영업부';
		// 2. select * from tblInsa where buseo='영업부';
			
		String sql = "select count(*) as cnt from tblInsa where buseo='영업부'";
		rs = stat.executeQuery(sql);
			
		if (rs.next()) {
			System.out.println("영업부 직원수 : "+rs.getString("cnt"));
		}
		rs.close();
			
		sql = "select * from tblInsa where buseo='영업부'";
		rs = stat.executeQuery(sql);
			
		// 커서 탐색 방식 -> 자신이 탐색해야 하는 레코드의 개수를 알 수 없다.
		// -> 한칸씩 접근을 해야지만 레코드가 존재하는지 인식
			
		int n=0;
		// count 구하려고 쿼리날리는 방법도 있지만 이렇게 누적변수로 구하는 방법도 있음.
		// 하지만 별로 추천하고 싶지는 않다고 하셨음.
		/*
		while (rs.next()) {
			System.out.println(rs.getString("name"));
			n++;
		}
			
		System.out.println(n);
		*/
		rs.close();
		stat.close();
		conn.close();
			
	} catch (Exception e) {
		System.out.println("Ex05_select.m9()");
		e.printStackTrace();
	}
}
  1. PreparedStatement
  • Statement 개량 클래스 -> 매개 변수 처리에 특화
  • 안정성 높음 + 가독성 높음
  • 코드량 많음
public static void main(String[] args) {
	// Ex06_PreparedStatement.java

	// 1. Statement
	// - 매개변수가 없는 SQL -> 정적 쿼리
		
	// 2. Prepared Statement
	// - 매개변수가 있는 SQL -> 동적 쿼리
	
	// 3. CallableStatement
	
	// PreparedStatement
	// - 매개변수가 있는 SQL 실행 용도
	
	// insert + 사용자 입력
	
	String name="하하하";
	String age="20";
	String gender="m";
	String tel="010-1111-2222";
	String address="서울시 동대문구 이문'동"; // '를 넣고 싶으면 '' 이렇게 두 번 적어야 함.
	address = address.replace("'", "''");
		
	Connection conn = null;
	Statement stat = null;
    	PreparedStatement pstat = null;
	ResultSet rs = null;

	try {
		conn = DBUtil.open();
		
			
		// 1. Statement 사용
		// - SQL을 문자열 취급 + 매개변수 문자열 취급
		// - String.format()을 사용
		
		
		String sql = String.format("insert into tblAddress (seq, name, age, gender, tel, address, regdate) values (seqAddress.nextVal, '%s', %s, '%s', '%s', '%s', default)", name, age, gender, tel, address);
		stat = conn.createStatement();
		System.out.println(stat.executeUpdate(sql));
			
		// 2. PreparedStatement 사용
		// - ? : 오라클 매개변수
		// - String.format() 불필요
		// - 매개변수를 손쉽게 전달 가능
		// - 매개변수 값으로 부적절한 값이 있어도 자동으로 이스케이프를 시켜준다.(***)
		sql = "insert into tblAddress (seq, name, age, gender, tel, address, regdate) values (seqAddress.nextVal, ?, ?, ?, ?, ?, default)";
		pstat=conn.prepareStatement(sql);
			
		pstat.setString(1, name); // 매개변수에 값 전달
		pstat.setString(2, age); // 2번째 물음표에 age를 넣어주세요.
		pstat.setString(3, gender);
		pstat.setString(4, tel);
		pstat.setString(5, address);
		
		System.out.println(pstat.executeUpdate());
			
		stat.close();
		conn.close();
	} catch (Exception e) {
		System.out.println("Ex06_PreparedStatement.main()");
		e.printStackTrace();
	}
	
}
  1. CallableStatement
  • Statement 개량 클래스 -> 프로시저 호출
  • 프로시저 전용
  • PreparedStatement와 유사
private static void m5() {
	Connection conn = null;
	CallableStatement stat = null;
	ResultSet rs = null;

	try {
		conn = DBUtil.open();

		String sql = "{ call procM5(?, ?) }";
		stat=conn.prepareCall(sql);
		stat.setString(1,  "개발부");
		stat.registerOutParameter(2, OracleTypes.CURSOR);
		stat.executeQuery();
			
		// Oracle(cursor) -> JDBC(ResultSet)
		rs=(ResultSet)stat.getObject(2);
			
		while(rs.next()) {
			System.out.println(rs.getString("name"));
			System.out.println(rs.getString("jikwi"));
			System.out.println(rs.getString("city"));
			System.out.println();
		}

		rs.close();
		stat.close();
		conn.close();
	} catch (Exception e) {
		System.out.println("Ex07_CallableStatement.m5()");
		e.printStackTrace();
	}
}

0개의 댓글