Java에서 PreparedStatement를 사용해 MySQL 테이블에 레코드를 삽입하려면 아래와 같은 문법을 사용합니다. SQL 인젝션 공격을 방지하고 쿼리 성능을 향상시킬 수 있어 실무에서 널리 활용되는 방식입니다.
1. INSERT 쿼리 작성하기
먼저 INSERT 문을 문자열로 작성합니다. 값이 들어갈 자리는 물음표(?) 플레이스홀더로 표시합니다.
String anyVariableName = "INSERT INTO yourTableName(yourColumnName1, yourColumnName2, yourColumnName3, .........N)" + "VALUES (?, ?, ?, ..............N)";
2. PreparedStatement로 값 설정하기
다음으로 PreparedStatement 객체를 생성하고, 각 컬럼에 해당하는 값을 setXXX() 메서드로 설정합니다. 데이터 타입에 따라 setInt(), setString(), setDate() 등의 메서드를 선택하면 됩니다.
PreparedstatementObject = con.prepareStatement(query); PreparedstatementObject.setXXX(1, yourValue); PreparedstatementObject.setXXX(2, yourValue); PreparedstatementObject.setXXX(3, yourValue); . . N
3. MySQL 테이블 생성하기
예제 진행에 앞서 MySQL에서 샘플 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 CourseDemo 테이블을 생성합니다.
mysql> create table CourseDemo -> ( -> CourseId int, -> StudentName varchar(20), -> CourseName varchar(30) -> ); Query OK, 0 rows affected (1.86 sec)
4. Java 전체 코드 예제
아래는 PreparedStatement를 활용해 사용자 입력값을 받아 테이블에 레코드를 삽입하는 완전한 Java 코드입니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Scanner;
public class InsertRecordInPreparedStatement {
static int cid;
static String studentName;
static String courseName;
public static void main(String[] args) {
String JdbcURL = "jdbc:mysql://localhost:3306/sample?useSSL=false";
String Username = "root";
String password = "123456";
Connection con = null;
Scanner keyboardInput=new Scanner(System.in);
PreparedStatement pstmt = null;
String query = "INSERT INTO CourseDemo(CourseId, StudentName, CourseName)" + "VALUES (?, ?, ?)";
try {
con = DriverManager.getConnection(JdbcURL, Username, password);
input(keyboardInput);
pstmt = con.prepareStatement(query);
pstmt.setInt(1, cid);
pstmt.setString(2, studentName);
pstmt.setString(3, courseName);
int status = pstmt.executeUpdate();
if(status > 0) {
System.out.println("Record is inserted successfully !!!");
}
} catch(Exception e){
e.printStackTrace();
}
}
public static void input(Scanner keyboardInput) {
System.out.println("Enter the course id:");
cid = keyboardInput.nextInt();
System.out.println("Enter the Student Name:");
studentName = keyboardInput.next();
System.out.println("Enter the Course Name:");
courseName = keyboardInput.next();
}
}실행 결과
위 코드를 실행하면 콘솔에서 과목 ID, 학생 이름, 과목 이름을 순서대로 입력받고, 정상적으로 처리되면 성공 메시지가 출력됩니다.
Enter the course id: 101 Enter the Student Name: John Enter the Course Name: Java Record is inserted successfully !!!
5. 데이터 삽입 결과 확인하기
레코드가 실제로 테이블에 저장되었는지 확인하려면 MySQL에서 sample 데이터베이스를 선택한 뒤 SELECT 문으로 조회합니다.
mysql> select *from CourseDemo;
조회 결과는 다음과 같습니다.
+----------+-------------+------------+ | CourseId | StudentName | CourseName | +----------+-------------+------------+ | 101 | John | Java | +----------+-------------+------------+ 1 row in set (0.00 sec)
이처럼 PreparedStatement를 사용하면 값이 자동으로 이스케이프 처리되어 SQL 인젝션 위험 없이 안전하게 데이터를 삽입할 수 있습니다. 또한 동일한 쿼리를 반복 실행할 때 컴파일된 상태가 재사용되므로 성능 면에서도 유리합니다.