본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch20 데이터베이스 입출력 2(UPDATE, DELETE, ResultSet)

728x90
반응형

1. 데이터 수정

◎ UPDATE 문

1. JDBC를 이용해서 UPDATE 문을 실행


2. prepareStatement() 메소드로부터 PreparedStatement를 얻고, ?에 해당하는 값을 지정
3. executeUpdate() 메소드를 호출. 수정된 행의 수가 리턴

 

◎ UPDATE 문을 이용한 예제

package java0213_1;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BoardUpdateExample {
	public static void main(String[] args) {
		Connection conn = null;
		
		try {
			// JDBC Driver 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기
			conn = DriverManager.getConnection(
                	"jdbc:oracle:thin:@연결 주소:포트/SID",
                	"오라클 ID",
                	"오라클 PW"
					);
			
			// 매개변수화된 SQL문 작성
			String sql = new StringBuilder()
					.append("UPDATE boards SET ")
					.append("btitle=?, ")
					.append("bcontent=?, ")
					.append("bfilename=?, ")
					.append("bfiledata=? ")
					.append("WHERE bno=?")
					.toString();
				
			// PreparedStatement 얻기 및 값 지정
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "눈사람");
			pstmt.setString(2, "눈으로 만든 사람");
			pstmt.setString(3, "snowman.jpg");
			pstmt.setBlob(4, new FileInputStream("src/java0213_1/snowman.jpg"));
			pstmt.setInt(5, 3);
			
			// SQL문 실행
			int rows = pstmt.executeUpdate();
			System.out.println("수정된 행 수 : " + rows);
			
			// PreparedStatement 닫기
			pstmt.close();
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
				} catch (SQLException e) {}
			}
		}
	}
}

//	출력 :
//	수정된 행 수 : 1


이전시간에 실행했던 BoardUpdateExample을 다시 실행하고 위의 코드를 실행하면 행이 수정됩니다.

oracle db와 연동이 되어있습니다.

 

 DELETE 문
   ▷ JDBC를 이용해서 DELETE 문 실행. 매개변수화된 DELETE 문을 String 타입 변수 sql에 대입


   ▷ prepareStatement() 메소드로부터 PreparedStatement를 얻고 ?에 값을 지정한 후, executeUpdate로 SQL 문을 실행

 

◎ DELETE 문을 이용한 예제

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

public class BoardDeleteExample {
	public static void main(String[] args) {
		Connection conn = null;
		
		try {
			// JDBC DRIVER 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기
			conn = DriverManager.getConnection(
                	"jdbc:oracle:thin:@연결 주소:포트/SID",
                	"오라클 ID",
                	"오라클 PW"
					);
			
			// 매개변수화된 SQL문 작성
			String sql = "DELETE FROM boards WHERE bwriter=?";
			
			// PreparedStatement 얻기 및 값 지정
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "winter");
			
			// SQL문 실행
			int rows = pstmt.executeUpdate();
			System.out.println("삭제된 행 수 : " + rows);
			
			// PreparedStatement 닫기
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
				} catch (SQLException e) {}
			}
		}
	}
}


//	출력 : 
//	삭제된 행 수 : 1



생성된 행에서 bwriter = "winter"인 부분은 모두 삭제합니다. 

주소 부분을 아래와 같이 변수로 따로 지정해도 상관없습니다.

String url = "jdbc:oracle:thin:@연결 주소:포트/SID";
String user = "오라클 ID";
String passwd = "오라클 PW";

conn = DriverManager.getConnection(url, user, passwd);

 

◎ ResultSet 구조
   ▷ SELECT 문에 기술된 컬럼으로 구성된 행(row)의 집합

 

 

   ▷ 커서cursor가 있는 행의 데이터만 읽을 수 있음
   ▷ first 행을 읽으려면 next() 메소드로 커서 이동

 

 

◎ 데이터 행 읽기
   ▷ 커서가 있는 데이터 행에서 각 컬럼의 값은 Getter 메소드로 읽음
   ▷ SELECT 문에 연산식이나 함수 호출이 포함되어 있다면 컬럼 이름 대신에 컬럼 순번으로 읽어야 함

 

◎ 데이터 행 읽기 예제

package ch20.oracle.sec09.ex01;

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

public class UserSelectExample {
	public static void main(String[] args) {
		Connection conn = null;
		
		try {
			// JDBC DRIVER 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기1
//	conn = DriverManager.getConnection(
//		"jdbc:oracle:thin:@연결 주소:포트/SID",
//		"오라클 ID",
//		"오라클 PW"
//	);
			
            // 연결하기2
			String url = "jdbc:oracle:thin:@연결 주소:포트/SID";
			String user1 = "오라클 ID";
			String passwd = "오라클 PW";

			conn = DriverManager.getConnection(url, user1, passwd);
			
			// 매개변수화된 SQL문 작성
			String sql = "" + 
					"SELECT userid, username, userpassword, userage, useremail " +
					"FROM users " +
					"WHERE userid=?";
			
			// PreparedStatement 얻기 및 값 지정
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "winter");
			
			// SQL문 실행 후, ResultSet을 통해 데이터 읽기
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				User user = new User();
				user.setUserId(rs.getString("userid"));
				user.setUserName(rs.getString("username"));
				user.setUserPassword(rs.getString("userpassword"));
				user.setUserAge(rs.getInt(4));
				user.setUserEmail(rs.getString(5));
				System.out.println(user);
			} else {
				System.out.println("사용자 아이디가 존재하지 않음");
			}
			rs.close();
			
			// PreparedStatement 닫기
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
				} catch (SQLException e) {}
			}
		}
	}
}

//	출력 : 
//	User(userId=winter, userName=한겨울, userPassword=12345, userAge=25, userEmail=winter@mycompany.com)

 

롬복 사용 예제 : 이것이 자바다(507p) 

 

◎ 게시물 정보 읽기

1. boards 테이블에서 bwriter가 winter인 게시물의 정보를 가져오기

2. bwriter가 winter인 게시물 정보를 가져오는 SELECT 문. prepareStatement() 메소드로부터 PreparedStatement를 얻고, ?에 값을 지정

3. executeQuery() 메소드로 SELECT 문을 실행해서 ResultSet을 얻음
4. while 문을 이용해서 next() 메소드가 false를 리턴할 때까지 반복해서 데이터 행을 Board 객체에 저장하고 출력한다

5. Blob 객체에 저장된 바이너리 데이터를 얻기 위해서는 입력 스트림 또는 배열을 얻어냄

6. Blob 객체에서 InputStream을 얻고, 읽은 바이트를 파일로 저장

 

◎ 게시판 만들기 예제

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BoardSelectExample {
	public static void main(String[] args) {
		Connection conn = null;
		
		try {
			// JDBC Driver 등록
			Class.forName("oracle.jdbc.OracleDriver");
			
			// 연결하기
			conn = DriverManager.getConnection(
                	"jdbc:oracle:thin:@연결 주소:포트/SID",
                	"오라클 ID",
                	"오라클 PW"
					);
			
			// 매개변수화된 SQL문 작성
			String sql = ""+
			"SELECT bno, btitle, bcontent, bwriter, bdate, bfilename, bfiledata "
					+ "FROM boards "
					+ "WHERE bwriter=?";
			
			// PreparedStatement 얻기 및 값 지정
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, "winter");
			
			// SQL문 실행 후, ResultSet을 통해 데이터 읽기
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()) {
				// 데이터 행을 읽고 Board();
				Board board = new Board();
				board.setBno(rs.getInt("bno"));
				board.setBtitle(rs.getString("btitle"));
				board.setBcontent(rs.getString("bcontent"));
				board.setBwriter(rs.getString("bwriter"));
				board.setBdate(rs.getDate("bdate"));
				board.setBfilename(rs.getString("bfilename"));
				board.setBfiledata(rs.getBlob("bfiledata"));
				
				// 콘솔에 출력
				System.out.println(board);
				
				// 파일로 저장
				Blob blob = board.getBfiledata();
				if(blob != null) {
					InputStream is = blob.getBinaryStream();
					OutputStream os = new FileOutputStream("C:/Temp/"+
					board.getBfilename());
					is.transferTo(os);
					os.flush();
					os.close();
					is.close();
				}		
			}
			rs.close();
			
			// PreparedStatement 닫기
			pstmt.close();
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					// 연결 끊기
					conn.close();
				} catch (SQLException e) {}
			}
		}
	}
}

//	출력 : 
//	Board(bno=10, btitle=크리스마스, bcontent=메리 크리스마스~, bwriter=winter, bdate=2023-02-14, bfilename=chrismas.jpg, bfiledata=oracle.sql.BLOB@5f049ea1)
//	Board(bno=8, btitle=봄의 정원, bcontent=정원의 꽃이 이쁘네요., bwriter=winter, bdate=2023-02-14, bfilename=spring.jpg, bfiledata=oracle.sql.BLOB@909217e)
//	Board(bno=9, btitle=눈오는 날, bcontent=함박눈이 내려요., bwriter=winter, bdate=2023-02-14, bfilename=snow.jpg, bfiledata=oracle.sql.BLOB@18271936)

 

UPDATE, DELETE, ResultSet를 이용해서 java와 오라클을 연결해보는 예제들을 수행해보았습니다.

 

MySQL에서 배웠던 문법이랑 비슷한 것들도 있고 다른 것도 있네요!!

 

여러 문법들이 헷갈리지 않도록 정리를 잘 해야겠어요!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

728x90
반응형