# 22. Java 21일차(230913) [국비교육]

brand_mins·2023년 9월 13일

Java

목록 보기
22/47

1. JDBC 프로그래밍

(1) 이용방법

1 자바 프로젝트 파일을 생성한다.
2 생성 후 properties 클릭하기 > java build path 탭 누르기
3 add external jar를 누른 후 해당 jdbc 파일 넣기

(2) 코드 예제 이론

1) 드라이버 로딩

Class.forName("Oracle.jdbc.driver.OracleDriver");
- Oracle JDBC 드라이버를 로딩.
- JDBC 드라이버를 로딩하지 않으면 데이터베이스 접속불가

2) 데이터베이스 연결

DriverManager.getConnection(url,user,pw);
- 오라클 DB 연결
- url은 데이터베이스의 서버 주소와 포트, SID/Service Name을 포함한 URL
- user, pw는 데이터베이스에 접속할 사용자 이름과 비밀번호

3) 데이터베이스 SQL문 전송하기 위한 쿼리생성 및 담당객체 생성

String sql = "select * from human;"
- human 테이블에서 모든 데이터를 조회하는 SELECT 쿼리

conn.createStatement();
- SQL문을 데이터베이스로 전송하는 Statement 객체를 생성.

4) 데이터베이스에 SQL문 전송

st.executeQuery(sql);
- SQL문을 데이터베이스로 전송하고 결과를 ResultSet 객체로 받아옴.

5) ResultSet 출력

while(rs.next()) {}
- ResultSet 객체에 조회 결과가 있는 동안 반복.
- ResultSetnext() 메소드를 호출하면 조회 결과를 한 행씩 읽어옴.

rs.getString("name");
rs.getInt("age");
rs.getDouble("height");
- 각 컬럼의 값을 가져오는 메소드.
- 인덱스나 컬럼명을 이용해서 가져올 수 있다.

6) 데이터베이스와 연결된 자원을 반납

rs.close();
st.close();
conn.close();
- ResultSet, Statement,Connection 등 데이터베이스와 관련된 자원을 반납.
- 이를 하지 않으면 데이터베이스에 대한 연결이 종료되지 않고 남아있음.

(3) 데이터베이스 연동

create table human(
name nvarchar2(30), age number(3), height number(4,1), birthday date
);
insert into human(name,age,height,birthday)
values('김수호',20,160.4,to_date('2005:05:05 02:25:50','YYYY:MM:DD
HH24:MI:SS'));
insert into human(name,age,height,birthday)
values('나수호',24,170.8,to_date('2000:10:15 12:25:10','YYYY:MM:DD
HH24:MI:SS'));
insert into human(name,age,height,birthday)
values('박수호',27,188.6,to_date('1995:12:04 13:45:14','YYYY:MM:DD
HH24:MI:SS'));
  • 먼저 sql에 데이터 입력하기
  • 이후 자바로 연동하기. 코드는 다음과 같다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.time.LocalDateTime;

public class JdbcTest {

	public static void main(String[] args) {
		try {
			// 1. 드라이버 로딩
			// Class.forName == new 클래스 문자열로 클래스 생성하는 메소드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 연결");
			
			// 2. 데이터베이스 연결 connection 클래스
			// jdbc = oracle:thin::(제품명)@Localhost(주소):1521(포트):xe(씨드아이디)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "c##human";
			String pw = "human";
			Connection conn = DriverManager.getConnection(url, user, pw);
			System.out.println("데이터베이스에 접속 성공");
			
			// 3. 데이터베이스 sql문 전송을 위한 쿼리 생성과 담당 객체 생성(statement)
			String sql = "select * from human";
			System.out.println("sql 에러시 여기서 문자열을 확인:" + sql);
			Statement st = conn.createStatement();
			
			// 4. 데이터베이스 sql문을 전송
			ResultSet rs = st.executeQuery(sql);
			
			// 5. resultSet 출력하기
            // while(rs.next()): ResultSet 객체에 조회 결과가 있는 동안 반복. 호출 시 조회 결과를 한 행씩 읽음.
			// rs.getString, rs.getInt 등 각 컬럼의 값을 가져오는 메소드임. 인덱스나 컬럼명 이용하여 값을 가져올 수 있음.
			while(rs.next()) {
				String name = rs.getString("name");
				int age = rs.getInt("age");
				double height = rs.getDouble("height");
				LocalDateTime birthday = rs.getTimestamp("birthday").toLocalDateTime();
				System.out.println("name: " + name);
				System.out.println("age: " + age);
				System.out.println("height: " + height);
				System.out.println("birth: " + birthday);
				System.out.println("----------------------------------------");
			}
			
			// 6. 데이터베이스와 연결된 자원을 반납
			if(rs != null) rs.close();
			if(st != null) st.close();
			if(conn != null) conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class JdbcInsert {

	public static void main(String[] args) {
		try {
			// 1. 드라이버 로딩
			// Class.forName == new 클래스 문자열로 클래스 생성하는 메소드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 연결");
			
			// 2. 데이터베이스 연결 connection 클래스
			// jdbc = oracle:thin::(제품명)@Localhost(주소):1521(포트):xe(씨드아이디)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "c##human";
			String pw = "human";
			Connection conn = DriverManager.getConnection(url, user, pw);
			// SQL문 실행을 위한 Statement 객체 생성
			Statement st = conn.createStatement();
			// Insert할 데이터 설정
			String name = "홍길도";
			int age = 15;
			double height = 166;
			LocalDateTime birthday = LocalDateTime.now();
			
			// SQL문 작성: 값 대신 변수를 사용하여 SQL문을 유연하게 작성
			String sql = String.format("insert into human values('%s',%d,%f"
					+ ",to_date('%s', 'YYYY-MM-dd HH24:MI:SS'))", name, age, height, 
					birthday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
			System.out.println("sql 에러시 여기서 문자열을 확인" + sql);
			
			// SQL문 실행 결과 및 처리
			// execute 메소드는 변경된 데이터 개수를 리턴
			int cnt = st.executeUpdate(sql);
			System.out.println(cnt + "개 데이터가 입력되었습니다.");
			// 자원 해제
			if(st != null) st.close();
			if(conn != null) conn.close();			
		} catch (ClassNotFoundException e) {
			// JDBC 드라이버 로드 실패시 예외 처리
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
			
		}
	}

}
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JdbcDelete {

	public static void main(String[] args) {
		try {
			// 1. 드라이버 로딩
			// Class.forName == new 클래스 문자열로 클래스 생성하는 메소드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 연결");
			
			// 2. 데이터베이스 연결 connection 클래스
			// jdbc = oracle:thin::(제품명)@Localhost(주소):1521(포트):xe(씨드아이디)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "c##human";
			String pw = "human";
			Connection conn = DriverManager.getConnection(url, user, pw);
			Statement st= conn.createStatement();
			String name = "홍길도";
			String sql = String.format("delete human where name = '%s'", name);
			// executeDelete: 삭제된 데이터 개수가 리턴.
			System.out.println("sql 에러시 여기서 문자열 확인:" + sql);
			int cnt = st.executeDelete(sql);
			System.out.println(cnt +"개 데이터가 삭제되었습니다");
			
			if(st != null) st.close();
			if(conn != null) conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcUpdate {

	public static void main(String[] args) {
		try {
			// 1. 드라이버 로딩
			// Class.forName == new 클래스 문자열로 클래스 생성하는 메소드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 연결");
			
			// 2. 데이터베이스 연결 connection 클래스
			// jdbc = oracle:thin::(제품명)@Localhost(주소):1521(포트):xe(씨드아이디)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "c##human";
			String pw = "human";
			Connection conn = DriverManager.getConnection(url, user, pw);
			Statement st= conn.createStatement();
			String name = "홍길도";
			int age = 39;
			String sql = String.format("update human set age =%d where name = '%s'", age,name);
			System.out.println("sql 에러시 여기서 문자열을 확인:" + sql);
			// executeUpdate는 변경된 데이터 개수가 리턴
			int cnt = st.executeUpdate(sql);
			System.out.println(cnt + "개 데이터가 변경되었습니다.");
			if(st != null) st.close();
			if(conn != null) conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
			
		}

	}

}
profile
IT 개발자가 되기 위한 기록

0개의 댓글