티스토리 뷰

JDBC

데이터 입력 / PreparedStatement

Programmers 2021. 4. 30. 13:33
반응형

Program.java파일을 복사해서 Program2.java 파일을 생성하고 실습을 진행

Program2.java 수정 전 코드

package ex1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Program2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		String url = "jdbc:oracle:thin:@192.168.219.103:1521/XE";
		String sql = "SELECT * FROM NOTICE WHERE hit >= 10";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(url, "corini", "111111");
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql);
		
		while(rs.next()) {
			int id = rs.getInt("ID");
			String title = rs.getString("TITLE");
			String writerId = rs.getString("WRITER_ID");
			Date regDate = rs.getDate("REGDATE");
			String content = rs.getString("CONTENT");
			int hit = rs.getInt("hit");
					
			System.out.printf("id: %d, title: %s, writerId: %s, regDate: %s, content: %s, hit: %d\n", id, title, writerId, regDate, content, hit); 
		}
				
		rs.close();
		st.close();
		con.close();
			
	}

}

 

코드 내에서 insert를 할 때 사용하지 않는 코드는 먼저 삭제하고 시작

package ex1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Program2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		String url = "jdbc:oracle:thin:@192.168.219.103:1521/XE";
		String sql = "SELECT * FROM NOTICE";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(url, "corini", "111111");
		Statement st = con.createStatement();
						
		rs.close();
		st.close();
		con.close();
			
	}

}

SELECT문을 사용 할때에는 Query를 사용하여 결과 집합을 얻지만 insert, update, delete에는 Update를 사용한다.
executeQuery(String sql): ResltSet 반환
excuteUpdate(String sql): int 반환

INSERT INTO notice (
    title,
    writer_id,
    content,
    files
) VALUES (
    'TEST',
    'newlec',
    'content test',
    ''
);

이전에 만들어둔 INSERT 쿼리문을 복사 후 Program2.java의 String url = 코드에 복붙.

이클립스가 오버워크

 

이클립스가 내려쓰기를 하면서 \r\n 이라는 문장을 추가로 넣어줬다(쿼리문으로 실행하면 문제가 발생) 
나름 일을 열심히 하지만 이런 오류는... 직접 수정해주어야 한다. 

복잡한 쿼리문

쿼리문으로 수정하면서 '"+title+"' 이렇게 코드가 너무 복잡해졌다. 실수할 가능성이 높아진다.
이럴 때는 PreparedStatement도국 사용하면 쉽게 코드를 작성할 수 있다.

PeparedStatement
: JDBC의 쿼리문을 쉽게 작성할 수 있도록 도와주는 도구

package ex1;

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

public class Program2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		/*title, writerId, content, files를 정의*/
		String title = "TEST";
		String writerId ="newlec";
		String content = "content test";
		String files = "";
		
		
		String url = "jdbc:oracle:thin:@192.168.219.103:1521/XE";
		
		/*INSERT SQL문 */
		String sql = "INSERT INTO notice ("
				+ "    title,"
				+ "    writer_id,"
				+ "    content,"
				+ "    files"
				+ ") VALUES (?,?,?,?)";	//PreparedStatement를 통한 전달
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(url, "corini", "111111");
		
		/*PreparedStatement도구 사용*/
		PreparedStatement st = con.prepareStatement(sql);	
			//sql문 prepareStatement를 이용해서 st에 저장
		
		/*preparedStatement이용, setString(인덱스값[1부터], 변수)로 저장 */
		st.setString(1, title);
		st.setString(2, writerId);
		st.setString(3, content);
		st.setString(4, files);
		
		/*preparedStatement를 사용 할때에는 sql문을 전달하지 않는다! 이미 전달 되어있다.*/
		int result = st.executeUpdate();
			//excuteUpdate는 int로 실행된 row값을 result에 전달
		
		System.out.println(result);
	
				
		st.close();
		con.close();
			
	}

}

주석 처리된 부분들을 다시 확인하면서 코드를 이해해보자. 
PreparedStatement의 사용법

		/*INSERT SQL문 */
		String sql = "INSERT INTO notice ("
				+ "    title,"
				+ "    writer_id,"
				+ "    content,"
				+ "    files"
				+ ") VALUES (?,?,?,?)";	//PreparedStatement를 통한 전달

SQL문에서 VALUES (?,?,?,?)로 전달


		
		/*PreparedStatement도구 사용*/
		PreparedStatement st = con.prepareStatement(sql);	
			//sql문 prepareStatement를 이용해서 st에 저장
		
		/*preparedStatement이용, setString(인덱스값[1부터], 변수)로 저장 */
		st.setString(1, title);
		st.setString(2, writerId);
		st.setString(3, content);
		st.setString(4, files);
		
		/*preparedStatement를 사용 할때에는 sql문을 전달하지 않는다! 이미 전달 되어있다.*/
		int result = st.executeUpdate();
			//excuteUpdate는 int로 실행된 row값을 result에 전달

PreparedStatement를 정의 및 변수 저장, 결과 실행
PreparedStatement st = con.preparedStatement(sql);
st.setString(인덱스, 변수);
st.excuteUpdate();

 

INSERT 쿼리문 실행결과1

한 개의 쿼리문이 실행되었다는 결과를 확인

INSERT 쿼리문 실행결과2

사용방법은 알고 있으나 여러 번 직접 실습을 해보아야 내 것이 될 것임.

반응형

'JDBC' 카테고리의 다른 글

데이터 수정  (0) 2021.04.30
데이터 수정을 위한 쿼리 준비  (0) 2021.04.30
데이터 입력을 위한 쿼리 준비  (0) 2021.04.30
SQL을 잘 해야하는 이유  (0) 2021.04.30
레코드의 모든 컬럼 출력하기  (1) 2021.04.29
댓글
공지사항