티스토리 뷰

DB/MyBatis

JDBC

xoo | 수진 2023. 8. 1. 23:39

Java DataBase Connectivity

 

 

📌 1. 개요

JDBC는 웹 환경이건 아니건 어떤 환경에서건 자바언어를 사용하는 경우에 DBMS 종류에 상관없이 데이터베이스에 접근할 수 있는 독립적인 프로그래밍 API이다.

 

 

 

📌 2. 특징

  • 벤더에서 제공해준 클래스 파일 (드라이버 Driver) 가 필요하다.
    압축파일(jar)로 제공한다. (압축풀면 안됨)
    RDBMS의 버전마다 다르다.
    C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
    실습 > ojdbc6_g.jar 

 

  • java.sql 패키지 사용  ==>  무조건 import 해야함
  • 비런타임 계열이기 때문에 무조건 예외처리 (try~catch, throws)가 필수이다.

 

 

 

📌 3. DB연동 순서  ★ 

    ① 이클립스에서 프로젝트 생성

 

    ② 오라클 드라이버( ojdbc6_g.jar ) 를 현재 생성한 이클립스 프로젝트에 알려줘야 된다.
      ==> 빌드패스 ( build path) 라고 부른다.

 

==> 오라클과 연동할 수 있는 환경설정 완료됨 !

 

 

 

   ③ 클래스 작성

 

 

   ④ 오라클 DB 연동하기 위한 4가지 정보를 문자열로 저장한다.

 String driver="oracle.jdbc.driver.OracleDriver";
ㅡ>  ojdbc6_g.jar 파일들 중에서 가장 핵심되는 클래스명을 지정한다.

String url="jdbc:oracle:thin:@localhost:1521:xe";
ㅡ> 관리자에서 show parameter db_name; 명령어로 서비스명(DB명) 확인한다.
ㅡ> 오라클 접속정보를 저장한다.

String userid="SCOTT";
ㅡ> 계정명

String passwd="TIGER";
ㅡ> 비밀번호

 

 

    ⑤ 드라이버 로딩 (OracleDriver 클래스 객체 생성 =  OracleDriver 클래스를 메모리에 로딩하는 작업
          ==>  new 사용 안하고 Class.forName (문자열);

Class.forName( driver );
try {
	Class.forName(driver);
} catch(ClassNotFoundException e) {
	System.out.println(e.getMessage());
    // e.printStackTrace();
}

 

 

    ⑥ Connection 맺기
         자바코드와 오라클 데이터베이스를 연결하는 것을 의미한다.
         연결은 java.sql 패키지의 Connection을 사용한다.
         DriverManager 클래스를 이용해서 Connection을 구한다.
         ==>  java.sql.Connection  ( new 불가!       왜? Connection은 인터페이스 )

Connection con = DriverManager.getConnection(url, userid, passwd);       // 다형성

         // 다형성
         // 인터페이스명 변수 = 하위클래스;
// 예외처리 추가한 코드

Connection con = null;
try{
	con = DriverManager.getConnection(url, userid, passwd);
}catch(SQLException e) {

}

 

 

    ⑥ SQL 문 작성 

          ==>  주의할 점은 마지막에 ; 사용안됨
          deptno 테이블의 데이터를 검색하기 위한 SQL 문

String sql = "select deptno as no, dname, loc from dept";

 

 

   ⑦ PreparedStatement 생성
        요청할 SQL 문을 전송 담당하는 객체   
       ==>  java.sql.PreparedStatement ( new 불가!       왜? PreparedStatement은 인터페이스 )
       ==> try~catch 필수

       ==> Connection을  사용해서 PreparedStatement을 생성한다.

       ==> Connection의 preparedStatement() 메서드를 이용해서 PreparedStatement를 생성할 수 있다.

try{
	PreparedStatement pstmt = con.prepareStatement(sql);
}catch()

 

 

  ⑧ SQL문 전송하기

  • select 문 전송
    ==> SELECT 요청은 executeQuery 메서드를 사용한다.

    ResultSet rs = pstmt.executeQuery();     // try~catch 필수

    테이블 결과를 자바의 객체로 표현한 것이 ResultSet 객체이다.
    ResultSet 객체는 포인터를 이용해서 원하는 데이터를 얻을 수 있다.
    먼저 포인터를 이용해 레코드를 선택하고
    나중에 포인터가 가리키는 레코드의 컬럼을 지정해서 데이터를 얻는다.

    레코드를 선택하는 메서드는 next() 메서드
    컬럼은 데이터형에 따라서 getInt("컬럼명|별칭|위치값")
                                               getString("컬럼명|별칭|위치값")

    ㅡ> 결과가 테이블로 반환된다.
    ㅡ> ResultSet 이 실제 select한 결과값을 참조한다.

         
          while(rs.next()){     // 행 선택
                 // 컬럼 선택 : rs.getInt(컬럼헤더값|순서), rs.getString(컬럼헤더값|순서)
           ...
          }

  • DML (insert/delete/update) 문 전송
    ==> DML 요청은 executeUpdate 메서드를 사용한다.
    ㅡ> 결과가 정수로 반환 ( 정수값: DML 적용된 레코드 갯수 )
ResultSet rs = pstmt.executeQuery();     // try~catch 필수
int num = pstmt.executeUpdate();     // try~catch 필수

 

 

결과값인 ResultSet에서 데이터를 얻는 방법

while( rs.next()){
 int deptno = rs.getInt("deptno");
 String dname = rs.getString("dname");
 String loc = rs.getString("loc");
 System.out.println( deptno +“ ” + dname + " " +loc );
 }
  • 결과값의 레코드가 여러 개 있을 수 있기 때문에 while 문을 사용
  • next() 메서드는 레코드가 있는 경우에는 true 값을, 없으면 false 값을 리턴

 

 

 

 

⑨ 사용했던 API ( Connection, PreparedStatement, ResultSet ) close

     - 역순으로 close ㅡ> close() 메서드 사용

     - finally 문 처리

    => try~catch 문 필수

    - null 오류가 나면 안되기 때문에 if절 입력

if( rs !=null) rs.close();           // ResultSet을 사용한 경우
if( stmt !=null) stmt.close();
if( con !=null) con.close();

 

 

 

 

출력문

 

 

 


 

 

SELECT

 

package jdbcStudy;

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

public class SelectTest {

	public static void main(String[] args) {

	// 1. 오라클 데이터베이스 연동을 위한 4가지 정보를 문자열에 저장	
		String driver="oracle.jdbc.driver.OracleDriver";
		String url="jdbc:oracle:thin:@localhost:1521:xe";
		String userid="SCOTT";
		String passwd="TIGER";
	
		
	//2. 드라이버 로딩	
		try {
			Class.forName(driver);
		} catch(ClassNotFoundException e) {
			//System.out.println(e.getMessage());
		     e.printStackTrace();
		}
		
		
	//3. Connection	( 오라클과 자바 연결 )
		Connection con = null;               // finally 쓰기 위해 블록 밖에서 작성
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try{
			con = DriverManager.getConnection(url, userid, passwd);
			String sql = "select deptno as no, dname, loc from dept";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery(); 
			while(rs.next()) {
				int deptno = rs.getInt("no");   // getInt(1) 가능
				String dname = rs.getString("dname");
				String loc = rs.getString("loc");
				System.out.println(deptno+"\t"+dname+"\t"+loc);
			}
			
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				//역순
				if(rs != null)rs.close();
				if(pstmt != null)pstmt.close();
				if(con != null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
		
		
		
	}//end main

}

 

 

 

 

 


 

 

INSERT

 

package jdbcStudy;

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

public class InsertTest {

	public static void main(String[] args) {

	// 1. 오라클 데이터베이스 연동을 위한 4가지 정보를 문자열에 저장	
		String driver="oracle.jdbc.driver.OracleDriver";
		String url="jdbc:oracle:thin:@localhost:1521:xe";
		String userid="SCOTT";
		String passwd="TIGER";
	
		
	//2. 드라이버 로딩	
		try {
			Class.forName(driver);
		} catch(ClassNotFoundException e) {
			//System.out.println(e.getMessage());
		     e.printStackTrace();
		}
		
		
	//3. Connection	( 오라클과 자바 연결 )
		Connection con = null;               // finally 쓰기 위해 블록 밖에서 작성
		PreparedStatement pstmt = null;

		try{
			con = DriverManager.getConnection(url, userid, passwd);
			String sql = "insert into dept ( deptno, dname, loc) "
					+ " values( ?, ?, ? )";    // ?는 바인딩 변수로서 나중에 값을 설정한다.
		pstmt = con.prepareStatement(sql);   // ★	
			// ? 대신에 값 설정하기
			/*
			 * pstmt.setXXX(?의위치, 값)
			 * 
			 */
			pstmt.setInt(1, 12);    // 첫번째 물음표는 deptno라서 정수 : Int
			pstmt.setString(2, "개발");
			pstmt.setString(3, "서울");
			
			int num = pstmt.executeUpdate(); 
			System.out.println("레코드 생성 갯수:" + num);
			
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				//역순
				if(pstmt != null)pstmt.close();
				if(con != null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
	}//end main

}

 

 

 


 

 

UPDATE

 

package jdbcStudy;

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

public class UpdateTest {

	public static void main(String[] args) {

	// 1. 오라클 데이터베이스 연동을 위한 4가지 정보를 문자열에 저장	
		String driver="oracle.jdbc.driver.OracleDriver";
		String url="jdbc:oracle:thin:@localhost:1521:xe";
		String userid="SCOTT";
		String passwd="TIGER";
	
		
	//2. 드라이버 로딩	
		try {
			Class.forName(driver);
		} catch(ClassNotFoundException e) {
			//System.out.println(e.getMessage());
		     e.printStackTrace();
		}
		
		
	//3. Connection	( 오라클과 자바 연결 )
		Connection con = null;               // finally 쓰기 위해 블록 밖에서 작성
		PreparedStatement pstmt = null;

		try{
			con = DriverManager.getConnection(url, userid, passwd);
			String sql = "update dept set dname=?, loc=? where deptno=?"; 
					    // ?는 바인딩 변수로서 나중에 값을 설정한다.
			pstmt = con.prepareStatement(sql);  
			// ? 대신에 값 설정하기
			/*
			 * pstmt.setXXX(?의위치, 값)
			 * 
			 */
			pstmt.setInt(3, 12);    // deptno 값은 중복되지 않도록 확인할것.
			pstmt.setString(1, "개발부");
			pstmt.setString(2, "서울시");
			
			int num = pstmt.executeUpdate(); 
			System.out.println("레코드 수정 갯수:" + num);
			
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				//역순
				if(pstmt != null)pstmt.close();
				if(con != null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
	}//end main

}

 

 

 

 

 


 

 

 

DELETE

package jdbcStudy;

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

public class DeleteTest {

	public static void main(String[] args) {

	// 1. 오라클 데이터베이스 연동을 위한 4가지 정보를 문자열에 저장	
		String driver="oracle.jdbc.driver.OracleDriver";
		String url="jdbc:oracle:thin:@localhost:1521:xe";
		String userid="SCOTT";
		String passwd="TIGER";
	
		
	//2. 드라이버 로딩	
		try {
			Class.forName(driver);
		} catch(ClassNotFoundException e) {
			//System.out.println(e.getMessage());
		     e.printStackTrace();
		}
		
		
	//3. Connection	( 오라클과 자바 연결 )
		Connection con = null;               // finally 쓰기 위해 블록 밖에서 작성
		PreparedStatement pstmt = null;

		try{
			con = DriverManager.getConnection(url, userid, passwd);
			String sql = "delete from dept where deptno=?"; 
					    // ?는 바인딩 변수로서 나중에 값을 설정한다.
			pstmt = con.prepareStatement(sql);  
			// ? 대신에 값 설정하기
			/*
			 * pstmt.setXXX(?의위치, 값)
			 * 
			 */
			pstmt.setInt(1, 12);    // deptno 값은 중복되지 않도록 확인할것.
			
			int num = pstmt.executeUpdate(); 
			System.out.println("레코드 삭제 갯수:" + num);
			
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				//역순
				if(pstmt != null)pstmt.close();
				if(con != null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
	}//end main

}

 

 

 


  • JDBC의 DML 작업은 자동커밋된다.
  • 자동커밋을 트랜잭션 이슈 때문에 비활성화 가능 
  • 명시적으로 커밋하도록 변경 가능

 


 

 

 

 

'DB > MyBatis' 카테고리의 다른 글

Mybatis - 조건문  (0) 2023.08.07
Mybatis - Dynamic SQL  (0) 2023.08.07
Mybatis - 환경설정 및 SELECT 예제  (0) 2023.08.04
트랜잭션(Transaction) 처리  (0) 2023.08.03
DAO(Data Access Object) Pattern  (0) 2023.08.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함