ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 002. JDBC 사전 설정, JDBC 프로그래밍 절차, Eclipse 사용법
    SsY/Class 2023. 4. 21. 17:49
    728x90
    JDBC 사전설정 및 주의사항
    • 사전설정
    • 해당 워크스테이션에 오라클이 설치된 경우(학습 환경)
      - 시스템의 classpath 를 다음과 같이 생성 및 변경

        (11g Express Edition 설치 경로가 C:\oraclexe 인 경우...)
        .;C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar

        (10g Enterprise Edition / Standard Edition 설치 경로가 C:\oracle 인 경우...)
        .;C:\oracle\product\10.x.x\jdbc\lib\ojdbc14.jar
                                        --------             -----------
                                       (버전명)         (버전에 따라 이름이 다를 수 있음 - java.sun.com 에서 파일이름 넣고 호환성 확인)
    더보기
    .;C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar

    .; (세미콜론은 구분자 역할)(오라클 설치경로)\(파일명)
    ※ 환경변수 설정시 경로까지만 넣는데, 클래스 패스 설정 시 왜 파일명까지 넣을까?
    - 해당 압축파일까지 정해주는 이유는 jar 이라는 파일이 자바로 압축되어있는 상태고
       파일 안의 class 들을 java가 건드릴 수 있게 하기 위해서 
    ※ 클래스 패스 설정
     - 환경변수와 같이 class 를 찾을 때 해당 위치에 없다면, 
        클래스패스 라는 것을 확인해서 클래스를 찾아봐 달라는 의미

    클래스 패스 찾기
    있으면? -> 환경 변수와 같이 경로 수정하기
    없으면? -> 새 시스템 변수 추가(생성)하기

    classpath 변수 이름은 대소문자구분 x

    • 해당 워크스테이션에 오라클이 설치되어 있지 않은 경우(실무 환경)
      - Oracle 용 JDBC 드라이버를 다운로드 해야 한다.
      가. 다운로드 경로 및 절차
             ① https://www.oracle.com/database/technologies/appdev/jdbc-drivers-archive.html
             ② 해당 페이지에서 상황 및 환경에 적합한 항목의 JDBC Driver 다운로드
             ※ 현재 우리에게 적합한 버전의 ojbdc6.jar 파일 없음~!!!
                → 기존 오라클 설치 경로에서 찾아 별도로 보관
      나. 파일명

            『ojdbc6.jar』 또는 『ojdbc14.jar』 또는 『ojdbc8.jar』 파일 등
            『ojdbcXX.jar』 파일
       
            다. 시스템의 classpath 에 변수값으로 ojdbcXX.jar 파일 추가
                 (경로 포함)

    더보기

      최신버전이 잘 안팔리니까 구버전 드라이버를 숨겨놓고 안보이게 하는 경우가 많다고 한다. 
    오라클 > 제품 > 전체소프트웨어 > (맨아래)(기술관련자료 배너) 제품다운로드 \ 자세히알아보기 > 개발자다운로드\드라이버 및 유틸리티 > jdbc 드라이버 (여기 까지 왔는데 본인이 봐야할 자료가 안보인다면 (... 없다고 합니다)

    • 공통
        - JDBC 드라이버 설치를 위한 ojdbc.jar 파일을
           다음의 경로에 복사 & 붙여넣기

          가. C:\Program Files\Java\jdk1.8.0_351\jre\lib\ext
          나. C:\Program Files\Java\jre1.8.0_351\lib\ext

    • JSP & Servlet 실습을 위한 추가 설정
        - 웹 서버에서 실질적으로 Oracle 용 JDBC 드라이버를 찾는 경로는
          『아파치톰캣루트\lib』 이므로 ojdbc6.jar 파일을
          이 경로에 복사 & 붙여넣기 할 수  있도록 한다.

        - 아파치톰캣 다운로드 경로 → http://tomcat.apache.org/
    더보기

    다운받은 파일 압축해제 후 C 드라이브 루트에 붙여넣고 
    C:\apache-tomcat-8.5.88\lib
    해당 경로에 ojdbc6.jar 파일 붙여넣기


    Eclipse 실습
    • Eclipse 환경 설정
      - javaEE 환경에서 실행
    더보기

    Daynamic Web project

    next > next > finish
    다음부터는 next 없이 finish 로만 설정해도 됨

    다른 라이브러리에 들어가있는것처럼 보인다면 F5를 눌러 새로고침하면 원래대로 돌아온다

    (왼) 논리적 경로 / (오) 물리적 경로
    폰트설정
    블레이스 개행 처리하기
    java 파일 UTF-8 로 저장
    먼저  같은 바인딩 중 하나 클릭해서 unbind > 이후 설정해줄 커맨드 클릭후 아래 바인딩에서 키 누르기 Ctrl + D -> 
    • 자동 완성 기능. 어휘의 자동완성(Content Assistance) --// 인텔리센스 // (클래스패스 변수 설정 해둬야 사용 가능)
      - Ctrl + Spacebar 
      - 만약 해당 기능을 사용하지 않아 import 구문이 적용 되지않았다면 Ctrl + Shift + O 를 통해서 import 구문 적용
        또는 해당 키워드로 가서 다시 Ctrl+Space 하면 import 구문을 적용시킬 수 있다.

    ⊙ 주석처리 Ctrl + Shift + /
    ⊙ 주석해제 Ctrl + Shift + \


    • DBConn.java
      - 패턴 : 프로그램을 설계하는 과정에서 모듈들이 어떤 구조를 취해야하는지에 대한 정의 
      - 리소스 소모를 줄이기 위해서 DB를 연결하는 모듈은 하나 만들어두고 사용
    /*==================
       DBConn.java
    ===================*/
    
    /*
    ※ 싱클톤 (Singleton) 디자인 패턴을 이용한 Database 연결 객체 생성 전용 클래스
       → 애플리케이션을 활용하여 서비스를 이용하는 과정에서 DB 연결 과정이 가장 부하가 크기 때문에
          한 번 연결된(생성된) 객체를 계속 사용하는 것이 좋다. 
          ex) 식당 외부 화장실 이용하기 위해서 >> 키 << 를 사용하는데
              화장실 가려고 할 때마다 매번 키를 만들어서 가는건... 문제가 있다!
    */
    
    package com.util;
    
    import java.sql.Connection;		// 클래스 변수 설정을 해두었기 때문에 바로 입력 가능 함
    import java.sql.DriverManager;
    
    public class DBConn 
    {
    	// 변수 선언
    	private static Connection dbConn;
        // 정보은닉 + 공유 + 데이터타입 + 데이터명
        //-- 자동 null 초기화
    	
        // 메소드 정의 → 연결
        // 외부에서 호출할 때 DBConn.getConnection(); -- 커넥션을 반환함, 그 이름이 DBConn 임
    	public static Connection getConnection()
    	{
        	// 한 번 연결된 객체를 계속 사용
    		// 즉, 연결되지 않은 경우에만 연결을 시도하겠다는 의미
    		// → 싱글톤(디자인패턴)
    		if (dbConn == null)	// 연결되어 있지 않을 때
    		{
    			try
    			{
    				String url = "jdbc:oracle:thin:@localhost:1521:xe";
    				//-- 『211.238.142.XX』 은 오라클 서버 ip 주소를 기재하는 부분
    				//    원격지의 오라클이 아니라 로컬 오라클 서버일 경우는
    				//    『localhost』나 『127.0.0.1』 과 같이 loop back address 로 기재하는 것도 가능
    				//    『1521』 은 오라클 리스너 기본 Port Number
    				//    『xe』 는 오라클 SID(eXpress Edition 은 xe) 
    				
    				String user = "scott";	//-- 오라클 사용자 계정 이름
    				String pwd = "tiger";	//-- 오라클 사용자 계정 암호
    				
    				Class.forName("oracle.jdbc.driver.OracleDriver");	// 쓸수 있는 환경이라는 것을 확인하는 것
    				//-- OracleDriver 클래스에 대한 객체 생성
    				
    				dbConn = DriverManager.getConnection(url, user, pwd);
    				//-- 오라클 서버 실제 연결
    				//   갖고있는 인자값(매개변수)은 오라클주소, 계정명, 패스워드
         			//   위 (line 36 ~ 46)는... 연결을 위한 환경을 설정하는 과정
    				
    			} catch (Exception e)	// ClassNotFoundException, SQLException
    			{
    				System.out.println(e.toString());
    				//-- 오라클 서버 연결 실패 시 오류 메세지 출력 부분
    			}
    		} 
    		
    		return dbConn;
    		//-- 구성된 연결 객체 반환
    		
    	}
        
    	// getConnection() 메소드의 오버로딩 → 연결
    	public static Connection getConnection(String url, String user, String pwd)
    	{
    		if (dbConn == null)
    		{
    			try
    			{
    				Class.forName("oracle.jdbc.driver.OracleDriver");
    				//-- OracleDriver 클래스에 대한 객체 생성
    				
    				dbConn = DriverManager.getConnection(url, user, pwd);
    				//-- 오라클 서버 실제 연결
    				
    			} catch (Exception e)
    			{
    				System.out.println(e.toString());
    			}
    			
    		}
    		
    		return dbConn;
    		
    	}
    	
    	// 메소드 정의 → 연결 종료
    	public static void close()
    	{
    		// dbConn 변수(멤버 변수)는
    		// Database 가 연결된 상태일 경우 Connection 을 갖는다.
    		// 즉, 이 상태일  때는 null 이 아니다.
    		// 연결되지 않은 상태라면 null 인 상황이 된다. 
    		if (dbConn != null)
    		{
    			try
    			{
    				// 연결 객체(Connection)의 『isClosed()』 메소드를 통해 연결상태 확인 
    				//-- 연결이 닫혀있는 경우 true 반환
    				//   연결이 닫혀있지 않은 경우 false 반환
    				if (!dbConn.isClosed())
    				{
    					dbConn.close();
    					//-- 연결 객체(Connection)의 『close()』메소드 호출을 통해 연결 종료
    				}
    				
    			} catch (Exception e)
    			{
    				System.out.println(e.toString());
    			}
    		}
    		
    		// 연결 객체 초기화
    		dbConn = null;
    }

    • Test001.java
      - com.test 에 test.java 파일들 생성

    /*=============================================
     	Test001.java
    	- Database 연결 테스트
    	- main() 메소드를 포함하는 테스트 클래스
    ==============================================*/
    
    package com.test;
    
    import java.sql.Connection;
    
    import com.util.DBConn;
    
    public class Test001
    {
    	public static void main(String[] args)
    	{
    		Connection conn = DBConn.getConnection();
    		
    		if (conn != null)
    		{
    			System.out.println("데이터베이스 연결 성공~!!!");
    		}
    		
    		DBConn.close();
    		//-- close() 메소드 호출을 통해 연결 종료
    	}
    	
    }

    Ctrl 누른채로 화면을보면 링크가 생기고 누르면 해당 메소드로(즉, DBConn) 연결이 되게 된다.


    • Test002

    main 메소드를 만들 때 아래 체크 박스를 클릭하고 생성하면 메인메소드도 같이 생성 됨

    이클립스에서 주의하라고 표시해주는 것
    ex) 쓰이지 않는 변수 선언 등

    /*============================================
    	Test002.java
    	- 데이터 입력 실습 진행
    	- main() 메소드를 포함하는 테스트 클래스
    =============================================*/
    	
    package com.test;
    
    import java.sql.Connection;
    import java.sql.Statement;
    
    import com.util.DBConn;
    
    public class Test002
    {
    	public static void main(String[] args)
    	{
    		// 연결 객체 준비
    		Connection conn = DBConn.getConnection();
    		
    		if (conn == null)
    		{
    			System.out.println("데이터베이스 연결 실패~!!!");
    			System.exit(-1);
    		}
    		
    		//System.out.println("데이터베이스 연결 성공~!!!");
    		
    		try
    		{
    			Statement stmt = conn.createStatement();
    			
    			String sql = "";
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    
    	}
    
    }

    ※ class 파일이 없는 데 프로그램이 실행되는가?
    → 이클립스는 IDE(통합개발환경)로 class 파일(배포용)을 별도로 분류하여 build 폴더로 보관하게 되고
         Ctrl + S (저장) 하게 되면 컴파일을 자동으로 해준다.

    만약 업데이트를 했는데 저장을 안했다면 위와 같은 표시가 나오면서 컴파일 되지 않았음을 알려주게된다.


    SQL

    이름설정 및 저장 폴더

    더보기

    일반 윈도우 등에서 DELETE 나 삭제를 누르게 되면 -> 휴지통으로 들어가게 되는것
    SHIFT 와 함께 DELETE 나 삭제를 누르게 되면 -> 휴지통을 거치지 않고 삭제 (운영체제 내에서 복구 불가)

    PURGE 를 붙여 삭제하게 되면 SHIFT 와 함께 누른것 과 같은 기능을 한다.
    즉, BIN$~ 파일이 생성되지 않음!

    --○ 실습 테이블 생성(TBL_MEMBER)
    CREATE TABLE TBL_MEMBER
    ( SID   NUMBER
    , NAME  VARCHAR2(30)
    , TEL   VARCHAR2(40)
    , CONSTRAINT MEMBER_SID_PK PRIMARY KEY(SID)
    );
    --==>> Table TBL_MEMBER이(가) 생성되었습니다.
    
    --// JDBC 실습을 하는 동안
    --// 이클립스에서 SQL 구문이 필요한경우 꼭 SQL DEVELOPER 로 실행하여 입력한다.
    --// SQL DEVELOPER 상에서는 세미콜론을 아래줄에 내려서 쓴다.
    --// SQL DEVELOPER 에서는 세미콜론 필요, 이클립스에서는 세미콜론이 붙으면 오류남
    --// 이클립스를 통해서 자바에서 쿼리문 구성해서 넘기게 되면 자동 커밋하게 됨
    --// SQL DEVELOPER 에서 커밋을 제대로 하지 않게 되면 무한루프에 빠지는 등 오류 무조건 발생됨
    
    --○ 데이터 입력 쿼리문 구성
    INSERT INTO TBL_MEMBER(SID,NAME,TEL) VALUES(1,'별희강','010-1111-1111')
    ;
    --==>> 1 행 이(가) 삽입되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_MEMBER;
    --==>> 1	별희강	010-1111-1111
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.

    Eclipse

    /*============================================
    	Test002.java
    	- 데이터 입력 실습 진행
    	- main() 메소드를 포함하는 테스트 클래스
    =============================================*/
    	
    package com.test;
    
    import java.sql.Connection;
    import java.sql.Statement;
    
    import com.util.DBConn;
    
    public class Test002
    {
    	public static void main(String[] args)
    	{
    		// 연결 객체 준비
    		Connection conn = DBConn.getConnection();
    		
    		if (conn == null)
    		{
    			System.out.println("데이터베이스 연결 실패~!!!");
    			System.exit(-1);
    		}
    		
    		//System.out.println("데이터베이스 연결 성공~!!!");
    		
    		try
    		{
    			Statement stmt = conn.createStatement();
    			
    			// 데이터 입력 쿼리 실행 과정
    			// 한 번 실행하면(입력하면) 다시 실행하지 못한다.
    			// 왜? 기본키 제약조건이 설정되어 있으므로...
    			
    			String sql = "INSERT INTO TBL_MEMBER(SID,NAME,TEL) VALUES(2,'수인주','010-2222-2222')";
    			// -- 주의. 쿼리문 끝에 『;』 붙이지 않는다.
    			// -- 주의. 자바에서 실행한 DML 구문은 내부적으로 자동 COMMIT 된다.
    			// -- 주의. 오라클에서 트랜잭션 처리가 끝나지 않으면
    			//          데이터 액션 처리가 이루어지지 않는다.
    			//          (즉, 오라클에서 직접 쿼리문을 실행하여 테스트할 경우
    			//            COMMIT 또는 ROLLBACK 을 반드시 수행할 수 있도록 한다.)
    			
    			int result = stmt.executeUpdate(sql);
    			
    			if (result > 0)
    			{
    				System.out.println("데이터 입력 성공~!!!!");				
    			}
    			else 
    			{
    				System.out.println("데이터 입력 실패~ ㅠ_ㅠ");
    			}
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    
    		DBConn.close();
    		
    	}
    
    }


    •  JDBC 프로그래밍 절차

    1. 드라이버 로딩
        Class.forname() 
        → Oracle Driver 를 Java 에서 사용하기 위해 드라이버를 JVM 에 로딩하는 과정.

    2. 커넥션 할당받기
        --// 자바에서는 『연결』도 하나의 객체임 
        DriverManager.getConnection()

    3. 쿼리문 전송을 위한 작업 객체 할당받기
        Statement 또는 PreparedStatement 할당받기
        conn.createStatement() 또는 conn.prepareStatement()

    4. 작업 객체를 활용하여 쿼리문 전송
        ⊙ DML(INSERT, UPDATE, DELETE)문인 경우
           [ int updateCount =] stmt.executeUpdate()
            → 영향을 받은레코드의 수(적용된 행의 갯수) 반환
            --// 변경이 일어날 때, 반환받는 이유는 제대로 적용되었는지 확인하기 위해서
            --// 반환받지 않아도 상관은 없음!
        ⊙ Select 문인 경우
            ResultSet rs = stmt.execureQuery()
            → 결과 집합의 형태로 ResultSet 반환
            --// 결과 집합의 형태로 반환받음(조회 결과가 단일값일일수도 복수일수도 있기 때문)

    5. (select 구문의 경우) ResultSet 의 논리적 커서 이동을 통해 각 컬럼의 데이터를 바인딩 해 온다.
         boolean b = rs.next();
         → 커서 이동.
              커서가 위치한 지점에 레코드가 존재하면 true 를 반환, 없으면 false 를 반환.
              커서는 가장 선두 첫 번재 레코드의 직전에 위치하고 있다가
              『next()』가 호출되면 진행한다.

    6. 사용을 마친 리소스 반납 
          
    rs.close();            → ResultSet 을 사용했을 경우
          stmt.close();        → Statement 를 사용했을 경우
          DBConn.close();
         ( null 체크하여 close() 해주는 것을 권장.
           finally 블럭에서 구현하는 것을 권장.)


    Eclipse

    /*============================================
    	Test002.java
    	- 데이터 입력 실습 진행
    	- main() 메소드를 포함하는 테스트 클래스
    =============================================*/
    	
    package com.test;
    
    import java.sql.Connection;
    import java.sql.Statement;
    
    import com.util.DBConn;
    
    public class Test002
    {
    	public static void main(String[] args)
    	{
    		// 연결 객체 준비
    		Connection conn = DBConn.getConnection();
    		
    		if (conn == null)
    		{
    			System.out.println("데이터베이스 연결 실패~!!!");
    			System.exit(-1);
    		}
    		
    		//System.out.println("데이터베이스 연결 성공~!!!");
    		
    		try
    		{
                //작업객체 생성 -- 작업객체를 얻어내겠다
    			Statement stmt = conn.createStatement(); 
    			
    			// 데이터 입력 쿼리 실행 과정
    			// 한 번 실행하면(입력하면) 다시 실행하지 못한다.
    			// 왜? 기본키 제약조건이 설정되어 있으므로...
    			
                // 쿼리문 준비
    			String sql = "INSERT INTO TBL_MEMBER(SID,NAME,TEL) VALUES(2,'수인주','010-2222-2222')";
    			// -- 주의. 쿼리문 끝에 『;』 붙이지 않는다.
    			// -- 주의. 자바에서 실행한 DML 구문은 내부적으로 자동 COMMIT 된다.
    			// -- 주의. 오라클에서 트랜잭션 처리가 끝나지 않으면
    			//          데이터 액션 처리가 이루어지지 않는다.
    			//          (즉, 오라클에서 직접 쿼리문을 실행하여 테스트할 경우
    			//            COMMIT 또는 ROLLBACK 을 반드시 수행할 수 있도록 한다.)
    			
                // 작업객체를 실행하는데 dml 구문이기 때문에 stmt.executeUpdate() 사용
                // 작업 객체 실행 및 쿼리문 전달 -- (오라클에게 작업객체가)
    			int result = stmt.executeUpdate(sql);
    			//-- 적용된 행의 갯수 반환
    			
    			if (result > 0)
    			{
    				System.out.println("데이터 입력 성공~!!!!");				
    			}
    			else 
    			{
    				System.out.println("데이터 입력 실패~ ㅠ_ㅠ");
    			}
    			
    		} catch (Exception e)
    		{
    			System.out.println(e.toString());
    		}
    
    		// 연결이 되어 있는 상태이기 때문에 DBConn 의 해당 메소드가 실행 됨
            DBConn.close();
    	}
    
    }

    • Test003
    /*================================================
    	Test003.java
    	- 데이터 입력 실습 진행
    	- main() 메소드를 포함하는 테스트 클래스
    ==================================================*/
    /*
    ○	JDBC 프로그램의 작성
    
     	1. 드라이버 인스턴스 생성
     	   사용할 파일들(데이터베이스와의 연결 과정에서 사용될 파일들)이 있는지 확인한다.
     	   이 과정에서는 굳이 인스턴스를 생성하지 않고,
     	   드라이버가 있는지만 확인하더라도
     	   프로그램을 실행하는 데에는 지장이 없다.
     	   
     	   ※ 드라이버 설계도(클래스)를 찾는 방법
     	      『Class』라는 클래스의 『forName()』 메소드를 사용.
     	      이 메소드는 매개변수로 넘겨받은 이름의 클래스를 찾아주는 역할을 수행하며
     	      해당 클래스를 찾지 못할 경우 『ClassNotFoundException』 예외를
     	      발생시키게 된다. 	 
     	 
    	2. 연결 객체 생성
    	   (『Class.forName()』을 활용하여...) 찾은 드라이버 클래스를 가지고
    	     설치된 데이터베이스 서버와 연결하는 Connection 객체를 생성한다.
             // 클래스라는 이름을 가진 클래스 의 forName() 이라는 메소드
    	     
    	   ※ Connection 객체는 DriverManager 클래스의
    	     『getConnection』이라는 static 메소드로 생성한다.
    	     예외는 데이터베이스 서버와 연결을 수행하는 과정에서 문제가 있을 경우 발생하게 되며
    	     『SQLException』 예외를 발생시키게 된다.
    	          
    	3. 작업 객체 생성
    	   연결된 포트를 통해 질의문을 보낼 수 있도록 도와주는 객체를 생성한다.
    	   자바에서는 크게 세 가지 방법으로 질의를 처리한다.
    	   
    	   1) Statement 객체 생성
    	      정적 질의를 처리할 때 주로 사용
    	      
    	   2) PreparedStatement 객체 생성
    	      동적 질의를 처리할 때 주로 사용
    	      
    	   3) CallableStatement 객체 생성
    	      프로시저나 함수를 호출할 수 있도록 사용     
    */
    package com.test;
    
    import java.sql.Connection;
    import java.sql.Statement;
    import java.util.Scanner;
    
    import com.util.DBConn;
    
    public class Test003
    {
    	public static void main(String[] args)
    	{
    		// Scanner 인스턴스 생성
    		Scanner sc = new Scanner(System.in);		
    		// 연결 객체 생성
    		Connection conn = DBConn.getConnection();
    				
    		do
    		{
    			// 사용자에게 안내 메세지 출력
    			System.out.print("번호를 입력하세요(-1 종료) : ");
    			String sid = sc.next();
    			
    			// 반복의 조건을 무너뜨리는 코드 구성
    			if (sid.equals("-1"))
    			{
    				break;
    			}			
    			System.out.print("이름을 입력하세요 : ");
    			String name  = sc.next();			
    			System.out.print("전화번호를 입력하세요 : ");
    			String tel = sc.next();
                
    			// 데이터베이스 연결이 정상적으로 이루어졌을 경우 업무 수행
    			if (conn != null)
    			{
    				System.out.println(">> 데이터베이스 연결 성공~!!!!");				
    				try
    				{
    					// 작업 객체 생성
    					Statement stmt = conn.createStatement();					
    					// 쿼리문 준비
    					String sql = String.format("INSERT INTO TBL_MEMBER(SID,NAME,TEL) VALUES(%s,'%s','%s')"
    							                 , sid, name, tel);
    					//-- "INSERT INTO TBL_MEMBER(SID,NAME,TEL) VALUES(%s,'%s','%s')"
                        /*
                        sid 는 NUMBER 타입으로 만들었는데 왜 %s 로 받아오는지?
                        String 타입으로 했기 때문에
                        Oracle 에 왜 문자열타입으로 건네주는가?
                        『VALUES(%s,'%s','%s')』에 ('') 홑따옴표로 감싸주지 않았기 때문에
                        values(3,'기배리','010-3333-3333') 으로 넘어가게 되기 때문에 oracle 에서는 숫자로 인식하게 된다
                        */
    					
    					// 데이터베이스로부터 질의 결과를 가져와야 하는 경우
    					// → 『executeQuery()』 메소드 사용.
    					// 특정 내용을 데이터베이스에 적용해야 하는 경우
    					// → 『executeUpdate()』 메소드 사용.					
    					int result = stmt.executeUpdate(sql);
    					//-- 적용된 행의 갯수 반환
    					
    					// 정상 처리되었는지 확인
    					if (result > 0)
    						System.out.println(">> 회원 데이터가 입력되었습니다.");					
    				} catch (Exception e)
    				{
    					System.out.println(e.toString());
    				}
    			}			
    		} while (true);
    		sc.close();		// Scanner 도 리소스이기 때문에 반납 가능. 
                            // 단, 프로그램 종료함과 동시에 리소스들은 모두 반납되므로 써주지 않아도 되긴 함.		
    		DBConn.close();		
    		System.out.println(">> 데이터베이스 연결 닫힘~!!!");
    		System.out.println(">> 프로그램 종료됨~!!!");		
    	}
    }

    println 수정 안해서 개행되어 입력되게 됨 -> 위의 코드는 수정 된 것


    • Test004

    커서를 살짝 올려서 보이면 이와 같이 앞쪽에 반환 자료형이 표시 된다!

    /*================================================
    	Test004.java
    	- select 쿼리문 전송 및 결과 수신 실습
    	- main() 메소드를 포함하는 테스트 클래스
    ==================================================*/
    
    package com.test;
    
    import java.sql.Connection;
    import java.sql.Statement;
    
    import com.util.DBConn;
    
    public class Test004
    {
    	public static void main(String[] args)
    	{
    		//데이터베이스 연결 객체 생성
    		Connection conn = DBConn.getConnection();
    		
    		if (conn != null)
    		{
    			System.out.println("데이터베이스 연결 성공~!!!");
    			
    			try
    			{
    				// 작업 객체 생성
    				Statement stmt = conn.createStatement();
    				
    				// 쿼리문 준비
    				String sql;
    				
    			} catch (Exception e)
    			{
    				// TODO: handle exception
    			}
    		}
    	}
    }

    SQL DEVELOPER


    Eclipse

    /*================================================
    	Test004.java
    	- select 쿼리문 전송 및 결과 수신 실습
    	- main() 메소드를 포함하는 테스트 클래스
    ==================================================*/
    
    package com.test;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    import com.util.DBConn;
    
    public class Test004
    {
    	public static void main(String[] args)
    	{
    		//데이터베이스 연결 객체 생성
    		Connection conn = DBConn.getConnection();		
    		if (conn != null)
    		{
    			System.out.println("데이터베이스 연결 성공~!!!");			
    			try
    			{
    				// 작업 객체 생성
    				Statement stmt = conn.createStatement();				
    				// 쿼리문 준비
    				String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY 1";				
    				// 작업 객체를 활용하여 쿼리문 수행
    				ResultSet rs = stmt.executeQuery(sql);
    				
    				// executeQuery() 메소드를 사용하면
    				// 질의 결과를 ResultSet 객체로 가져올 수 있다.
    				// 하지만, ResultSet 객체가 질의에 대한 결과물 모두를
    				// 한꺼번에 다 받아서 가지고 있는 구조가 아니다.
    				// 단지, 데이터베이스로부터 획득한 질의 결과물에 대한
    				// 관리가 가능한 상태가 되는 것일 뿐이다.
    				// 이 때문에...
    				// ResultSet 을 수신했다고 해서
    				// 데이터베이스와의 연결을 끊게 되면
    				// ResultSet 객체는 더 이상 질의 결과를 관리할 수 없게 된다.
    								
    				// ※ 반복문을 활용한 ResultSet 컨트롤(제어) 
    				//    → ResultSet 의 『next()』 / 『getXxx()』
    				
    				// 처리해야 할 데이터가 있는지 없는지 확인하는 역할을 수행하는 것은 next() 메소드
    				while (rs.next())	// true	/ true / true / true / false
    				{
    					// 레코드에서 결과값을 가져오는 역할을 수행하는 것은 getXxx() 메소드
    					//-- Xxx 는 데이터 타입을 의미 getInt(), getDouble(), getString()...
    					// String sid = rs.getString("SID");
    					int sid = rs.getInt("SID");
    					String name = rs.getString("NAME");
    					String tel = rs.getString("TEL");					
    					String str = String.format("%3d %8s %12s", sid, name, tel);					
    					System.out.println(str);				
    				}
    				rs.close();		//-- 결과집합 리소스 반납				
    				stmt.close();	//-- 작업 객체 리소스 반납			
    			} catch (Exception e)
    			{
    				System.out.println(e.toString());
    			}
    		}// end if		
    		DBConn.close();			//-- 연결 객체 리소스 반납		
    		System.out.println(">> 데이터베이스 연결 닫힘~!!!");
    		System.out.println(">> 프로그램 종료됨~!!!");	
    	}
    }
    
    // 실행 결과
    
    /*
    데이터베이스 연결 성공~!!!
      1      별희강 010-1111-1111
      2      수인주 010-2222-2222
      3      기배리 010-3333-3333
      4      하경최 010-4444-4444
    >> 데이터베이스 연결 닫힘~!!!
    >> 프로그램 종료됨~!!!
    */

    Ctrl+Space 시 보이는 아이콘들의 의미

    728x90
Designed by planet-si