자바 공부/스프링공부

JDBCTemplate 사용하기

ari0930 2024. 5. 13. 00:24

JDBCTemplate 사용하기 

-좀 더 간단하게 db와 연결할 수 있게 해 준다.

 

db 설정

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.apache.commons.dbcp2.BasicDataSource;


public class AppConfig {


    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("username");
        dataSource.setPassword("password");
        return dataSource;
    }


    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

 

db동작 부분 소스 (공통)

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

외부에서 의존성을 주입하여 jdbcTemplate 객체를 사용하기 위한 코드

db 설정 코드를 bean등록해야한다 그래야지 의존성 주입이 가능핟.

 

데이터 전체 조회

    public List<User> getUserById(long userId) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.query(sql, new Object[]{userId}, new RowMapper<User>() {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setUsername(rs.getString("username"));
            user.setEmail(rs.getString("email"));
            return user;
        }
    });
}

 

데이터 삽입

ublic void addUser(User user) {
    String sql = "INSERT INTO users (username, email) VALUES (?, ?)";
    jdbcTemplate.update(sql, user.getUsername(), user.getEmail());
}

jdbcTemplate.update(쿼리문,? 에 넣을 값 1,? 에 넣을 값 2);

이렇게 해서 사용할 수 있다.

 

데이터 업데이트

public void updateUser(User user) {
    String sql = "UPDATE users SET username = ?, email = ? WHERE id = ?";
    jdbcTemplate.update(sql, user.getUsername(), user.getEmail(), user.getId());
}

데이터 삽입하고 같다.

 

데이터 삭제

public void deleteUser(Long id) {
    String sql = "DELETE FROM users WHERE id = ?";
    jdbcTemplate.update(sql, id);
}

이것 또한 데이터 삽입하고 방식은 같다.

 

한건만 조회하기

public User getUserById(long userId) {
    String sql = "SELECT * FROM users WHERE id = ?";
    return jdbcTemplate.queryForObject(sql, new Object[]{userId}, new RowMapper<User>() {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setUsername(rs.getString("username"));
            user.setEmail(rs.getString("email"));
            return user;
        }
    });

 

 

만약 쿼리문의? 부분에 좀 더 직관적으로 코드를 짜고 싶다면 NamedParameterJdbcTemplate을 이용할 수 있다.

 

NamedParameterJdbcTemplate 을 사용할 경우는 어떻게 짜야할까?

 

db설정

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.apache.commons.dbcp2.BasicDataSource;

public class AppConfig {


    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("username");
        dataSource.setPassword("password");
        return dataSource;
    }


}

 

db동작 코드

import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserDao {

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);
    public UserDao(DataSource dataSource) {
        this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    public List<User> getAllUsers() {
        String sql = "SELECT * FROM users";
        return namedParameterJdbcTemplate.query(sql,rowMapper);
    }

    public User getUserById(long userId) {
        String sql = "SELECT * FROM users WHERE id = :userId";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("userId", userId);
        return namedParameterJdbcTemplate.queryForObject(sql, paramMap, rowMapper);
    }

    public void addUser(User user) {
        String sql = "INSERT INTO users (username, email) VALUES (:username, :email)";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("username", user.getUsername());
        paramMap.put("email", user.getEmail());
        namedParameterJdbcTemplate.update(sql, paramMap);
    }

    public void updateUser(User user) {
        String sql = "UPDATE users SET username = :username, email = :email WHERE id = :userId";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("username", user.getUsername());
        paramMap.put("email", user.getEmail());
        paramMap.put("userId", user.getId());
        namedParameterJdbcTemplate.update(sql, paramMap);
    }

    public void deleteUser(long userId) {
        String sql = "DELETE FROM users WHERE id = :userId";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("userId", userId);
        namedParameterJdbcTemplate.update(sql, paramMap);
    }
}

쿼리문에? 부분을 :[이름]을사용하여 파라미터를 맵핑해 바인드 하여 사용하였다.

또한 데이터 소스( DataSource dataSource )를 이용하여 NamedParameterJdbcTemplate 객체를 생성하고, 이를 클래스의 멤버 변수인 namedParameterJdbcTemplate에 할당하는 역할을 한다.

 

 

반응형