Spring JDBC
1 minute read
Spring JDBC 학습 테스트
- Querying
- queryForObject(쿼리문, 기댓값타입)
public int count() {
String sql = "select count(*) from customers";
return jdbcTemplate.queryForObject(sql, Integer.class);
}
- queryForObject(쿼리문, 기댓값타입, ?표 자리 값)
public String getLastName(Long id) {
String sql = "select last_name from customers where id = ?";
return jdbcTemplate.queryForObject(sql, String.class, id);
}
- query(쿼리문, rowMapper)
public List<Customer> findAllCustomers() {
String sql = "select id, first_name, last_name from customers";
return jdbcTemplate.query(sql, (resultSet, rowNum) -> {
return new Customer(
resultSet.getLong("id"),
resultSet.getString("first_name"),
resultSet.getString("last_name")
);
});
}
- queryForObject(쿼리문, rowMapper, ?표 자리 값) / query(쿼리문, 기댓값타입, ?표 자리 값)
rowMapper는 쿼리문에 여러 값을 전달해야할 때 사용할 수 있는 것이다.
public Customer findCustomerById(Long id) {
String sql = "select id, first_name, last_name from customers where id = ?";
RowMapper<Customer> rowMapper = (resultSet, rowNum) -> {
Customer customer = new Customer(
resultSet.getLong("id"),
resultSet.getString("first_name"),
resultSet.getString("last_name")
);
return customer;
};
return jdbcTemplate.queryForObject(sql, rowMapper, id);
}
public List<Customer> findCustomerByFirstName(String firstName) {
String sql = "select id, first_name, last_name from customers where first_name = ?";
return jdbcTemplate.query(sql, (resultSet, rowNum) -> {
return new Customer(
resultSet.getLong("id"),
resultSet.getString("first_name"),
resultSet.getString("last_name")
);
}, firstName);
}
- Updating
- insert: update(쿼리문, ?표 개수만큼 추가)
public void insert(Customer customer) {
String sql = "insert into customers (first_name, last_name) values (?, ?)";
jdbcTemplate.update(sql, customer.getFirstName(), customer.getLastName());
}
- delete: update(쿼리문, ?표 개수만큼 추가): 삭제한 것 id 반환
public int delete(Long id) {
String sql = "delete from customers where id = ?";
return jdbcTemplate.update(sql, id);
}
- update(PreparedStatementCreator psc, Keyholder keyholder): 쿼리 결과로 변경된 행의 개수 리턴
자동 생성된 키 값을 알아낼 수 없기 때문에 keyholder를 사용한다.
이 keyHolder의 두번째 인자에는 자동 생성되는 컬럼의 이름을 넣는다.
public long insertWithKeyHolder(Customer customer) {
final String sql = "insert into customers (first_name, last_name) values (?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, new String[] {"id"}); //여기에 자동생성되는 컬럼의 이름을 넣는다.
ps.setString(1, customer.getFirstName());
ps.setString(2, customer.getLastName());
return ps;
}, keyHolder);
return keyHolder.getKey().longValue();
}
- NamedParameterJdbcTemplate
NamedParameterJdbcTemplate: ?가 있는ㄴ 쿼리문을 실행시켜주는 jdbcTemplate
MapSqlParameterSource: SqlParameterSource 중 하나로 이름과 요소를 매핑해주는 것
BeanPropertySqlParameterSource: javaBean 객체 자체를 넘겨 매핑해주는 것
public T queryForObject(String sql, SqlParameterSource paramSource, Class requiredType): (쿼리문, 전달할source, 기댓값타입)
public int useMapSqlParameterSource(String firstName) {
String sql = "select count(*) from customers where first_name = :first_name";
SqlParameterSource mapSqlParameterSource = new MapSqlParameterSource("first_name", firstName);
return this.namedParameterJdbcTemplate.queryForObject(sql, mapSqlParameterSource, Integer.class);
}
public int useBeanPropertySqlParameterSource(Customer customer) {
String sql = "select count(*) from customers where first_name = :firstName";
SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(customer);
return this.namedParameterJdbcTemplate.queryForObject(sql, sqlParameterSource, Integer.class);
}