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 |