기억의 DataBase

Spring Framework를 활용한 방명록 - 2. DB/DTO/DAO(Repository) 본문

Spring

Spring Framework를 활용한 방명록 - 2. DB/DTO/DAO(Repository)

Zester; 2019. 4. 4. 17:21
  • DB


※ Oracle과 MySQL

NUMBER    bigint(크기에 따라 다양)
CLOB    text
DATE    datetime

unsigned : int 형의 경우 범위를 양수로 지정(확장)
( -2^63 ~ 2^63-1    0 ~ 2^63-1 + 2^63)

auto_increment : 새로운 열에 대해서 유니크한 값을 생성할 때 사용 
(Oracle의 sequence와 유사)

PRIMARY KEY(colume)  :  CONSTRAINT PK_colume PRIMARY KEY(colume) 

  • DTO



Field와 getter/setter를 가진 DTO 생성(toString()도 추가)

  • DAO(Repository)

@Repository
public class LogDao {
      private NamedParameterJdbcTemplate jdbc;
      private SimpleJdbcInsert insertAction;
      
      public LogDao(DataSource dataSource){
            this.jdbc = new NamedParameterJdbcTemplate(dataSource);
            this.insertAction = new SimpleJdbcInsert(dataSource)
                                   .withTableName("log") // 입력할 테이블의 이름
                                   .usingGeneratedKeyColumns("id");
                                    // 아이디가 자동으로 입력되도록 함(입력받는 것이 아니라)
      }
      
      public Long insert(Log log){
            // 입력할 dto log를 map으로 변환
            SqlParameterSource params = new BeanPropertySqlParameterSource(log);
            // insert 하면서, 자동 생성된 id(Long)을 반환           
            return insertAction.executeAndReturnKey(params).longValue(); 
      }
}

DAO는 DB 연결에 관한 부분이므로 @Repository를 표시

withTableName("테이블명") : insert할 Table명을 명시

usingGeneratedKeyColumns("컬럼명")  : auto_increment를 통해 생성된 값이, "컬럼명"에 자동으로 입력

excuteAndReturnKEY("map으로 변환된 입력된 DTO") : insert를 실행후에, 자동 생성된 값(auto_increment) 반환

longValue() : 값을 long으로 변환


 
public class GuestbookDaoSqls {
      public static final String SELECT_PAGING = "SELECT id, name, content, regdate FROM guestbook 
                                                    ORDER BY id DESC LIMIT :start, :limit";
                                                                     //limit : 시작값, 갯수
      public static final String DELETE_BY_ID = "DELETE FROM guestbook WHERE id = :id";
      public static final String SELECT_COUNT = "SELECT count(*) FROM guestbook";
}

GuestbookDao에서 사용하는 SQL문을 별도로 관리하는 클래스 

 (1. import static kr.or.connect.guestbook.dao.GuestbookDaoSqls.*;

2. import static kr.or.connect.guestbook.dao.GuestbookDaoSqls.SELECT_PAGING;

3. GuestbookDaoSqls.SELECT_PAGING)


LIMIT( LIMIT 시작값(0부터 시작), 갯수 or LIMIT 갯수)
Paging을 하기 위해 사용한 MySQL의 Select 조건

ex) SELECT * FROM log LIMIT 5, 5 -> 6번째 부터 5개를 가져옴(0부터 시작이므로) 

 
@Repository
public class GuestbookDao {
      private NamedParameterJdbcTemplate jdbc;
      private SimpleJdbcInsert insertAction;
      private RowMapper<Guestbook> rowMapper = BeanPropertyRowMapper.newInstance(Guestbook.class);
      
      public GuestbookDao(DataSource dataSource){
            this.jdbc = new NamedParameterJdbcTemplate(dataSource);
            this.insertAction = new SimpleJdbcInsert(dataSource)
                                   .withTableName("guestbook")
                                   .usingGeneratedKeyColumns("id");
      }
      
      public List<Guestbook> selectAll(Integer start, Integer limit){
            Map<String, Integer> params = new HashMap<>();
            params.put("start", start);
            params.put("limit",limit);
            return jdbc.query(SELECT_PAGING, params, rowMapper);
      }
      
      public Long insert(Guestbook guestbook){
            SqlParameterSource params = new BeanPropertySqlParameterSource(guestbook);
            return insertAction.executeAndReturnKey(params).longValue();
      }
      
      public int deleteById(Long id){
            Map<String,?> params = Collections.singletonMap("id", id);
            return jdbc.update(DELETE_BY_ID, params);
      }
      
      public int selectCount(){
            return jdbc.queryForObject(SELECT_COUNT, Collections.emptyMap(), Integer.class);
      }
} 

 RowMapper : DB에서 Select해서 가져온 결과값을, DTO의 멤버필드에 Mapping하기 위해서 필요

'Spring' 카테고리의 다른 글

Spring Framework를 활용한 방명록 - 3. Service/Controller/JSP  (0) 2019.04.05
Spring Framework를 활용한 방명록 - 1.설정  (0) 2019.03.31
Spring MVC  (0) 2019.03.25
Spring JDBC  (0) 2019.03.22
Java Config를 통한 IoC/DI  (0) 2019.03.21
Comments