๐Ÿ’ป/JDBC

(31) [JDBC] 2์ผ์ฐจ : JDBC(Java Data Connectivity)

๋”ฐ๊ถˆ 2024. 4. 3. 08:37

 

ResultSet 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ…Œ์ด๋” ํ…Œ์ด๋ธ”. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์กฐํšŒํ•˜๋Š” ๋ฌธ์„ ์‹คํ–‰ํ•˜์—ฌ ์ƒ์„ฑ๋œ๋‹ค. ResultSet๊ฐ์ฒด๋Š” ํ˜„์žฌ ๋ฐ์ดํ„ฐ ํ–‰์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ดˆ๊ธฐ์— ์ปค์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ–‰ ์•ž์— ์œ„์น˜ํ•œ๋‹ค. 

 

PreparedSatement 

Statement ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ”„๋ฆฌ ์ปดํŒŒ์ผ(์ „ ์ฒ˜๋ฆฌ)๋œ SQL๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด. SQL๋ฌธ์€ ํ”„๋ฆฌ ์ปดํŒŒ์ผ ๋˜์–ด PreparedStatement๊ฐ์ฒด์— ์ €์žฅ๋˜๋ฉฐ, ์ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ SQL๋ฌธ์„ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

  1. ์„ ํ–‰ ์ปดํŒŒ์ผ ์ด๋ฃจ์–ด์ง„๋‹ค (์ž๋ฐ”์—์„œ ๋ฌธ์ œ ์žˆ๋Š”์ง€ ๋จผ์ € ์ฒดํฌ)
  2. ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ํ•  ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋น ๋ฆ„  
  3. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
  4.  insert, update, delete ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ commit ๋œ๋‹ค.
  5. ํ•„์š” ์‹œ, ์ž๋ฐ”์—์„œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

 

PreparedStatement ์ฃผ์š” ๋ฉ”์†Œ๋“œ

  1. executeUpdate()  
     insert, update, delete, create, alter, drop ๋“ฑ์œผ๋กœ ์ฟผ๋ฆฌ ์‹คํ–‰, DML ์€ ์‹คํ–‰ ํ–‰์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , DDL ์€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  2. executeQuery()
     select ๋ฌธ ์‹คํ–‰, select ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ResultSet ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

 

package db.item3;

import java.sql.Connection;
import java.sql.PreparedStatement;

import com.util.DBConn;

public class Ex01_PreparedStatement {
	/*
	 * PreparedStatement :Statement ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค :ํ”„๋ฆฌ ์ปดํŒŒ์ผ(์ „ ์ฒ˜๋ฆฌ)๋œ 
	 * SQL๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด :์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ• ๋•Œ๋Š”
	 * Statement๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  :PreparedStatement๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
	 */

	public static void main(String[] args) {
		Connection conn = DBConn.getConnection();
		PreparedStatement pstmt = null;
		String sql;


		try {
			sql = "INSERT INTO score(hak,name,birth,kor,eng,mat)Values(?,?,TO_DATE(?,'YYYY-MM-DD'),?,?,?)";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "7788");
			pstmt.setString(2, "ํ™๊ธธ๋™");
			pstmt.setString(3, "2000-10-15");
			pstmt.setString(4, "85");
			pstmt.setString(5, "95");
			pstmt.setString(6, "70");
			
			pstmt.executeUpdate();
			
			//๋‘๋ฒˆ์งธ ์‚ฌ๋žŒ ๋“ฑ๋ก 
			
			pstmt.setString(1, "7789");
			pstmt.setString(2, "๋„ˆ์ž๋ฐ”");
			pstmt.setString(3, "2000-08-10");
			pstmt.setString(4, "75");
			pstmt.setString(5, "80");
			pstmt.setString(6, "90");
			
			pstmt.executeUpdate();

			System.out.println("๋“ฑ๋ก ์™„๋ฃŒ....");
				
		
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e2) {

				}
			}
		}

	}

}

 

 

JDBC ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ ์ˆœ์„œ 

  1. DriverManager.getConnection() ์—์„œ Connection ๊ฐ์ฒด๋ฅผ ์–ป์–ด ์˜จ๋‹ค.
  2. ์ฟผ๋ฆฌ ์ž‘์„ฑ
  3. SQL ๋ฅผ ์ธ์ž๋กœ PreparedStatement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  4.  ์ฟผ๋ฆฌ์˜ in ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ setter ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ค์ •ํ•œ๋‹ค
  5. ์ฟผ๋ฆฌ ์‹คํ–‰ select   : executeQuery(), ๋‚˜๋จธ์ง€ ์ฟผ๋ฆฌ : executeUpdate() 

 

 

ScoreDAOImpl

ํ•™๋ฒˆ ๊ฒ€์ƒ‰ SELECT ๋ฉ”์†Œ๋“œ

//ํ•™๋ฒˆ๊ฒ€์ƒ‰
	@Override
	public ScoreDTO findById(String hak) {
		ScoreDTO dto=null;
		PreparedStatement pstmt = null;
		ResultSet rs= null;
		String sql;
				
		
		
		try {	
			sql="SELECT hak,name,TO_CHAR(birth,'YYYY-MM-DD')birth,kor,eng,mat,(kor+eng+mat)tot,(kor+eng+mat)/3 ave FROM score WHERE hak=?";
			
			pstmt =conn.prepareStatement(sql);		
			
			pstmt.setString(1, hak);
			
			rs=pstmt.executeQuery();
			
			
			
			if(rs.next()) {
				dto=new ScoreDTO();
				
				dto.setHak(rs.getString("hak"));
				dto.setName(rs.getString("name"));
				dto.setBirth(rs.getString("birth"));
				dto.setKor(rs.getInt("kor"));
				dto.setEng(rs.getInt("eng"));
				dto.setMat(rs.getInt("mat"));
				dto.setTot(rs.getInt("tot"));
				dto.setAve(rs.getInt("ave"));
						
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
			
		} finally {
			DBUtil.close(rs);
			DBUtil.close(pstmt);
		}
		
		return dto;
	}

 

ScoreUI
ํ•™๋ฒ” ๊ฒ€์ƒ‰ UI

	protected void findByHak() {
		System.out.println("\nํ•™๋ฒˆ๊ฒ€์ƒ‰...");
		
		String hak;
		
		try {
			System.out.println("๊ฒ€์ƒ‰ํ•  ํ•™๋ฒˆ?");
			hak=br.readLine();
			
			ScoreDTO dto = dao.findById(hak);
			
			if(dto==null) {
				System.out.println("๋“ฑ๋ก๋œ ์ž๋ฃŒ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.\n");
				return;
			}
			
			printScore(dto);
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println();		
	}

 

 

 

ScoreDAOImpl

๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฉ”์†Œ๋“œ 

	@Override
	public int insertScore(ScoreDTO dto) throws SQLException {
		int result = 0;
		
		PreparedStatement pstmt = null;
		String sql;
		
		// insert into ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ, ์ปฌ๋Ÿผ) values(๊ฐ’, ๊ฐ’)
		try {
			// 1) ์ฟผ๋ฆฌ(sql) ์ž‘์„ฑ
			sql = "insert into score(hak, name, birth, kor, eng, mat) values(?,?,?,?,?,?)"; 
			
			// 2) ์ฟผ๋ฆฌ๋ฅผ ์ธ์ž๋กœ PreparedStatement ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
			pstmt = conn.prepareStatement(sql);
			
			// 3) setter ๋ฅผ ์ด์šฉํ•˜์—ฌ ? ์— ๊ฐ’ ํ• ๋‹น (์ˆœ์„œ ์ง€์ผœ์„œ ๋„ฃ์–ด์•ผ ํ•จ)
			pstmt.setString(1,dto.getHak());
			pstmt.setString(2,dto.getName());
			pstmt.setString(3,dto.getBirth());
			pstmt.setInt(4,dto.getKor());
			pstmt.setInt(5,dto.getEng());
			pstmt.setInt(6,dto.getMat());
			
			// 4) ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			throw e; // ์˜ˆ์™ธ ๋˜์ง€๊ธฐ
		} finally {
			// 5) ๊ฐ์ฒด close
			DBUtil.close(pstmt);
		}
		
		return result;
	}

 

 

 

ScoreUI

๋ฐ์ดํ„ฐ ๋“ฑ๋ก UI๊ตฌํ˜„๊ณผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ 

	protected void insert() {
		System.out.println("\n์ž๋ฃŒ ๋“ฑ๋ก...");
		
		ScoreDTO dto = new ScoreDTO();
		
		try {
			System.out.print("ํ•™๋ฒˆ?");
			dto.setHak(br.readLine());
			System.out.print("์ด๋ฆ„?");
			dto.setName(br.readLine());
			System.out.print("์ƒ๋…„์›”์ผ?");
			dto.setBirth(br.readLine());
			System.out.print("๊ตญ์–ด?");
			dto.setKor(Integer.parseInt(br.readLine()));
			System.out.print("์˜์–ด?");
			dto.setEng(Integer.parseInt(br.readLine()));
			System.out.print("์ˆ˜ํ•™?");
			dto.setMat(Integer.parseInt(br.readLine()));
		
			dao.insertScore(dto);
			
			System.out.println("๋“ฑ๋ก์™„๋ฃŒ");
		
		} catch (NumberFormatException e) {
			System.out.println("์—๋Ÿฌ= ์ ์ˆ˜๋Š” ์ˆซ์ž๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
	
		} catch (SQLIntegrityConstraintViolationException e) {
			//NOT null ๋“ฑ์˜ ์ œ์•ฝ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ• ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ
			//๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด 
			if(e.getErrorCode()==1) {
				System.out.println("์—๋Ÿฌ-๋“ฑ๋ก๋œ ํ•™๋ฒˆ์ž…๋‹ˆ๋‹ค.");
			}else if(e.getErrorCode()==1400) { // INSERT NOT NULL ์ œ์•ฝ ์œ„๋ฐ˜ 
				System.out.println("์—๋Ÿฌ - ํ•„์ˆ˜ ์ž…๋ ฅ ์‚ฌํ•ญ์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.");
			}else {
				System.out.println(e.toString());
			}
			
		
		} catch (SQLDataException e) {
			
			if(e.getErrorCode()==1840 || e.getErrorCode()==1861) {
				System.out.println("์—๋Ÿฌ-๋‚ ์งœ ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
			}else{
				System.out.println(e.toString());
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}