본문 바로가기

Java

[JDBC] PreparedStatement를 이용해 동적으로 SQL 처리하기

이번 주제에서 알아볼 것은 Java에서 동적으로 SQL을 처리하는 방법을 알아보겠습니다.


 

 

일단 PreparedStatement(java.sql.PreparedStatement)는 Statement 보다 향상된 기능을 가지고 있습니다.

 

주요 특징

- 인자값으로 전달이 가능하다.

- 가독성이 높다.

- 기존 Statement 보다 성능이 좋다.

 

이전 Statement가 궁금하시면 https://aricode.tistory.com/10를 참고해주세요! 

 

[JDBC] ResultSet을 통해 결과값을 불러오기

이번 주제에서 알아볼 것은 Java에서 조회한 결과값을 출력하는 방법을 알아보겠습니다. 이번에 데이터베이스를 Mysql에서 Oracle로 바꿨습니다. 주의 해서 봐주시기 바랍니다. ResultSet(java.sql.ResultSe

aricode.tistory.com

 

package jdbc;

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

public class DBConnection {

	private Connection con;
	private ResultSet rs;
	private PreparedStatement pstmt;

	public DBConnection() {
		try {
			//url 수정했습니다.
			String url = "jdbc:mysql://localhost/coffee?characterEncoding=UTF-8&serverTimezone=UTC";
			String user = "root";
			String passwd = "1234";

			con = DriverManager.getConnection(url, user, passwd);
			System.out.println("DB연결 성공");
			
			pstmt = con.prepareStatement("select * from Example");
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
			}
			
			rs.close();
			pstmt.close();
			con.close();

		} catch (SQLException e) {
			System.out.println("DB연결 실패하거나, SQL문이 틀렸습니다.");
			System.out.print("사유 : " + e.getMessage());
		}
	}

	public static void main(String[] args) {
		new DBConnection();
	}

}

위 코드를 보시면 url을 수정했습니다. 유의해 주시기 바랍니다.

이렇게만 보면 PrepareStatement와 기존 Statement차이가 거의 나지 않는다. (약간의 성능은 좋아질 수 있습니다.)


하지만 PrepareStatement는 데이터 값을 추가해야 할 때 차이가 확연히 드러난다.

예시를 보여 드리겠습니다.

 

int number = 1;
String name = "라떼";

stmt = con.createStatement();
stmt.executeQuery("select * from Example where c_no = "+ number +" and c_name = '"+ name +"'");

pstmt = con.prepareStatement("select * from Example where c_no = ? and c_name = ?");
pstmt.setInt(1, number);
pstmt.setString(2, name);

기존 Statement를 이용해서 데이터를 넣어줄려면 값을 직접 작성해야 했다.

하지만, PrepareStatement메서드와, "?" 이것을 이용해서 데이터를 전달할 수 있다.

 

만약 집어 넣어야 할 데이터가 많아진다면 Statement의 쿼리는 정말 지저분하게 될것이다.

그렇기에 PrepareStatement 클래스를 통해 가독성과, 효율성을 둘다 챙길 수 있는 좋은 방법을 사용한다.


 

set타입은 작성한 SQL문에 있는 ? 라는 값을 바꿔주는 역할이다 *중요*

예시) 번째 ?를 숫자형 100으로 변경하고 싶으면 setInt(1, 100) 형식으로 작성하면 된다.

 

다양한 데이터 타입으로 값을 지정해 줄 수 있다.

 


마지막으로 해야하는것은 Statement때와 다르게 PrepareStatementexecute를 따로 해야한다.

여기서도 executeQuery, executeUpdate 메소드를 사용해야 한다.

(두 메소드의 대한 설명https://aricode.tistory.com/9에 나와있으니 참고 부탁드립니다!)

 

package jdbc;

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

public class DBConnection {
	
	private Connection con;
	private PreparedStatement pstmt;
	private ResultSet rs;
	private Statement stmt;

	public DBConnection() {
		try {
			String url = "jdbc:mysql://localhost/coffee?characterEncoding=UTF-8&serverTimezone=UTC";
			String user = "root";
			String passwd = "1234";
			
			con = DriverManager.getConnection(url, user, passwd);
			System.out.println("DB연결 성공");
			
			int number = 1;
			String name = "라떼";
			
//			stmt = con.createStatement();
//			stmt.executeQuery("select * from Example where c_no = "+ number +" and c_name = '"+ name +"'");
			
			pstmt = con.prepareStatement("select * from Example where c_no = ? and c_name = ?");
			pstmt.setInt(1, number);
			pstmt.setString(2, name);
			
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
			}
			
			rs.close();
			pstmt.close();
			con.close();
			
		} catch (SQLException e) {
			System.out.println("DB연결 실패하거나, SQL문이 틀렸습니다.");
			System.out.println("사유 : " + e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		new DBConnection();
	}
}

 

쿼리문이 성공하면 결과값으로 "1 라떼" 데이터가 출력된걸 확인할 수 있다.

 

조건에 '1'과 '라떼 조건이 제대로 수행됐다.

 

 

 

JDBC 부분은 이걸로 끝이 났습니다.

이 외에도 많은 내용지 있지만, 제가 충분히 내용을 숙지하고 작성하기 위해서 시간은 오래 걸릴거 같습니다.

그래서 가끔은 일상 관련해서 글을 작성해 볼려고 합니다.

 

저번에 1달 1이상 글작성을 목표로 했는데 건강 문제도 있고해서, 취소하겠습니다 죄송합니다.

그래도 제 글을 보기 위해서 들어와 주신 모든 분들께 너무 감사드립니다.