본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch20 데이터베이스 입출력 1(JDBC, Oracle SQL, INSERT)

728x90
반응형

1. JDBC 개요

◎ JDBC 라이브러리

   ▷ 자바는 데이터베이스(DB)와 연결해서 데이터 입출력 작업을 할 수 있도록 JDBC 라이브러리 (java.sql 패키지)를 제공
   ▷ JDBC는 데이터베이스 관리시스템(DBMS)의 종류와 상관없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성

 

 

 JDBC Driver
   ▷ JDBC 인터페이스를 구현한 것으로, DBMS마다 별도로 다운로드받아 사용
   ▷ DriverManager 클래스: JDBC Driver를 관리하며 DB와 연결해서 Connection 구현 객체를 생성
   ▷ Connection 인터페이스: Statement, PreparedStatement, CallableStatement 구현 객체를 생성하며,

        트랜잭션 처리 및 DB 연결을 끊을 때 사용
   ▷ Statement 인터페이스: SQL의 DDL과 DML 실행 시 사용 
   ▷ PreparedStatement: SQL의 DDL, DML 문 실행 시 사용.  매개변수화된 SQL 문을 써 편리성과 보안성 유리
   ▷ CallableStatement: DB에 저장된 프로시저와 함수를 호출
   ▷ ResultSet: DB에서 가져온 데이터를 읽음

 

 

2.  Oracle SQL 문법

1. 테이블 생성 방법
-- 사용자 USER 테이블
create table users(
    userid         varchar2(50) primary key,
    username       varchar2(50) not null,
    userpassword   varchar2(50) not null,
    userage        number(3)       not null,
    useremail      varchar2(50) not null
);

-- 게시판 boards 테이블
create table boards(
    bno        number         primary key,
    btitle     varchar2(100)  not null,
    bcontent   clob           not null,
    bwriter    varchar2(50)   not null,
    bdate      date           default sysdate,
    bfilename  varchar2(50)   null,
    bfiledata  blob           null    
);

-- boards 테이블의 bno 값을 제공하는 시퀀스를 생성
create sequence SEQ_BNO nocache;


control + enter를 사용하면 작성한 구문이 실행됩니다.
sequence는 mySQL의 auto_increment와 같이 자동으로 숫자를 증가시키는 기능을 합니다.

한줄 복사 : ctrl + shift + d
한줄 삭제 : alt + shift + d

2. 계좌 정보 테이블 생성 및 데이터 입력
-- 계좌 정보 저장될 accounts 테이블 생성
create table accounts(
    ano     varchar(20) primary key,
    owner   varchar(20) not null,
    balance number      not null
);

-- 계좌 정보 데이터 입력
insert into accounts(ano, owner, balance)
values ('111-111-1111', '하여름', 1000000);

insert into accounts(ano, owner, balance)
values ('222-222-2222', '한겨울', 0);

select * from accounts;

commit;​


3. 사용자 정보를 저장하는 프로시저 생성

-- 새로운 사용자 정보를 저장하는 프로시저
create or replace procedure user_create(
    a_userid        in users.userid%type,
    a_username      in users.username%type,
    a_userpassword  in users.userpassword%type,
    a_userage       in users.userage%type,
    a_useremail     in users.useremail%type,
    a_rows          out pls_integer
    -- 사용자 정보를 저장하고 나서 1개의 행을 삽입했다는 의미로
    -- 1을 out타입 매개변수에 저장
)
is
begin
    insert into users (userid, username, userpassword, userage, useremail)
    values (a_userid, a_username, a_userpassword, a_userage, a_useremail);
    a_rows := sql%rowcount;
    commit;
end;
/


4. user 테이블 생성 및 확인 결과를 리턴

-- users 테이블에서 userid와 userpassword 확인 그 결과를 리턴하는 user_login() 함수 생성
create or replace function user_login(
    a_userid        users.userid%type,
    a_userpassword  users.userpassword%type
) return pls_integer
is
    v_userpassword users.userpassword%type;
    v_result pls_integer;
begin
    select userpassword into v_userpassword
    from users
    where userid = a_userid;
    
    if v_userpassword = a_userpassword then
        return 0;   -- id랑 password 일치 : 0 반환
    else
        return 1;   -- id랑 password 불일치 : 1 반환
    end if;
exception
    when no_data_found then
        return 2;   -- userid가 없으면 2 반환
end;
/

 

3. 데이터베이스 연결
   ▷ 클라이언트 프로그램에서 DB와 연결하려면 해당 DBMS의 JDBC Driver가 필요
   ▷ ① DBMS가 설치된 컴퓨터의 IP 주소, ② DBMS가 허용하는 포트(Port) 번호, 

        ③ 사용자(DB 계정) 및 비밀번호 ④ 사용하고자 하는 DB 이름 필요

 

◎ ConnectionExample 예제

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

public class ConnectionExample {
	public static void main(String[] args) {
		Connection conn = null;
		
		try {
			// JDBC Driver 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@연결 주소:포트/SID",
					"오라클 ID",
					"오라클 PW"
					);
					
			System.out.println("연결 성공");
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
					System.out.println("연결 끊기");
				} catch (SQLException e) {}
			}
		}

	}
}

//	연결 성공
//	연결 끊기

 


◎ INSERT 문

1. users 테이블에 새로운 사용자 정보를 저장하는 INSERT 문 실행
2. INSERT 문을 String 타입 변수 sql에 문자열로 대입
3. 매개변수화된 SQL 문을 실행하기 위해 Connection의 prepareStatement() 메소드로부터 PreparedStatement를 얻음

4. 값을 지정한 후 executeUpdate() 메소드를 호출하면 SQL 문이 실행되면서 users 테이블에 1개의 행이 저장


5. close() 메소드를 호출하면 PreparedStatement가 사용했던 메모리 해제

 

 

◎ UserInsertExample 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserInsertExample {
	public static void main(String[] args) {
		Connection conn = null;
		
		try {
			// JDBC Driver 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@연결 주소:포트/SID",
					"오라클 ID",
					"오라클 PW"
					);
			
			// 매개변수화된 SQL문 작성
			String sql = ""+ "INSERT INTO users(userid, username, userpassword, "
					+ "userage, useremail) " + "VALUES (?, ?, ?, ?, ?)";
			
			// PreparedStatement 얻기 및 값 지정
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "winter");
			pstmt.setString(2, "한겨울");
			pstmt.setString(3, "12345");
			pstmt.setInt(4, 25);
			pstmt.setString(5, "winter@mycompany.com");
			
			// SQL문 실행
			int rows = pstmt.executeUpdate();
			System.out.println("저장된 행 수 : " + rows);
			
			// PreparedStatement 닫기
			pstmt.close();
			
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
				} catch (SQLException e) {}
			}
		}
	}
}

//	저장된 행 수 : 1

 

 파일 삽입 예제

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BoardWithFileInsertExample {
	public static void main(String[] args) {
		// boards 테이블에 게시물 정보 저장
		Connection conn = null;
		
		try {
			// JDBC Driver 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@연결 주소:포트/SID",
					"오라클 ID",
					"오라클 PW"
					);
			
			// 매개변수화된 SQL문 작성
			String sql = ""+
			"INSERT INTO boards (bno, btitle, bcontent, bwriter, bdate, bfilename, bfiledata) "
					+ "VALUES (SEQ_BNO.NEXTVAL, ?, ?, ?, SYSDATE, ?, ?)";
			
			// PreparedStatement 얻기 및 값 지정
			PreparedStatement pstmt = conn.prepareStatement(sql, new String[] {"bno"});
			pstmt.setString(1, "눈 오는 날");
			pstmt.setString(2, "함박눈이 내려요.");
			pstmt.setString(3, "winter");
			pstmt.setString(4, "snow.jpg");
			pstmt.setBlob(5, new FileInputStream("src/java0213_1/snow.jpg"));
			
			// SQL문 실행
			int rows = pstmt.executeUpdate();
			System.out.println("저장된 행 수 : " + rows);
			
			// bno 값 얻기
			if(rows == 1) {
				ResultSet rs = pstmt.getGeneratedKeys();
				if(rs.next()) {
					int bno = rs.getInt(1);
					System.out.println("저장된 bno : " + bno);
				}
				rs.close();
			}
			
			// PreparedStatement 닫기
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
				} catch (SQLException e) {}
			}
		}
	}
}

//	출력 : 
//	저장된 행 수 : 1
//	저장된 bno : 1  → 실행 횟수에 따라서 숫자 값은 늘어납니다.

 

 

vm vare의 오라클과 연결해서 localhost에서 사용해보았습니다.

 

DB와 Java를 연동해서 출력하는 예제를 많이 해봐야겠네요!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

728x90
반응형