n. JDBC Framework(미완) - kimxavi/spring_tutorial GitHub Wiki
plain old JDBC 를 사용해서 데이터베이스를 작동할 때, 예외 처리나 데이터베이스의 연결을 열고 닫고 등등 불필요한 코드가 작성되어 복잡하고 느리게 된다. 그러나 스프링 JDBC 프레임워크는 모든 낮은 레벨의 연결을 여는 것과 실행할 SQL 문장을 준비하는 것과 예외를 진행하는 것 트랜잭션 관리, 마지막으려 연결을 닫는 것 등등의 상세를 관리한다. 그래서 해야할 것은 단지 연결 인자를 정의하고 실행될 SQL 문장을 명시하고 fetch될 데이터를 데이터베이스로 부터 반복하는 작업을 하는 것이다. 스프링 JDBC는 몇 개의 접근과 상응하는 다른 클래스의 데이터베이스 인터페이스를 제공한다. 프레임워크의 JdbcTemplate 클래스를 사용하여 전형적이고 대중적인 접근을 할 것이다. 이것은 모든 데이터베이스와 커뮤니케이션하고 예외처리하는 중심되는 프레임워크 클래스이다.
JdbcTemplate 클래스는 SQL 쿼리들을 실행하고, stored procedure calls와 statements를 업데이트하고, ResultSets와 반환된 인자값의 반복문을 실행한다. JDBC 예외를 catch 하고 그것들을 좀 더 일반적이고, 유용하고, org.springframework.dao 에 계층을 정의하도록 한다. JdbcTemplate과 클래스의 인스턴스가 구성되면 스레드로부터 안전합니다. 그래서 JdbcTemplate 를 설정하고 그 다음 다양한 DAO 에 이것의 공유된 레퍼런스를 안전하게 주입할 수 있습니다. JdbcTemplate를 사용할 때 가장 흔한 관습은 스프링 설정 파일에 DataSource를 설정하는 것 입니다. 그리고 그 다음에 DAO에 공유된 DataSource를 의존성 주입하고 JdbcTemplate는 DataSource에 대한 setter에 생성됩니다.
MySQL 데이터 테이블 생성
CREATE TABLE Student(
ID INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
PRIMARY KEY (ID)
);
JdbcTemplate에 DataSource를 공급한다. 이 것은 데이터 베이스 접근을 할 수 있도록 설정한다. 아래와 같이 XML 파일에 작성한다.
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/TEST"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
DAO는 흔하게 데이터베이스와 상호작용하도록 사용된다. DAO는 데이터베이스를 읽고 쓰는 방법을 제공하기 위해서 존재한다. 그리고 이들은 애플리케이션의 나머지 부분에 액세스 할 때 사용하는 인터페이스를 통해 이 기능을 노출한다. 스프링에서의 DAO 지원은 일관적인 방법으로 JDBC, Hibernate, JPA, JDO 같은 기술을 사용해서 쉽게 작동하도록 한다.
정수를 받는 쿼리
String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );
Long 타입 쿼리
String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );
변수를 bind해서 간단히 사용.
String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});
String 을 받는 쿼리
String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);
객체를 받는 쿼리
String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(SQL,
new Object[]{10}, new StudentMapper());
public class StudentMapper implements RowMapper<Student> {
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setID(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
}
}
많은 객체들을 리턴 받는 쿼리
String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(SQL,
new StudentMapper());
public class StudentMapper implements RowMapper<Student> {
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setID(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
}
}
테이블에 row 삽입
String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );
테이블 row 업데이트
String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );
테이블에서 row를 삭제
String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );
execute(...)를 사용해서 jdbcTemplate가 SQL statements or DDL statements를 실행할 수 있다.
String SQL = "CREATE TABLE Student( " +
"ID INT NOT NULL AUTO_INCREMENT, " +
"NAME VARCHAR(20) NOT NULL, " +
"AGE INT NOT NULL, " +
"PRIMARY KEY (ID));"
jdbcTemplateObject.execute( SQL );