Published 2022. 9. 27. 09:22

PreparedStatement

 

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

PreparedStatement 는 statement 와 달리 캐시를 사용한다. 객체를 캐시에 담아 재사용한다.

그래서 반복적으로 쿼리를 수행한다면 statement 에 비해 성능이 좋다

또한 SQL Injection 방어에 유리하다.

 

저장할 데이터에 해당하는 VALUES 의 값에 물음표(?) 를 쓴다.

이 물음표에 pstmt.setString(1, user.getId()); 를 사용해 값을 넣어준다.

1 과 같은 숫자의 의미는 인덱스에 해당하는 물음표의 순번이다.

 

pstmt.executeUpdate(); 는 INSERT, UPDATE, DELETE 와 같은 명령을 실행할 때 사용

int 값을 반환하는데 이는 영향 받은 로우행 개수이다.

executeQuery 는 Result Set 을 만드는 Sql 문에서 사용하며, 주로 SELECT 문을 수행할 때 사용된다.

package com.jcy.usedhunter;

import static org.junit.Assert.assertTrue;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Date;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.jcy.usedhunter.domain.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class DBConnectionTest2Test{
	
	@Autowired
	DataSource ds;
	
	// 사용자 정보를 user_info 테이블에 저장하는 메서드
	public int insertUser(User user) throws Exception{
		Connection conn = ds.getConnection();
		
//		INSERT INTO `usedhunter`.`user_info`(`id`,`pwd`,`name`,`email`,`birth`,`sns`,`reg_date`)
//		VALUES('asdf2','1234','smith','aaa@aaa.com','2021-01-01','facebook',now());

		String sql = "INSERT INTO `usedhunter`.`user_info` VALUES(?, ?, ?, ?, ?, ?, now())";
		
		PreparedStatement pstmt = conn.prepareStatement(sql); // SQL injection 방어에 유리, 성능 향상
		pstmt.setString(1, user.getId());
		pstmt.setString(2, user.getPwd());
		pstmt.setString(3, user.getName());
		pstmt.setString(4, user.getEmail());
		pstmt.setDate(5, new java.sql.Date(user.getBirth().getTime())); // util.Date 인 user.getBirth() 를 sql.Date 로 변환
		pstmt.setString(6, user.getSns());
		
		int rowCnt = pstmt.executeUpdate(); // 영향 받은 로우행 개수 반환, insert, delete, update 에 사용
		return rowCnt;
	}
	
	@Test
	public void insertUserTest() throws Exception{
		User user = new User("asdf", "1234", "adb", "aaa@aaa.com", new Date(), "facebook", new Date());
		int rowCnt = insertUser(user);
		
		assertTrue(rowCnt==1);
		
	}
	@Test
	public void main() throws Exception{
//		ApplicationContext ac = new GenericXmlApplicationContext("file:src/main/webapp/WEB-INF/spring/**/root-context.xml");
//	      DataSource ds = ac.getBean(DataSource.class);

	      Connection conn = ds.getConnection(); // 데이터베이스의 연결을 얻는다.

	      System.out.println("conn = " + conn);
	      assertTrue(conn!=null); // 괄호 안의 조건식이 true면 테스트 성공, 아니면 실패
	}
}

 

 

 

'JDBC' 카테고리의 다른 글

JDBC 반복 문제 해결 - JdbcTemplate  (0) 2022.08.10
스프링 예외 추상화 적용  (0) 2022.08.10
스프링 예외 추상화 이해  (0) 2022.08.09
데이터 접근 예외 직접 만들기  (0) 2022.08.09
런타임 예외 적용  (0) 2022.08.09
복사했습니다!