
💡JDBCTemplate 구조 정리
JDBCTemplate 이란?
JDBCTemplate 선언 및 생성
//Repository에 선언
private final JdbcTemplate jdbcTemplate;
@Autowired
CalendarRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
//build.gradle 에 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
JDBCTemplate 메서드 종류
사용법
//기본형식
queryForObject(sql문, 반환타입지정(RowMapper), 바인딩 될 파라미터,..)
//바인딩 데이터를 배열로 전달(Object[])
queryForObject(sql문, 바인딩 될 파라미터 배열, 반환타입지정(RowMapper))
// 정수 리턴
String sql = "SELECT COUNT(*) FROM users";
int count = jdbcTemplate.queryForObject(sql, Integer.class);
// 문자열 리턴
String sql = "SELECT name FROM users WHERE id = ?";
String name = jdbcTemplate.queryForObject(sql, String.class, 1);
//배열로 전달
String sql = "SELECT COUNT(*) FROM users WHERE role = ? AND active = ?";
Object[] params = { "admin", true };
int count = jdbcTemplate.queryForObject(sql, params, Integer.class);
String sql = "SELECT id, name, email FROM users WHERE id = ?";
UserDto user = jdbcTemplate.queryForObject(sql,
(rs, rowNum) -> {
UserDto dto = new UserDto();
dto.setId(rs.getInt("id"));
dto.setName(rs.getString("name"));
dto.setEmail(rs.getString("email"));
return dto;
},
1
);
//rs : ResultSet
//rowNum : 현재 행의 인덱스 (사용하지 않아도 필수로 넘겨야 한다.)
//반환값은 List<Map<String, Object>> 이다.
List<Map<String, Object>> result = jdbcTemplate.queryForList(String sql, Object... args);
String sql = "SELECT id, name, email FROM users WHERE role = ?";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, "admin");
for (Map<String, Object> row : result) {
int id = (Integer) row.get("id");
String name = (String) row.get("name");
String email = (String) row.get("email");
System.out.println(name + " : " + email);
}
//컬럼명을 key로 가지는 Map이 row마다 생성됨
//타입 캐스팅 필요 ((String), (Integer) 등)
String sql = "SELECT id, name, email FROM users WHERE role = ?";
//일반적 사용
List<UserDto> result = jdbcTemplate.query(sql,
(rs, rowNum) -> {
UserDto dto = new UserDto();
dto.setId(rs.getInt("id"));
dto.setName(rs.getString("name"));
dto.setEmail(rs.getString("email"));
return dto;
},
"admin"
);
//배열로 전달
String sql = "SELECT id, name, email FROM users WHERE role = ? AND active = ?";
Object[] params = { "admin", true };
List<UserDto> users = jdbcTemplate.query(
sql,
params,
(rs, rowNum) -> {
UserDto dto = new UserDto();
dto.setId(rs.getInt("id"));
dto.setName(rs.getString("name"));
dto.setEmail(rs.getString("email"));
return dto;
}
);
//DTO 필드명과 컬럼명이 정확히 일치할 경우 사용 가능
UserDto user = jdbcTemplate.queryForObject(
sql,
new BeanPropertyRowMapper<>(UserDto.class),
1
);
//반환값은 영향을 받은 row 수(int)
update(sql 쿼리, 바인딩될 파라미터들)
//INSERT
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
int rows = jdbcTemplate.update(sql, "아이유", "iu@example.com");
//UPDATE
String sql = "UPDATE users SET name = ? WHERE id = ?";
int rows = jdbcTemplate.update(sql, "아이유", 3);
//DELETE
String sql = "DELETE FROM users WHERE id = ?";
int rows = jdbcTemplate.update(sql, 5);
//배열로 전달
String sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
Object[] params = { "홍길동", 30, "hong@example.com" };
int rows = jdbcTemplate.update(sql, params);