[JDBC]/Program source (JDBC)

JDBC 20231121 [프로그래밍 소스] - Test004(해설), Test005, Test006 테이블 내의 데이터 읽어오기 (rs.next(), executeQuery, rs.getString(), rs.getInt())

Jelly-fish 2023. 11. 21. 11:24

Test004.java

/*=========================
	    Test004.java
===========================*/

// 실행 예)
// 번호를 입력하세요(-1 종료) : 3
// 이름을 입력하세요 : 박나영
// 전화번호를 입력하세요 : 010-3333-3333
// >> 데이터베이스 연결 성공~!!!
// >> 회원 정보가 입력되었습니다.

// 번호를 입력하세요(-1 종료) : 4
// 이름을 입력하세요 : 정현욱
// 전화번호를 입력하세요 : 010-4444-4444
// >> 데이터베이스 연결 성공~!!!
// >> 회원 정보가 입력되었습니다.

// 번호를 입력하세요(-1 종료) : 5
// 이름을 입력하세요 : 김민지
// 전화번호를 입력하세요 : 010-5555-5555
// >> 데이터베이스 연결 성공~!!!
// >> 회원 정보가 입력되었습니다.

// 번호를 입력하세요(-1 종료) : -1
// >> 데이터베이스 연결 닫힘~!!
// >> 프로그램 종료됨~!!!


package com.test;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import com.util.DBConn;

public class Test004
{
	
	// [선생님 풀이!!]▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
	// *『선생님의 Tip』 : 콘솔창에 한글 입력할 땐, 마우스로 커서를 맨 끝을 클릭하고 작성하세요.
	//                     영문, 숫자의 경우는 상관 없다~
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException
	{
		// ※ 『스캐너에 대한 리소스를 사용하고 반납(close())하지 않으면』
		//    『노란색 느낌표가 발생한다.』
		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
				{
					// 작업 객체 준비
					
					// (초록색 동그라미 ⓐ : abstract (추상 클래스))
					// (초록색 동그라미 ⓐ 에 빗금 : Legacy (사용을 충분히 고려해 보고 사용해야한다.))
					Statement stmt = conn.createStatement();
					
					
					// 우선 sid 가 String 타입이어서 받는 것은 %s.
					// 오라클에서는 sid가 NUMBER 타입...
					// 쿼리문에 홑따옴표가 없으므로, 오라클 입장에서는 sid를 숫자타입으로 받아들인다!!
					
					// ★【오라클 입장】 [%s : 숫자, '%s' : 문자]
					
					// 쿼리문 준비
					
					// * [원하는 형태로 출력] → 이걸 문자열로 변경해야 함. String.format
					// System.out.printf("%d %s", arg, arg)
					
					//String sql = "INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(" + sid + ", " + name + " ', '" + tel + " ')";
					//String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(①, '②', '③')", sid, name, tel);
					
					String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(%s, '%s', '%s')", sid, name, tel);
					
					// 데이터베이스로부터 질의 결과를 가져와야 하는 경우(select)
					// → 『executeQuery()』 메소드 사용.
					
					
					// ★ 특정 내용을 데이터베이스에 적용해야 하는 경우 (insert, update, delete)
					// → 『executeUpdate()』 메소드 사용.
					
					// 【executeUpdate를 통해 변경이 적용된 행(Record)의 개수 반환.】 (int 변수로 받기 생략 가능)
					int result = stmt.executeUpdate(sql);
					//-- executeUpdate() 메소드는 적용된 행의 개수 반환
					
					if (result > 0)
					{
						System.out.println(">> 회원 정보가 입력되었습니다.\n");
						
					}
					else
					{
						System.out.println(">> 회원 정보 입력 실패~!!!\n");
						
					}
					
				} catch (Exception e)
				{
					System.out.println(e.toString());
				}
				
			}
			else
			{
				System.out.println(">> 데이터베이스 연결 실패~!!!");
				break;
			}
			
		} while (true);
		
		sc.close();
		
		DBConn.close();
		
		System.out.println(">> 데이터베이스 연결 닫힘~!!!");
		System.out.println(">> 프로그램 종료됨~!!!");
		
		
		
	}
	// 실행 결과
	/*
	번호를 입력하세요(-1 종료) : 5
	이름을 입력하세요 : 박나영
	전화번호를 입력하세요 : 010-3333-3333
	>> 데이터베이스 연결 성공~!!!
	>> 회원 정보가 입력되었습니다.
	
	번호를 입력하세요(-1 종료) : 6
	이름을 입력하세요 : 정현욱
	전화번호를 입력하세요 : 010-4444-4444
	>> 데이터베이스 연결 성공~!!!
	>> 회원 정보가 입력되었습니다.
	
	번호를 입력하세요(-1 종료) : 7
	이름을 입력하세요 : 김민지
	전화번호를 입력하세요 : 010-5555-5555
	>> 데이터베이스 연결 성공~!!!
	>> 회원 정보가 입력되었습니다.
	
	번호를 입력하세요(-1 종료) : -1
	>> 데이터베이스 연결 닫힘~!!!
	>> 프로그램 종료됨~!!!
	*/
	
	
	// [내 풀이~]▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
	/*
	 * public static void main(String[] args) throws ClassNotFoundException,
	 * SQLException { Scanner sc = new Scanner(System.in); int n; String name;
	 * String tel; String insertStr;
	 * 
	 * // 연결 객체 생성(구성) Connection conn = DBConn.getConnection();
	 * 
	 * if (conn == null) { System.out.println("데이터베이스 연결 실패~!!!"); System.exit(0);
	 * // 프로그램 나가기 }
	 * 
	 * 
	 * // 번호 입력받기 do { System.out.println("번호를 입력하세요(-1 종료) : "); n = sc.nextInt();
	 * 
	 * if (n == -1) { System.out.println("데이터베이스 연결 닫힘~!!");
	 * System.out.println("프로그램 종료됨~!!!"); DBConn.close(); // 연결객체 닫기
	 * System.exit(0); // 프로그램 나가기 }
	 * 
	 * System.out.print("이름을 입력하세요 : "); name = sc.next();
	 * 
	 * System.out.print("전화번호를 입력하세요 : " ); tel = sc.next();
	 * 
	 * //--------------------------------------------
	 * 
	 * try {
	 * 
	 * 
	 * 
	 * Statement stmt = conn.createStatement();
	 * 
	 * insertStr = String.
	 * format("INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(%d, \'%s\', \'%s\')",
	 * n, name, tel);
	 * 
	 * int result = stmt.executeUpdate(insertStr);
	 * 
	 * if (result > 0) { System.out.println("데이터베이스 연결 성공~!!!");
	 * System.out.println("회원 정보가 입력되었습니다."); }
	 * 
	 * 
	 * 
	 * } catch (Exception e) { System.out.println(e.toString()); }
	 * 
	 * 
	 * } while(n != -1);
	 * 
	 * 
	 * 
	 * 
	 * }// end main
	 */
	
	
}

 

 

 

Test005.java

/*=====================================
	  Test005.java
	  - 테이블 내의 데이터 읽어오기
=======================================*/

package com.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.util.DBConn;

public class Test005
{
	public static void main(String[] args) throws ClassNotFoundException, SQLException
	{
		Connection conn = DBConn.getConnection();
		
		if (conn != null)
		{
			System.out.println("데이터베이스 연결 성공~!!!");
			
			
			try
			{
				// 작업 객체 생성
				
				Statement stmt = conn.createStatement();
				
				
				// 쿼리문 준비 (select)	
				// tip! : 오라클에서 쿼리문 가져올 때 한 줄로 가져올 것.
				//        개행을 시켜서 + 로 문자열 결합 시킬 때, 맨 앞에 공백을 발생시킨다.
				//         		  "SELECT SID, NAME, TEL"
				//				+ " FROM TBL_MEMBER" ← ★공백 check~!!!
				//				+ " ORDER BY SID";	 ← ★공백 check~!!!
				
				String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
				/*
				String sql = "SELECT SID, NAME, TEL"
						   + " FROM TBL_MEMBER"
						   + " ORDER BY SID";
				*/
				// ※ 쿼리문을 구성하는 과정에서 공백이나 개행 처리 check~!!!
				
				
				// 쿼리문 실행
				ResultSet rs = stmt.executeQuery(sql);
				// 리턴 자료형이 ResultSet! 객체를 반환하는 것이다.
				// 석탄, 구리가 다 담겨서 도착한 게 아니다.
				// ResultSet이라고 하는 건, primetive 자료형처럼 연산(질의) 결과를 모두 담아주는 것이 아니다.
				// 언제든지 필요한 걸 꺼내서 쓰겠다는 의미 X. 그러니까 연결 끊으면 안 돼요!
				
				
				// ※ executeQuery() 메소드를 사용하면
				//    질의 결과를 ResultSet 객체로 가져올 수 있다.
				//    하지만, ResultSet 객체가 질의에 대한 결과물 모두를
				//    한꺼번에 갖고 있는 구조는 아니다.
				//    단지, 데이터베이스로부터 획득한 질의 결과물에 대한
				//    관리가 가능한 상태가 되는 것이다.
				//    이 때문에 ResultSet 을 얻었다고 해서
				//    데이터베이스와의 연결을 끊게 되면
				//    ResultSet 객체는 더 이상 질의 결과를 관리할 수 없게 된다.
				
				// ※※※ DBConn.close(); 이러면 안 된다! ※※※ 연결 끊지마!!
				
				
				// ResulSet 에 대한 처리 (→ 반복문 구성)
				//  * (긴 카세트테이프의 테이프 처럼)
				//▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦
				//   ▼ → ▼(next()) 
				// ├─┼─┼─┼─┼─┼─┼─┤ [ResultSet]
				//▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦				
				// → (이거 다음.. 이거 다음.. 반복문 내부에서 커서(rs.next()) 이동)
				
				//rs.next();
				// ◎【rs.next()】▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥
				// ResultSet 안에 다음 값이 있는지 없는지 확인시켜주는 메소드.
				// boolean 타입(true, false) 반환. 있으면 t, 없으면 f.
				// ▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥▥
				
				// 값이 있을 때만 true를 반환하므로 다음과 같이 while문 구성.
				// [오라클 데이터 받아오기]****************
				// 문자형 형태로 얻어오기 getString()
				// 숫자형 형태로 얻어오기 getInt()
				// 실수형 형태로 얻어오기 getDouble()
				//*****************************************
				
				// getxxx() 메소드
				// ResultSet에서 가져오는 요소를
				// 컬럼명("SID", "NAME", "TEL")으로 식별할 수 있게끔 구성되어 있다.
				while (rs.next())
				{
					//int sid = rs.getInt("SID");
					String sid = rs.getString("SID");
					String name = rs.getString("NAME");
					String tel = rs.getString("TEL");
					
					//System.out.printf("%d %s %s", sid, name, tel);
					//System.out.printf("%s %s %s", sid, name, tel);
					
					String str = String.format("%3s %8s %12s",  sid, name, tel);
					System.out.println(str);
				}
				
				// ResultSet 리소스 반납
				rs.close();
				
				// Statement 리소스 반납
				stmt.close();
				
				
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
		}
		else
		{
			System.out.println("데이터베이스 연결 실패~!!!");
		}
		
		DBConn.close();

		System.out.println(">> 데이터베이스 연결 닫힘~!!!");
		System.out.println(">> 프로그램 종료됨~!!!");
		
	}
}

// 실행 결과
/*
데이터베이스 연결 성공~!!!
  1      홍길동 010-1111-1111
  2      김지민 010-3937-6913
  3      김말자 010-5555-8888
  4      강혜성 010-6380-7047
  5      박나영 010-3333-3333
  6      정현욱 010-4444-4444
  7      김민지 010-5555-5555
>> 데이터베이스 연결 닫힘~!!!
>> 프로그램 종료됨~!!!
*/

 

 

 

 

Test006.java

 

/*=====================================
	  Test006.java
	  - 테이블 내의 데이터 읽어오기
=======================================*/

package com.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.util.DBConn;

// EMP 테이블을 대상으로
// EMPNO, ENAME, JOB, SAL 항목을 확인하는 프로그램 구성

public class Test006
{
	public static void main(String[] args) throws ClassNotFoundException, SQLException
	{
		Connection conn = DBConn.getConnection();
		
		if (conn != null)
		{
			System.out.println("데이터베이스 연결 성공~!!!");
			
			try
			{
				// 작업 객체 생성
				Statement stmt = conn.createStatement();
				
				// 쿼리문 준비
				String sql = "SELECT EMPNO, ENAME, JOB, SAL"
							+ " FROM EMP";
				
				
				// 쿼리문 실행
				
				ResultSet rs = stmt.executeQuery(sql);
				
				
				// while 문 실행
				
				while (rs.next())
				{
					String empno = rs.getString("EMPNO");
					String ename = rs.getString("ENAME");
					String job = rs.getString("JOB");
					int sal = rs.getInt("SAL");
					String resultStr = String.format("%5s  %9s  %10s  %6d", empno, ename, job, sal);
					System.out.println(resultStr);
				}
				
				rs.close();
				stmt.close();
				
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
			
			
		}
		else
		{
			System.out.println("데이터베이스 연결 실패~!!!");
		}
		
		DBConn.close();
		System.out.println(">> 데이터베이스 연결 닫힘~!!!");
		System.out.println(">> 프로그램 종료됨~!!!");
		
	}
}