[java] 이것이 자바다

1. 데이터 수정

◎ 업데이트 문

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 문을 실행합니다.

문자열 유형의 변수 sql에 매개변수화된 DELETE 문을 할당합니다.



▷ 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 문에 기술된 열로 구성된 행 집합



커서가 위치한 라인의 데이터만 읽을 수 있습니다.


커서를 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, [email protected])

Lombok에 대한 애플리케이션 예제: 이것은 Java(507p)

◎ 게시물 정보 읽기

1. 작성자가 Winter인 게시물의 정보를 boards 테이블에 가져옵니다.


2. 작성자가 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와 Oracle을 연결하는 예제를 수행했습니다.

MySQL에서 배운 문법과 비슷한 것도 있고 또 다른 것도 있어요!
!

문법이 달라서 헷갈리지 않게 잘 정리해야겠어요!
!

많은 분들의 피드백은 언제나 환영합니다!
댓글 많이 달아주세요~~