쉽지않은 블로그
spring-JDBC 라이브러리-3 본문
쿼리를 실행하는 예제
필요한 파일들
1.DTO , DAO 가 필요함 (정의해줘야 됨)
2.query문이 필요함
3.DAO에 CRUD 역할을 하는 메서드를 만들어야 된다
4.NamedParameterJdbcTemplate 같은 객체가 필요함 (스프링 jdbc가 제공함)
파일 구조
DTO
DTO (Data Transfer Object)를 의미함
보통 원하는 데이터베이스의 table의 속성에 맞게 변수를 가지는 게 보통이며 표기법에 주의해야 한다
(예를 들어 mysql에서 속성명이 sale_price 였다면 DTO 변숫값을 salePrice로 camel case로 변환해야 jdbc라이브 러리가 알아서 mapping 해준다
jdbc.core.BeanPropertyRowMapper 가 알아서 해줌
)
일반적으로 getter , setter를 가지고
toString (console을 찍어보기 위함)
equals() , hashCode() 등의 Object 메서드를 overriding 할 수 있다.
package kr.or.connect.daoexam.dto;
public class Role {
private int roleId;
private String description;
public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Role [roleId=" + roleId + ", description=" + description + "]";
}
}
DAO
(Data access object)를 의미함
데이터베이스를 조작하는 기능을 의미함
실제 access 하는 로직을 채워주는 공간
0.Repository annotation을 사용함 (spring-context에 빠르게 사용하는 해당 Bean 객체를 생성)
1.DAO 가 실제 DATA를 얻어올 때는 NamedParameterJdbcTemplate이나 SimpleJdbcInsert를 사용하게 됨
이름을 이용해서 바인딩하거나 결괏값을 가져올 수 있음.
(원래 기존 썼던 preparedSQL 방식은 "?" 표기법이 식별성이 좋지 않음)
2. 스프링 버전 4.3 이상부터는 ComponentScan으로 객체를 찾았을 때 기본 생성자가 없으면 자동으로 채워줌
(DB.config 에 등록된 Bean을 빠르게 채워줌)
3. jdbc.query ( static 쿼리 , 비어있는 객체 , rowMapper)
sql문에 바인딩할 값이 있을 경우 바인딩할 값을 가져오는 목적
rowMapper : select의 결과를 DTO에 담을 목적으로 사용함
insert 문을 실행하기 위해서는 SimleJdbcInsert 객체를 사용해야 된다.
update 문을 실행하기 위해선 jdbc.update 메서드로 updatesql 구문과 같이 전달해주어야 한다.
package kr.or.connect.daoexam.dao;
import static kr.or.connect.daoexam.dao.RoleDaoSqls.*;
//실제 상수로 저장된 쿼리문을 불러오는 부분
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import kr.or.connect.daoexam.dto.Role;
@Repository
public class RoleDao {
private NamedParameterJdbcTemplate jdbc;
private SimpleJdbcInsert insertAction;
private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);
public RoleDao(DataSource dataSource) {
this.jdbc = new NamedParameterJdbcTemplate(dataSource);
this.insertAction = new SimpleJdbcInsert(dataSource).withTableName("role");
//withTableName() 을 통해 어떤 테이블에 넣을건지 명시해줌.
}
public List<Role> selectAll(){
return jdbc.query(SELECT_ALL , Collections.emptyMap(),rowMapper);
}
public int update(Role role) {
SqlParameterSource params = new BeanPropertySqlParameterSource(role);
return jdbc.update(UPDATE,params);
}
// update 하기 위해 만들어놓은 query :description과 같은 곳에 알아서 mapping 이 된다.
// public static final String UPDATE = "UPDATE role SET description = :description WHERE ROLE_ID = :roleId";
public int deleteById(Integer id) {
Map<String, ?> params = Collections.singletonMap("roleId", id);
return jdbc.update(DELETE_BY_ROLE_ID, params);
}
public Role selectById(Integer id) {
try {
Map<String, ?> params = Collections.singletonMap("roleId", id);
return jdbc.queryForObject(SELECT_BY_ROLE_ID, params, rowMapper);
}catch(EmptyResultDataAccessException e) {
return null;
}
}
package kr.or.connect.daoexam.dao;
public class RoleDaoSqls {
public static final String SELECT_ALL = "SELECT role_id, description FROM role order by role_id";
public static final String UPDATE = "UPDATE role SET description = :description WHERE ROLE_ID = :roleId";
public static final String SELECT_BY_ROLE_ID = "SELECT role_id, description FROM role where role_id = :roleId";
public static final String DELETE_BY_ROLE_ID = "DELETE FROM role WHERE role_id = :roleId";
}
마지막으로
@Repository를 통해서 Bean을 자동으로 등록해주었다면
Config클래스를 읽을 때 @ComponentScan 어노테이션과 함께 해당 DTO의 패키 지명을 명시해주어야 한다.
package kr.or.connect.daoexam.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@ComponentScan(basePackages = {"kr.or.connect.daoexam.dao"})
@Import({DBConfig.class})
public class ApplicationConfig {
}
메인 함수에서 실행을 시킬 때는
1.ApplicationContext 객체를 일단 받아와야 하고 생성자에 Config파일을 명시해주어야 됨
2.DataSource 와 관련된 정의를 해놓은 DAO class의 bean을 불러온다
3.DAO의 메서드를 사용하여 질의를 수행한다.
package kr.or.connect.daoexam.main;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import kr.or.connect.daoexam.config.ApplicationConfig;
import kr.or.connect.daoexam.dao.RoleDao;
import kr.or.connect.daoexam.dto.Role;
public class SelectAllTest {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
RoleDao roleDao =ac.getBean(RoleDao.class);
List<Role> list = roleDao.selectAll();
for(Role role: list) {
System.out.println(role);
}
}
}
'개발공부 > 스프링' 카테고리의 다른 글
[Spring] DI & IOC (3) 스프링 IoC 컨테이너 (0) | 2021.04.13 |
---|---|
[Spring] DI & IOC (2) 의존성 주입 (0) | 2021.04.13 |
[Spring] DI & IOC (1) 느슨한 결합력 (0) | 2021.04.13 |
spring-JDBC 라이브러리-2 (0) | 2021.03.24 |
spring-JDBC 라이브러리-1 (0) | 2021.03.21 |