@ 아래 내용은 https://www.edwith.org/boostcourse-web/ 사이트의 강의를 정리한 글 입니다.
Role.java
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 + "]";
}
}
RoleDaoSqls.java
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";
}
//상수는 모든 글자를 대문자로 쓰는 것이 관례이다 이런 것은 잘지키자!
두단어 이상일때 언더바로 단어를 구분한다
RoleDao.java
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");
}
public List<Role> selectAll(){
return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
}
}
// 위에는 import static kr.or.connect.daoexam.dao.RoleDaoSqls.*; 가 빠져 있다 추가 해줘야된다...
// DAO객체는 저장소에 역할을 한다는 의미로 @Repository 라는 어노테이션을 붙여 준다.
// DataSource 는 생성된객체가 있기때문에 자동으로 주입된다.
//static 임포트를 사용하면 변수를 클래스 이름 없이 바로 사용 할 수 있게 된다.
//Collections.emptyMap() 이 들어간 자리는 바인딩 할 값을 전달할 목적으로 사용하고 있는 객체 이다.
그런데 지금 없으니 빈맵객체를 전달 해주는 것.
// 세번째 항목(rowMapper)은 셀렉트 한건 한건의 객체를 dto 저장하기 위한 목적으로 사용 culmn의 값을 자동으로 DTO에 담아주게 된다.
결과가 여러건이었을때 내부적으로 반복하면 서 DTO를 생성하고 생성한DTO를 List에 다가 담아주는 일을 한다. 해당 List를 반환 해주게 된
다. 그리고 dbms 는 카멜 표기법을 쓰지 않고 언더바, 자바는 카멜표기법을 쓴다 그래서 둘의 이름이 달라서 힘든데 rowMapper 객체는
자동으로 맞춰 준다. 흠.
ApplicationConfig.java
@ComponentScan(basePackages = { "kr.or.connect.daoexam.dao" })
// 설정 파일을 읽도록 ComponentScan 사용 , 여러 패키지 쓸수 있다.
SelectAllTest.java
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);
}
}
}
실습코드
RoleDaoSqls.java에 추가
public static final String UPDATE = "UPDATE role SET description = :description WHERE ROLE_ID = :roleId";
RoleDao.java
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");
}
public int insert(Role role) {
SqlParameterSource params = new BeanPropertySqlParameterSource(role);
return insertAction.execute(params);
}
public int update(Role role) {
SqlParameterSource params = new BeanPropertySqlParameterSource(role);
return jdbc.update(UPDATE, params);
}
}
// withTableName은 어떤 테이블에 넣을지 알려 주는 것.
// BeanPropertySqlParameterSource(role)은 role 객체의 있는 값을 맵객체로 바꿔주는데 roleId를 role_id 등으로 자동으
로 바꿔 준다.
//그리고 update 메소드에서는 params가 UPDATE 문장에 바인딩 시켜주는 역할을 한다.
JDBCTest.java
package kr.or.connect.daoexam.main;
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 JDBCTest {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
RoleDao roleDao = ac.getBean(RoleDao.class);
Role role = new Role();
role.setRoleId(201);
role.setDescription("PROGRAMMER");
int count = roleDao.insert(role);
System.out.println(count + "건 입력하였습니다.");
int count = roleDao.update(role);
System.out.println(count + " 건 수정하였습니다.");
}
}
//insert 문 수행하면 int가 리턴 되는데 '한건 입력했습니다.' 이런 느낌이다 .
실습코드
RoleDaoSqls.java에 추가
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";
// cloumn을 쓸때 * 를 쓰기도 하는데 ex) select*from role ; *보다 cloumn명 을 써주는게 더 이해하기 좋다.
RoleDao.java에 추가
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");
}
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;
}
}
}
// Delete 쿼리에도 update처럼 사용해도 되지만 한건만 넣어도 되는데 굳이 객체를 만들 필요 없기에 간단하게 하는 방법이 위에 방법이다.
// select를 했는데 해당값이 없다면 exception이 발생하기에 적절한 exception 처리를 해줘야 한다.
JDBCTest.java에 추가
Role resultRole = roleDao.selectById(201);
System.out.println(resultRole);
int deleteCount = roleDao.deleteById(500);
System.out.println(deleteCount + "건 삭제하였습니다.");
Role resultRole2 = roleDao.selectById(500);
System.out.println(resultRole2);
//delete도 int 값 리턴 한다.
'IT > SpringMVC' 카테고리의 다른 글
8. Spring MVC구성요소 (0) | 2018.08.27 |
---|---|
7. Spring MVC란? (0) | 2018.08.27 |
5. Spring JDBC 소개 (0) | 2018.08.24 |
4. Java Config를 이용한 설정 (0) | 2018.08.22 |
3. xml파일을 이용한 설정 (0) | 2018.08.20 |