Jdbc template
- 스프링에서 기본으로 제공하는 jdbc api
- dao 클래스 작업을 쉽게 처리할 수 있다.
@Autowired
: 자동으로 타입이 똑같은 객체를 생성해 주입해 줌. (new 나 의존성 주입을 자동으로 처리해줌!)
@Autowired
private JdbcTemplate temp; //JdbcTemplate: db처리 도우미. 스프링이 제공하는 api클래스.
- 생성자를 생성해서 new로 선언하는 방식은 결합력이 높아져서 유지보수가 어려움.
- 의존성 주입(DI - Dependency Injection) --- 결합력을 빼기 위해 씀.
: 필요한 멤버변수 객체를 new 가 아닌 파라메터로 받아서 멤버변수에 할당하는 형태.
- 변경할 일이 있을 때, 코드는 손대지 않고 설정 파일만 수정할 수 있음.
* 의존성 생성하는 설정파일
<beans> // 객체, 인스턴스
<bean id="temp" class="JdbcTemplate"/>
<bean id="memDao" class="com.example.demo.member.MemberDao">
<constructor>temp</constructor> // 이 temp로 소스파일에 의존성을 주입합.
</bean>
</beans>
private JdbcTemplate temp;
// 예전에는 이렇게 new로 선언해줘야 했음. -> 결합력이 높아짐. 유지보수 어려움.
public MemberDao() {
temp = new JdbcTemplate();
}
// 의존성 주입: 필요한 멤버변수 객체를 new가 아닌 파라메터로 받아서 멤버변수에 할당하는 형태.
// 생성자 의존성 주입
public MemberDao(JdbcTemplate temp) {
this.temp = temp;
}
// setter 의존성 주입
public void setTemp(JdbcTemplate temp) {
this.temp = temp;
}
ResultMap 클래스
- 검색 결과를 vo에 맵핑하는 클래스 (select 할 때만 필요)
1. 인터페이스 RowMapper 상속받아야 함. -- 한 줄 검색한 결과를 MemberVo에 담겠다~
2. 자동으로 생성되는 mapRow 추상메서드는 한 줄 마다 한 번씩 호출됨.
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
list.add(new MemberVo(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
}
와 같은 역할을 함. 중복되는 코드를 줄여줌.
// Mapper : 검색한 결과(ResultSet)를 vo에 어떻게 매핑할지 지정하는 클래스.
// 한줄씩 매핑하는 RowMapper 인터페이스를 꼭 상속받아야 함. -> 추상메서드 생성.
public class MemberMapper implements RowMapper<MemberVo>{
@Override
// ResultSet : 검색한 결과가 들어갈 객체.
// 검색된 줄 수(rowNum) 만큼 mapRow 호출됨.
public MemberVo mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
return new MemberVo(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
}
}
* sql 문 실행하는 메서드
JdbcTemplate.update(sql, ? 값) : insert, update, delete 문 실행 (= executeUpdate())
JdbcTemplate.queryForObject(sql, ResultMap, ? 값) : primary key로 한 줄 검색. Vo 반환. ( = executeQuery())
JdbcTemplate.query(sql, ResultMap) : 여러 행 검색. Object 타입 반환. ( = executeQuery())
public void insert(MemberVo m) {
String sql = "insert into member values(?, ?, ?, ?)";
//param1:sql문
//param2:? 매칭 값 배열 (?가 여러개일 때는 들어갈 값을 Object 타입의 배열에 담아 매칭)(배열초기화)
// 모든 타입의 값을 다 넣으려고 Object 타입 배열로 한 것.
temp.update(sql, new Object[] {m.getId(), m.getPwd(), m.getName(), m.getEmail()});
}
public MemberVo select(String id) {
String sql = "select * from member where id=?";
//param1:sql문
//param2:resultMap -- vo에 값을 처리할 방법을 알려주는 mapper 객체.
//param3:? 매칭 값
MemberVo m = null;
try { // 검색 결과가 없으면 에러 떴었음. 예외 처리 코드 추가.
m = temp.queryForObject(sql, new MemberMapper(), id);
} catch (EmptyResultDataAccessException e) {
System.out.println("없는 아이디입니다.");
}
return m;
}
public ArrayList<MemberVo> selectAll(){
String sql = "select * from member";
//param1:sql문
//param2:resultMap
// 다운케스팅. query 는 반환타입이 Object타입이어서.
return (ArrayList<MemberVo>) temp.query(sql, new MemberMapper());
}
0. 총 코드
Dao 클래스 전체 코드
더보기
package com.example.demo.member;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository // new 나 의존성 주입을 자동으로 처리해줌.
public class MemberDao {
@Autowired
private JdbcTemplate temp; //JdbcTemplate: db처리 도우미. 스프링이 제공하는 api클래스.
// // 예전에는 이렇게 new로 선언해줘야 했음. -> 결합력이 높아짐. 유지보수 어려움.
// public MemberDao() {
// temp = new JdbcTemplate();
// }
//
// // 의존성 주입: 필요한 멤버변수 객체를 new가 아닌 파라메터로 받아서 멤버변수에 할당하는 형태.
// // 생성자 의존성 주입
// public MemberDao(JdbcTemplate temp) {
// this.temp = temp;
// }
// // setter 의존성 주입
// public void setTemp(JdbcTemplate temp) {
// this.temp = temp;
// }
// Mapper : 검색한 결과(ResultSet)를 vo에 어떻게 매핑할지 지정하는 클래스.
// 한줄씩 매핑하는 RowMapper 인터페이스를 꼭 상속받아야 함. -> 추상메서드 생성.
public class MemberMapper implements RowMapper<MemberVo>{
@Override
// ResultSet : 검색한 결과가 들어갈 객체.
// 검색된 줄 수(rowNum) 만큼 mapRow 호출됨.
public MemberVo mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
MemberVo m = new MemberVo();
// m.setId(rs.getString(1));
// m.setPwd(rs.getString(2));
// m.setName(rs.getString(3));
// m.setEmail(rs.getString(4));
// return m;
return new MemberVo(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
}
}
//jdbcTemplate.update():insert,update,delete문 실행 (=executeUpdate())
//jdbcTemplate.queryForObject():primary key로 검색, vo 반환. (=executeQuery())
//jdbcTemplate.query(): 여러행검색 (=executeQuery())
public void insert(MemberVo m) {
String sql = "insert into member values(?, ?, ?, ?)";
//param1:sql문
//param2:? 매칭 값 배열 (?가 여러개일 때 들어갈 값을 배열에 담아 매칭)
// 배열 초기화해서 값 넣기
// 모든 타입의 값을 다 넣으려고 Object 타입 배열로 한 것.
temp.update(sql, new Object[] {m.getId(), m.getPwd(), m.getName(), m.getEmail()});
}
public MemberVo select(String id) {
String sql = "select * from member where id=?";
//param1:sql문
//param2:resultMap -- vo에 값을 처리할 방법을 알려주는 mapper 객체.
//param3:? 매칭 값
MemberVo m = null;
try {
m = temp.queryForObject(sql, new MemberMapper(), id);
} catch (EmptyResultDataAccessException e) {
System.out.println("없는 아이디입니다.");
}
return m;
}
public ArrayList<MemberVo> selectAll(){
String sql = "select * from member";
//param1:sql문
//param2:resultMap
// 다운케스팅. query 는 반환타입이 Object타입이어서.
ArrayList<MemberVo> list = (ArrayList<MemberVo>) temp.query(sql, new MemberMapper());
return list;
}
public void update(MemberVo m) {
String sql = "update member set pwd=?, email=? where id=?";
//param1:sql문
//param2:? 매칭 값
temp.update(sql, new Object[] {m.getPwd(), m.getEmail(), m.getId()});
}
public void delete(String id) {
String sql = "delete from member where id=?";
//param1:sql문
//param2:? 매칭 값
temp.update(sql, id);
}
}