반응형
스프링 JdbcTemplate 리포지토리 생성
설정은 Jdbc 설정과 동일하게 하면 된다.
스프링 Jdbc Data Access Layer 이해
DataSource 란?
- DB와 관계된 Connection 정보를 담고 있으며, bean으로 등록하여 인자로 넘겨준다.
이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다.
DataSource 설정 및 빈 등록방법
application.properties
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
#url : db의 url을 넣어주면 자동으로 connection이 됨.
spring.datasource.driver-class-name=org.h2.Driver
#h2를 사용 할 것이기 때문에
springConfig.java
파일을 생성하여 빈 설정 파일에 아래 코드를 추가해준다.
package me.iseunghan.plainjdbc;
import me.iseunghan.plainjdbc.Accounts.AccountRepository;
import me.iseunghan.plainjdbc.Accounts.AccountService;
import me.iseunghan.plainjdbc.Accounts.JdbcAccountRepository;
import me.iseunghan.plainjdbc.Accounts.JdbcTemplateAccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.management.MXBean;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
private final DataSource dataSource;//이미 spring이 등록해놨기때문에 주입 받아서 사용하면 된다.
JdbcAccountRepository jdbcAccountRepository;
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
public AccountService accountService() {
return new AccountService(accountRepository());
}
@Bean
public AccountRepository accountRepository() {
//return new JdbcAccountRepository(dataSource);
return new JdbcTemplateAccountRepository(dataSource);
}
}
JdbcTemplate 란?
JDBC Template
은Spring JDBC
접근 방법 중 하나로, 내부적으로Plain JDBC API
를 사용하지만 위와 같은 문제점들을 제거한 형태의 Spring에서 제공하는 class이다. 편리하다.
JdbcTemplate Repository code
package me.iseunghan.plainjdbc.Accounts;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import javax.sql.DataSource;
public class JdbcTemplateAccountRepository implements AccountRepository{
private final JdbcTemplate jdbcTemplate;
//DataSource를 주입받아 JdbcTemplate 생성자에게 파라미터로 넘겨준다.
public JdbcTemplateAccountRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Account save(Account account) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("Account").usingGeneratedKeyColumns("id");
Map<String, Object> parameter = new HashMap<>();
parameter.put("name", account.getName());
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameter));
account.setId(key.longValue());
return account;
}
@Override
public Optional<Account> findById(Long id) {
List<Account> result = jdbcTemplate.query("select * from Account where id = ?", accountRowMapper(), id);
return result.stream().findAny();
}
@Override
public Optional<Account> findByName(String name) {
List<Account> result = jdbcTemplate.query("select * from Account where name = ?", accountRowMapper(), name);
return result.stream().findAny();
}
@Override
public List<Account> findAll() {
return jdbcTemplate.query("select * from Account",accountRowMapper());
}
private RowMapper<Account> accountRowMapper() {
return (rs, i) -> {
Account account = new Account();
account.setId(rs.getLong("id"));
account.setName(rs.getString("name"));
return account;
};
}
// lamda를 이용한 표현
/*private RowMapper<Account> accountRowMapper() {
return new RowMapper<Account>() {
@Override
public Account mapRow(ResultSet rs, int i) throws SQLException {
Account account = new Account();
account.setId(rs.getLong("id"));
account.setName(rs.getString("name"));
return account;
}
};
}*/
}
반응형