1. JDBC


  • 자바 프로그램과 데이터베이스를 연결하는 프로그래밍 방식
  • java.sql
  • java프로그램은 JDBC를 통해 데이터베이스에 연결
    • 데이터를 검색, 입력, 수정, 삭제 가능
  • 드라이버 설치(ojdbc8.jar)
    • C:\app\Administrator\product\18.0.0\dbhomeXE\jdbc\lib\ojdbc8.jar 복사
    • c:\java\jdk1.8.0_65\jre\lib\ext 붙여넣기
      • 외부 jar 저장 경로
  • 환경변수
    • classpath
      • C:\Java\jdk1.8.0_321\jre\lib\ext\ojdbc8.jar 추가
      • 추가 후
        • %classpath%;.;C:\Java\jdk1.8.0_321\jre\lib\ext\ojdbc8.jar
  • 이클립스 사용 시
    • build path 라이브러리에 ojdbc8.jar 추가 buildpath1
  • 설정 정보확인
    • 오라클 host명 확인
    • C:\app\EZEN\product\18.0.0\dbhomeXE\network\admin\tnsnames.ora
    • tnsname

    • C:\app\EZEN\product\18.0.0\dbhomeXE\network\admin\listener.ora
    • listener
    • 자바 소스에서 호스트명을 일치시켜야 한다

      String url = “jdbc:oracle:thin:@<HOST>:<PORT>:<SID>”
      String url = “jdbc:oracle:thin:@DESKTOP-56VTHAK:1521:xe”;

1. jdbc 프로그래밍 순서

  • 순서
    • 드라이버 로딩
    • 연결을 위한 connection객체 생성
    • sql문을 처리하기 위한 prepareStatement 객체 생성
    • 실행
    • 자원해제
  • 데이터베이스와 연결하는 드라이버 클래스 찾기
    • Class.forName(“oracle.jdbc.driver.OracleDriver”);
  • 드라이버 클래스를 통해 데이터베이스 서버와 연결하는 connection 객체 생성
    • String url=”jdbc:oracle:thin:@localhost:1521:xe”;
    • String id=”hr”, pwd=”hr123”;
    • Connection con = DriverManager.getConnection(url, id, pwd);
  • 작업을 처리할 statement, preparedStatement, CallableStatement객체 생성
    • Statement stmt = con.createStatement();
    • 또는 PreparedStatement pstmt = con.prepareStatement(“쿼리문”)
  • Statement, PreparedStatement를 통해 쿼리문 전송
    • insert,update,delete 문인 경우
      • int cnt = stmt.exeuteUpdate()
    • select문인 경우
      • resultSet rs = stmt.executeQuery()
      • resultSet의 논리적 커러슬 이동시키며 각 컬럼의 데이터를 꺼내온다
      • bollean b = rs.next()
        • 커서 이동, 커서가 위치한 지점에 레코드가 있으면 true
      • 커서는 맨 처음에 첫 번째 행의 직전에 위치하고 있다가 next()호출시 다음 행 이동
  • ResultSet 객체를 통한 쿼리결과 처리
  • 접속 종료
    • rs.close(); stmt.close(); con.close();
    • null 체크해서 close(), finally블럭에서 구현
  • rs.get자료형(컬럼명 또는 컬럼인덱스) 메서드
    • 데이터를 꺼내오는 메서드
    • get 뒤에는 컬럼의 데이터 유형에 맞는 자료형 기재
    • number인 경우 re.getint(1);
    • varchar2인 경우 rs.getString(2);
    • date 인 경우 rs.getDate(“regdate”);

insert 예시

package com.jdbc.day1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class insertTest1 {

	public static void main(String[] args) {
		// insert
		Scanner sc = new Scanner(System.in);
		System.out.println("이름, 전화번호 입력!");
		String name = sc.nextLine();
		String tel = sc.nextLine();
		
		Connection con = null;
		PreparedStatement ps = null;
		
		
		try {
			//1 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로딩 성공");
			
			//2 데이터베이스 서버에 연결하기 위한 connection 객체 생성
			String url = "jdbc:oracle:thin:@DESKTOP-56VTHAK:1521:xe";
			String user = "javauser", pwd = "javauser123";
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("db연결 성공");
			
			//3 sql문을 처리하기 위한 PreparedStatement 객체 생성
			String sql = "insert into person(no, name, tel)\r\n"
					+ "values(person_seq.nextval, ?,?)";
			ps=con.prepareStatement(sql);
			
			//in parameter setting
			ps.setString(1,name);
			ps.setString(2,tel);
			
			//4 실행
			int cnt = ps.executeUpdate();
			System.out.println("처리된 행의 개수 : " + cnt);
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
		
			//5 자원해제(접속종료)
			try {
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}


select 예시

package com.jdbc.day1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;

public class selectTest1 {

	public static void main(String[] args) {
		//select
		
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			//1 드라이버로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로딩 성공");
			
			
			//2 연걸을 위한 connection객체 생성
			String url="jdbc:oracle:thin:@DESKTOP-56VTHAK:1521:xe";
			String user="javauser",pwd="javauser123";
			con= DriverManager.getConnection(url,user,pwd);
			System.out.println("db연결 성공");
			
			//3 sql문 처리를 위한 PreparedStatement 객체 생성
			String sql = "select * from person order by no desc";
			ps = con.prepareStatement(sql);
			
			//4 실행
			//[1] select => executeQuery()
			//[2] intsert, update, delete => executeUpdate()
			
			 rs = ps.executeQuery();
			 
			 while(rs.next()) {
				 int no = rs.getInt(1);
				 String name = rs.getString("name");
				 String tel = rs.getString("tel");
				 Date regdate = rs.getDate("regdate");
				 Timestamp regdate2 = rs.getTimestamp(4);
				 
				 System.out.print(no + "\t");
				 System.out.print(name + "\t");
				 System.out.print(tel + "\t");
				 System.out.print(regdate + "\t");
				 System.out.println(regdate2 + "\n");
				 
				 
			 }
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
/*
7	
김길동	
010-800-9000	
2022-03-31	
2022-03-31 16:14:36.0
*/

Statement 사용 예시

package com.jdbc.day1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class StatementTest {

	public static void main(String[] args) {
		// insert
		Scanner sc = new Scanner(System.in);
		System.out.println("이름, 전화번호 입력!");
		String name = sc.nextLine();
		String tel = sc.nextLine();
		
		Connection con = null;
		Statement ps = null;
		
		//1 드라이버 로딩
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로딩 성공");
			
			//2 데이터베이스 서버에 연결하기 위한 connection 객체 생성
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "javauser", pwd = "javauser123";
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("db연결 성공");
			
			//3 sql문을 처리하기 위한 Statement 객체 생성
			ps=con.createStatement();
			
			String sql = "insert into person(no, name, tel)\r\n"
					+ "values(person_seq.nextval,'"+name+"','"+tel+"')";
			
	
			
			//4 실행
			int cnt = ps.executeUpdate(sql);
			System.out.println("처리된 행의 개수 : " + cnt);
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			//5 자원해제(접속종료)
			try {
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

2. ResultSet 의 커서 이동

  • 기존 커서는 next()메서드를 통해 다음 행으로 이동, 되돌아 오는 것이 불가
  • 커서를 자유롭게 이동시키기 위한 설정
    Statement st=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
      ResultSet.CONCUR_READ_ONLY);
    
  • rs.afterLast() : rs를 마지막 행의 바로 뒤에 위치
    • rs.previous()
  • rs.beforeFirst() : 첫번째 행의 직전에 위치
    • rs.next()
  • rs.first() : 첫번째 행에 위치
  • rs.last() : 마지막 행에 위치
  • rs.absolute(n) : n번째 행으로 이동
  • rs.getRow() : 실체 커서가 위치한 곳의 행 번호 리턴
package com.jdbc.day1;

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

public class ReverseSelect {

	public static void main(String[] args) {
		// ResultSet 커서를 자유롭게 이동시키기 위한 설정
		
		Connection con = null;
		ResultSet rs = null;
		PreparedStatement ps = null;
		
		//1
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩성공");
			
			//2
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			String user="javauser",pwd = "javauser123";
			con=DriverManager.getConnection(url,user,pwd);
			System.out.println("연결성공");
			
			//3 ps
			String sql = "select * from person order by no";
			ps = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,
						ResultSet.CONCUR_READ_ONLY);
			
			rs = ps.executeQuery();
			rs.afterLast(); //rs를 마지막행의 바로 뒤에 위치시킨다
			
			while(rs.previous()) {
				int no = rs.getInt(1);
				String name = rs.getString(2);
				String tel = rs.getString(3);
				Timestamp regdate = rs.getTimestamp(4);
				
				System.out.println(no + " " + name + " " + tel + " " + regdate);
			}
			
			rs.absolute(2);
			System.out.println(rs.getInt(1) + " " + rs.getString(2));
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			}catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

3. execute()메서드

  • 모든 sql문장을 실행시킨다
  • select문이면 true
  • select문이 아니면 false 리턴

execute 활용 create

package com.jdbc.day2;

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

public class ExecuteTest {
	public static void main (String[] args) {
		Connection con = null;
		PreparedStatement ps = null;
		
		try {
			//드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩 성공");
			
			
			//connection
			String url = "jdbc:oracle:thin:@DESKTOP-56VTHAK:1521:xe";
			String user = "javauser";
			String pwd = "javauser123";
			con = DriverManager.getConnection(url,user,pwd);
			System.out.println("db연결성공");
			
			//ps
			String sql = "create table pd2"
					+"("
					+"no number primary key,"
					+"pdName varchar2(50) not null,"
					+"price number null,"
					+"regdate date default sysdate"
					+")";
			ps = con.prepareStatement(sql);
			
			//4 실행
			boolean bool = ps.execute();
			/*
			 * 모든 sql문장을 실행시킨다
			 * select문이면 true, select 문이 아니면 false를 리턴
			 */
			System.out.println("bool = "+bool);
			
			//sequence 생성 sql문
			sql = "create sequence pd2_seq"
					+ " start with 1"
					+ " increment by 1"
					+ " nocache";
			ps = con.prepareStatement(sql);
			
			//실행
			bool = ps.execute();
			System.out.println("bool = "+bool);
			
			System.out.println("pd2테이블 생성 성공");
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			}catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

execute 활용 insert

package com.jdbc.day2;

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

public class ExecuteInsert {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("상품명, 가격 입력!");
		String pdName = sc.nextLine();
		int price = sc.nextInt();
		
		
		Connection con = null;
		PreparedStatement ps = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩성공");
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "javauser";
			String pwd = "javauser123";
			con = DriverManager.getConnection(url,user,pwd);
			System.out.println("접속성공");
			
			
			String sql = "insert into pd2(no,pdname, price)\r\n"
					+ "values (pd2_seq.nextval,?,?)";
			ps = con.prepareStatement(sql);
			
			ps.setString(1,pdName);
			ps.setInt(2, price);
			
			boolean bool = ps.execute();
			System.out.println(bool);
			
			if(!bool) { //select 문이 아니면
				int cnt = ps.getUpdateCount();
				System.out.println("처리된 행의 개수 : "+cnt);
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

excute 활용 select

package com.jdbc.day2;

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

public class ExecuteSelect {

	public static void main(String[] args) {
		
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩성공");
			
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "javauser";
			String pwd = "javauser123";
			con = DriverManager.getConnection(url,user,pwd);
			System.out.println("연결성공");
			
			String sql = "select * from pd2";
			ps = con.prepareStatement(sql);
			
			boolean bool = ps.execute();
			
			if(bool) {
				rs= ps.getResultSet();
				
				while(rs.next()) {
					int no = rs.getInt(1);
					String pdname = rs.getString(2);
					int price = rs.getInt(3);
					Timestamp regdate = rs.getTimestamp(4);
					
					System.out.println(no+ " " +pdname+ " " + price + " " +regdate);
					
				}
				
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(ps!=null) ps.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

4. 프로시저 이용

  • CallableStatement 이용
  • 오라클 : exec 프로시저명
  • 자바 : call 프로시저명
package com.jdbc.day2;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class ProcedureTest1 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("이름, 전화번호");
		String name = sc.nextLine();
		String tel = sc.nextLine();
		
		Connection con = null;
		CallableStatement cs = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩 성공");
			
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "javauser";
			String pwd = "javauser123";
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("접속 성공");
			
			String sql = "call personinsert(?, ?)";
			cs = con.prepareCall(sql);
			
			cs.setString(1, name);
			cs.setString(2, tel);
			
			
			boolean bool = cs.execute();
			System.out.println("실행결과 : "+bool);
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(cs!=null) cs.close();
				if(con!=null) con.close();
			
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
}

in,out 이 있는 프로시저

  • registerOutParameter 이용 out 받아오기
/* 프로시저 내용
create or replace procedure infoProf_proc
	(v_profno in professor.profno%type,
	v_name out professor.name%type,
	v_pay out professor.pay%type)
is
begin
	select name, pay into v_name, v_pay
	from professor
	where profno=v_profno;
end;
*/


public class ProcedureTest2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner (System.in);
		System.out.println("교수번호 입력");
		int profno = sc.nextInt();
		
		Connection con = null;
		CallableStatement cs = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩 성공");
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "javauser";
			String pwd = "javauser123";
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("연결 성공");
			
			
			String sql = "call infoprof_proc(?,?,?)";
			cs=con.prepareCall(sql);
			
			cs.setInt(1, profno);
			cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
			cs.registerOutParameter(3,oracle.jdbc.OracleTypes.NUMBER);
			
			boolean bool = cs.execute();
			System.out.println("bool = "+bool);
			
			String name = cs.getString(2);
			int pay = cs.getInt(3);
			System.out.println("이름 : " + name + ",급여 : "+pay);
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(cs!=null) cs.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

커서가 있는 프로시저

package com.jdbc.day2;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;

public class ProcedureTest3 {

	public static void main(String[] args) {
		/*
		 create or replace procedure personList
		(personCursor out SYS_REFCURSOR)
		is
		begin
		OPEN personCursor For
		select no,name,tel,regdate from person
		order by no desc;
		end;
		 */
		
		Connection con = null;
		CallableStatement cs = null;
		ResultSet rs = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로딩 성공");
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "javauser";
			String pwd = "javauser123";
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("연결 성공");
			
			String sql = "call personlist(?)";
			cs = con.prepareCall(sql);
			cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
			
			boolean bool = cs.execute();
			System.out.println(bool);
			
			rs=(ResultSet) cs.getObject(1);
			while(rs.next()) {
				int no = rs.getInt(1);
				String name = rs.getString(2);
				String tel = rs.getString(3);
				Timestamp regdate = rs.getTimestamp(4);
				
				System.out.println(no + " " + name + " " + tel + " " + regdate);
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(cs!=null) cs.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}