[20220922] JDBC 파일 입출력

kangsun·2022년 9월 22일
0

Java

목록 보기
23/44

📌


  • 준비 작업

    1) Test01_DBOpen 파일로 RUN해서 서버 연결 성공시켜놓기.


2) 명령프롬프트 cmd를 켜서 접속
> sqlplus system/1234

3) 성적테이블 개수 확인하기
> select count(*) as cnt from sungjuk; → 12개


Test01_selectCount

  • sungjuk 테이블의 행의 개수를 자바에서 입출력하기

  • try~catch문 위에 데이터베이스 연동과 관련있는 인터페이스들을 먼저 선언해주고, (변수선언)
  • 기존에 try~catch문 안에있던 Connection과 PreparedStatement 문을 변수만 남기고 지워준다.
    - Connection은 변수가 있으므로 맨 앞에 선언한 Connection만 지워주면 된다.

인터페이스 기능 선언 후 자원반납 방법

- 작성 순서 반대로 자원반납을 해줘야한다.
(상자안에 물건을 쌓아넣고 뺄때는 반대로 위에서부터 빼줘야하는 것 처럼~)


select문 작성해주기

위에 선언한 sql 실행시켜주는 명령어와 ResultSet을 실행시켜주는 명령어 작성.

커서로 자료가 있는지 없는지 판단하는 문장 작성

  • if(rs.next()) : cursor가 있는지? 물어보는 조건문
    next() :

cmd 명령프롬프트로 결과 확인

오라클 콘솔창 예쁘게 출력

set linesize 1000;
col name for a10;	--col 칼럼명 for 20자
col addr for a10;	--col 칼럼명 for 20
  • 출력결과


Test02_selectOne

sungjuk 테이블에서 한 행 가져오기 (상세보기)

- 가져올 행 확인 (23번행 JSPark)

1) 기본 코드 작성하기

sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate ");

- select * 은 칼럼명이 전에 모두 노출이 되었을 때 사용해야한다.
- 그게 아니라면 칼럼명 모두 작성해줘야한다.

- int sno=23; 이 int sno=40; 이면 자료없음으로 출력된다. 왜냐면 내가 23까지만 데이터를 가지고있기 때문

2) 연결 확인

3) 행 출력하기 (if문으로 커서 접근)

2가지 방법

  • 칼럼순서 접근 - getInt(int) / getString(int)
  • 칼럼명 접근 - getInt("칼럼명") / getString("칼럼명")


- 똑같이 출력되는 것을 확인할 수 있다.

  • RUN 실행시키고 출력 성공 확인


Test03_selectAll

sungjuk 테이블에서 전체 행 가져오기 (목록)

  • Test02_selectOne에서 한 행 출력한 부분을 반복문 사용하면 전체행을 출력할 수 있다.

sql문으로 목록 먼저 확인하기

- 이 내용을 자바에서 가져올 것이다.

- 상세보기(한 행 출력한 것)를 반복문 안에 넣으면 목록(전체 행 출력)이 된다.
- resultSet의 특징 : 제일 위에있는 목록을 가져온 후 그다음 줄을 가져온다. 또 그 다음줄을 가져오게 된다. next, next 하고 마지막줄까지 가면 다음줄(next)의 값은 없으므로 0이 반환된다.

코드 세팅 후 "자료있음"까지 확인

do~while 반복문을 사용해서 전체 행 출력하기

  • ex) 피자 주문할 때 메뉴 목록 모두 보여줄 수 있는 방법


번외

- 저 부분은 기계적으로 항상 작성해야하는 부분인데 RowMapper이나 Mybatis Framework같은 프로그램으로 한 번에 불러올 수 있는 기능이 있다.

- 이 부분들은 항상 똑같은 패턴이므로 클래스를 생성하면 된다. DBOpen,

  • RUN 실행시키고 출력 성공 확인


Test04_selectAVG

문제) 주소가 서울인 행들의 국영수 평균값을 구하시오

(단, 소수점은 반올림해서 둘째자리값까지 표현)

1) sql 파일에서 먼저 작성하고 cmd 명령 프롬프트에서 복붙해서 확인

2) 자바에서 코드 작성

- 주소 변수에 Seoul 값을 먼저 저장해 준다.

- 위에 sql문 작성했던 것과 똑같이 대소문자만 구분해서 붙여넣어준다.

- 두가지 방법으로 모두 접근해본다 (연습)

  • RUN 실행시키고 출력 성공 확인


Test05_selectLike

Like 연산자 연습

문제) 이름에 '나' 문자 있는 행을 조회하시오

  • 검색 칼럼 변수와 '나' 문자 넣을 변수를 지정해준다.


  • sql문 코드에 if문으로 검색어를 넣었을 경우에 대한 조건을 준다.

  • sql로 가져온 데이터를 출력한다.

  • RUN 실행시키고 출력 성공 확인

<전체코드>

package jdbc0922;

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

public class Test05_selectLike {

	public static void main(String[] args) {
		// Like 연산자 연습
		//문제) 이름에 '나' 문자 있는 행을 조회하시오
		String col="uname";	//검색칼럼 keyfield
		String word="나";	//검색어 keyword
		
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null; 
		
		
		try {
			String url	   ="jdbc:oracle:thin:@localhost:1521:xe"; 
			String user	   ="system";
			String password="1234"; 
			String driver  ="oracle.jdbc.driver.OracleDriver";
			Class.forName(driver);
			con =DriverManager.getConnection(url, user, password);
			System.out.println("오라클 DB 서버 연결 성공!!");
			
			
			StringBuilder sql=new StringBuilder();
			sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate  ");
			sql.append(" FROM sungjuk ");
			
			// 검색어가 존재하는지? 
			if(word.length()>0) {//검색어에 개수가 있는지? 검색어를 입력했는지? 0은 입력 안한 것.
				//where uname like '%나%'
				String where=" WHERE " + col + " LIKE '%" + word + "%' ";
				sql.append(where);
			}//if end
			
			sql.append(" ORDER BY sno DESC ");
			
			//System.out.println(sql.toString());
			
			
			
			
			pstmt=con.prepareStatement(sql.toString());	// con(결과값) sql문을 실행시켜주는 명령어.							
			rs=pstmt.executeQuery(); // ResultSet을 실행시켜주는 명령어.
			
			if(rs.next()) { 
				System.out.println("자료있음 @@");	
				do {
					System.out.println(rs.getInt("sno") + " ");
					System.out.println(rs.getString("uname") + " ");
					System.out.println(rs.getInt("kor") + " ");
					System.out.println(rs.getInt("eng") + " ");
					System.out.println(rs.getInt("mat") + " ");
					System.out.println(rs.getInt("tot") + " ");
					System.out.println(rs.getInt("aver") + " ");
					System.out.println(rs.getString("addr") + " ");
					System.out.println(rs.getString("wdate") + " ");
					System.out.println();
				}while(rs.next()); //다음 cursor가 있는지?
				
			}else {
				System.out.println("자료없음 @@");
			}//if end
			

			
		} catch (Exception e) {
			System.out.println("실패" + e);
		}finally{	//자원반납 (순서주의)
			try {
				if (rs!=null) {rs.close();}
			} catch (Exception e) {}
			try {
				if (pstmt!=null) {pstmt.close();}
			} catch (Exception e) {}
			try {
				if (con!=null) {con.close();}
			} catch (Exception e) {}
		}//end
		
		System.out.println("END");
		

		
		
	} // main() end
	
} // class end

번외

  • 제목/내용 상관없이 전체 게시물이 나오는 게시판과,
    검색을 했을 때 검색 관련 게시물이 나오는 게시판 두가지를 만들 때 한 페이지 내에 검색 결과만 다르게 출력을 해서 뽑아내면 된다.
  • 검색어에 따라 페이지가 나뉘어진다.

Test06_quiz

문제) 학번 g1001이 수강신청한 과목을 과목코드별로 조회하시오

  • sql 텍스트 파일에서 결과값이 나오는지 먼저 작성해보기

  • sql.append()로 sql문을 추가해준다.

  • 값을 출력해준다.

  • RUN 실행시키고 출력 성공 확인

<Test06 전체코드>

package jdbc0922;

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

public class Test06_quiz {

	public static void main(String[] args) {
		// 문제) 학번 g1001이 수강신청한 과목을 과목코드별로 조회하시오
		/*
			g1001	d001	HTML
			g1001	p001	JAVA
			g1001	p002	Oracle
			g1001	p003	JSP
			g1001	p004	Python
			g1001	p005	AJAX
		*/
		
		
		String hakno="g1001";
		
		
		
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null; 

		
		
		try {
			String url	   ="jdbc:oracle:thin:@localhost:1521:xe"; 
			String user	   ="system";
			String password="1234"; 
			String driver  ="oracle.jdbc.driver.OracleDriver";
			Class.forName(driver);
			con =DriverManager.getConnection(url, user, password);
			System.out.println("오라클 DB 서버 연결 성공!!");
			
			
			
			StringBuilder sql=new StringBuilder();
			
			sql.append(" SELECT SU.hakno, SU.gcode, GW.gname ");
			sql.append(" FROM tb_sugang SU join tb_gwamok GW ");
			sql.append(" ON SU.gcode=GW.gcode ");
			sql.append(" WHERE SU.hakno=? ");
			sql.append(" ORDER BY SU.gcode ");
			
			
			pstmt=con.prepareStatement(sql.toString());	// con(결과값) sql문을 실행시켜주는 명령어.							
			pstmt.setString(1, hakno);
			
			rs=pstmt.executeQuery();
			
			if(rs.next()) { 
				System.out.println("자료있음 @@");	
				do {
					System.out.println(rs.getString("hakno") + " ");
					System.out.println(rs.getString("gcode") + " ");
					System.out.println(rs.getString("gname") + " ");
					System.out.println();
				}while(rs.next()); //다음 cursor가 있는지?
				
			}else {
				System.out.println("자료없음 @@");
			}//if end
			

			
		} catch (Exception e) {
			System.out.println("실패" + e);
		}finally{	//자원반납 (순서주의)
			try {
				if (rs!=null) {rs.close();}
			} catch (Exception e) {}
			try {
				if (pstmt!=null) {pstmt.close();}
			} catch (Exception e) {}
			try {
				if (con!=null) {con.close();}
			} catch (Exception e) {}
		}//end
		
		System.out.println("END");
		

		
		
	} // main() end
	
} // class end

Test07_selectPaging

페이징

문제) sungjuk 테이블에서 이름순으로 정렬 후 행번호 4~6만 조회하시오.

  • sql 편집 파일에서 먼저 sql문 작성하고 결과값 테스트하기


    - 4번 값은 rownum으로 인해 결과가 조회되지 않는다.

  • 최종 수정된 sql문

  • start와 end 변수 설정

  • sql.append() 로 sql문 복붙 추가

  • ? 물음표로 변수에 값을 넣어주는 함수 작성

  • 출력할 코드 작성

  • 데이터 가져오기 성공

<Test07 전체코드>

package jdbc0922;

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

public class Test07_selectPaging {

	public static void main(String[] args) {
		// 페이징
		// 문제) sungjuk 테이블에서 이름순으로 정렬 후 행번호 4~6만 조회하시오.
		
		int start=4;
		int end=6;
		
		
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null; 
		
		
		try {
			String url	   ="jdbc:oracle:thin:@localhost:1521:xe"; 
			String user	   ="system";
			String password="1234"; 
			String driver  ="oracle.jdbc.driver.OracleDriver";
			Class.forName(driver);
			con =DriverManager.getConnection(url, user, password);
			System.out.println("오라클 DB 서버 연결 성공!!");
			
			
			StringBuilder sql=new StringBuilder();
			
			
			sql.append(" SELECT * ");
			sql.append(" FROM ( ");
			sql.append(" 		 SELECT uname, aver, addr, rownum as rnum ");
			sql.append(" 		 FROM ( ");
			sql.append(" 				 SELECT uname, aver, addr ");
			sql.append("				 FROM sungjuk ");
			sql.append("				 ORDER BY uname ");
			sql.append("			   ) ");
			sql.append("		 ) ");
			sql.append(" WHERE rnum>=? and rnum<=? ");
			
			
			
			
			pstmt=con.prepareStatement(sql.toString());	// con(결과값) sql문을 실행시켜주는 명령어.	
			pstmt.setInt(1, start);
			pstmt.setInt(2, end);
			
			rs=pstmt.executeQuery(); // ResultSet을 실행시켜주는 명령어.
			
			if(rs.next()) { 
				System.out.println("자료있음 @@");	
				do {
					System.out.print(rs.getInt("rnum") + " ");
					System.out.print(rs.getString("uname") + " ");
					System.out.print(rs.getInt("aver") + " ");
					System.out.print(rs.getString("addr") + " ");
					System.out.println();
				}while(rs.next()); //다음 cursor가 있는지?
				
			}else {
				System.out.println("자료없음 @@");
			}//if end
			

			
		} catch (Exception e) {
			System.out.println("실패" + e);
		}finally{	//자원반납 (순서주의)
			try {
				if (rs!=null) {rs.close();}
			} catch (Exception e) {}
			try {
				if (pstmt!=null) {pstmt.close();}
			} catch (Exception e) {}
			try {
				if (con!=null) {con.close();}
			} catch (Exception e) {}
		}//end
		
		System.out.println("END");
		

		
		
	} // main() end
	
} // class end
profile
코딩 공부 💻

0개의 댓글