카테고리 없음

[JDBC] insert(데이터 삽입)

씨네 2022. 3. 3. 13:19
728x90

1. insert의 Statement 방식

package com.test01;

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

public class MTest04 {

	public static void main(String[] args) {
		insertForStatement();
	}
	
	public static void insertForStatement() {
		Scanner sc = new Scanner(System.in);
		System.out.println("부서번호 입력 : ");
		int deptno = sc.nextInt();
		System.out.println("부서이름 입력 : ");
		String dname = sc.next();
		System.out.println("지역이름 입력 : ");
		String loc = sc.next();
		
		//1. 드라이버연결
		try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		//2. 계정연결
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "cine";
		String password = "cine";
		
		
		Connection con = null;
		
		try {
		 con = DriverManager.getConnection(url, user, password);
		 // con.setAutoCommit(false);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		
		String sql = " INSERT INTO DEPT "
				+ " VALUES( " + deptno + ", '" + dname + "' , '" + loc + "') ";
		
		Statement stmt = null;
		try {
			//3. Query 준비
			stmt = con.createStatement();
			
			//4. Query 실행 및 리턴
			int res = stmt.executeUpdate(sql);
			if(res > 0) {
				System.out.println("입력 성공");
			}else {
				System.out.println("입력 실패");
			}
			
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
		//5. DB종료
			try {
				stmt.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

INSERT 명령을 위한 코드입니다.

이 코드에서 보면 ResultSet이 사용되지 않았습니다.

데이터 삽입명령이기 때문에 데이터를 출력할 필요가 없기 때문입니다.

또한 앞에서는 throws를 했었기에 메인메소드에서 해당 메소드를 호출 할 때 try/catch를 해야하는 번거로움이 있었지만 메소드를 만들때 try/catch를 하면 호출할때 다시 try/catch를 하지 않아도 됩니다.

전체 적인 순서는 select명령을 사용할때와 동일합니다.

//1. 드라이버연결
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}

먼저 드라이버 연결을 해줍니다!

//2. 계정연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "kh";
String password = "kh";
		
Connection con = null;
		
try {
con = DriverManager.getConnection(url, user, password);
// con.setAutoCommit(false);
} catch (SQLException e) {
	e.printStackTrace();
}

2번째 단계로 계정연결이 필요합니다.

try/catch를 하기위해 Connection con = null;로 주고 아래에

con = DriverManager.getConnection(); 을 해주었습니다.

지금은 주석처리 해놓았지만 con.setAutoCommit(false)는 Connection 객체에서 제공하는 메소드입니다.

setAutoCommit은 ture로 기본설정이 되어있습니다.

또한 Connection 객체에서 commit()메소드와 rollback()메소드를 제공하는데 자동 commit 방지를 위해 setAutoCommit을 false로 수동 설정해주는 것입니다.

String sql = " INSERT INTO DEPT "
	     	+ " VALUES( " + deptno + ", '" + dname + "' , '" + loc + "') ";
		
Statement stmt = null;
try {
	//3. Query 준비
	stmt = con.createStatement();
			
	//4. Query 실행 및 리턴
	int res = stmt.executeUpdate(sql);
	if(res > 0) {
		System.out.println("입력 성공");
	}else {
		System.out.println("입력 실패");
	}

3번 단계인 쿼리 준비와 4번 단계인 쿼리 실행 및 리턴을 같이 보겠습니다.

해당 코드에서는 res라는 변수가 select에서와는 다르게 추가 되었습니다.

res는 sql문이 수행되었는지 실패하였는지 확인하기 위한 변수라고 볼 수 있는데요.

stmt.executeUpdate(sql)의 명령이 1번 수행되면 값이 1로 변경됩니다.

이 값을 res에 대입하여 res가 0보다 크면 입력 성공, 이외의 결과이면 입력 실패라는 글자를 출력하게 만든것입니다.

또한 select일때 executeQuery와 다르게 executeUpdate를 사용하였습니다.


2. insert의 PreparedStatement방식

package com.test01;

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

public class MTest04 {

	public static void main(String[] args) {
		insertForPrepared();
	}
	
	
	public static void insertForPrepared() {
		Scanner sc = new Scanner(System.in);
		System.out.println("부서번호 입력 : ");
		int deptno = sc.nextInt();
		System.out.println("부서이름 입력 : ");
		String dname = sc.next();
		System.out.println("지역이름 입력 : ");
		String loc = sc.next();
		
		//1.
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		//2.
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "cine";
		String password = "cine";
		Connection con = null;
		
		try {
			con = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		//3.
		String sql = " INSERT INTO DEPT "
				   + " VALUES (?, ?, ?) ";
		
		PreparedStatement pstm = null;
		
		try {
			//3. Query준비
			pstm = con.prepareStatement(sql);
			pstm.setInt(1,  deptno);
			pstm.setString(2,  dname);
			pstm.setString(3,  loc);
			//4. Query 실행 및 리턴
			int res = pstm.executeUpdate();
			if(res > 0) {
				System.out.println("입력 성공");
			} else {
				System.out.println("입력 실패");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//5. DB종료
			try {
				pstm.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

결과는 Statement와 같습니다! ( 저는 삭제하고 똑같은 값을 다시 넣어보았습니다 )

앞선 select 포스팅에서 말씀 드렸던것 처럼 1번 단계인 드라이버연결, 2번 단계인 계정연결, 5번 단계인 DB종료는 Statement 방식과 PreparedStatement 방식이 동일합니다.

//3.
		String sql = " INSERT INTO DEPT "
				   + " VALUES (?, ?, ?) ";
		
		PreparedStatement pstm = null;
		
		try {
			//3. Query준비
			pstm = con.prepareStatement(sql);
			pstm.setInt(1,  deptno);
			pstm.setString(2,  dname);
			pstm.setString(3,  loc);
			//4. Query 실행 및 리턴
			int res = pstm.executeUpdate();
			if(res > 0) {
				System.out.println("입력 성공");
			} else {
				System.out.println("입력 실패");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {

3번 4번 단계인 Query 준비부터 실행 및 리턴까지의 코드를 보겠습니다.

우선 Statement 객체가 아닌 PreparedStatement객체를 사용할 경우

String sql = " INSERT INTO DEPT VALUES (?, ?, ?) ";

SQL명령에 ?가 들어갑니다.

//3. Query준비
pstm = con.prepareStatement(sql);
pstm.setInt(1,  deptno);
pstm.setString(2,  dname);
pstm.setString(3,  loc);

해당 ?에 들어갈 값들을 미리 준비합니다.

int res = pstm.executeUpdate();

SQL명령이 잘 수행 되었다면 res에는 1이라는 값이 대입이 되어있어야 합니다.

728x90