본문 바로가기

IT I 프로그래밍/자바 I 스프링 DB

[2] 스프링(Spring Tools 4) DB : DAO파일 만들기

[2] 스프링(Spring Tools 4) DB : DAO 파일 만들기

 

 

 

1. 스프링(Spring Tools 4) DB : DAO파일 만들기

프로젝트 오른쪽 마우스 > Class > 패키지명(com.hs.app) > class명 CrudDao.java


package com.hs.app;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired; // 1-2. @Autowired 적으면 자동 import
import org.springframework.beans.factory.annotation.Value; // 1-3. @Value 적으면 자동 import
import org.springframework.jdbc.core.JdbcTemplate; // 1-2. private JdbcTemplate jdbcTmp를 적으면 자동 import
import org.springframework.jdbc.core.RowMapper;  // 1-5.  RowMapper를 적으면 자동 import
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.stereotype.Repository; // 1-1. @Repository를 적으면 자동import

 

// 1-1. @Repository 설정

// : "이 DAO를 통해서 우리는 값을 업데이트하고 넣는데 그거를 자동으로 좀 설정해줘"라는 의미
@Repository
public class CrudDao {

 

// 1-2. JDBC템플릿 설정

// : @JDBC.jar파일 자동으로 연결,생성 설정   
   @Autowired // 자동으로 연결,생성한다는 의미
   private JdbcTemplate jdbcTmp;// 생성까지 까지 다 끝. 바로 사용가능

 

// 1-3. Sql문을 값으로 사용하는 변수를 사용
   @Value("insert into dummy values (null, ?)") // null, ? :  null은 숫자가 자동으로 생성되니 null값, ?는 필드가 1개
   private String insert; // 값넣기
   
   @Value("update dummy set name=? where idx=?") // idx필드에 해당하는 필드name을 수정하라는 의미
   private String update// 값수정
   
   @Value("delete from dummy where idx=?")  // idx필드에 해당하는 값을 삭제
   private String delete; // 값 삭제
   
   @Value("select * from dummy where idx=?") // idx필드에 해당하는 필드값을 가져오기
   private String getOne; // 값 하나만 가져오기
   
   @Value("select * from dummy") 
   private String getAll// 값 전부다 가져오기
   
   @Value("select count(idx) from dummy")
   private String getCnt; // 값을 하나만 가져오는데 결과가 int 임!!!   
  

// 1-4. Dto 받는 jdbcTmp.update()메소드 만들기  

   // 셀렉트를 제외하고는 메소드 이름이 update()로 똑같다

   // update() 1번째 인자 : insert 변수명,

   // update() 2,3,4..번째 인자 : ?에 name을 써줘야하므로 dto.getName()을 가져온다

   public int insert(CrudDto dto ) {
      return jdbcTmp.update(insert, dto.getName());
   }  

   public int update(CrudDto dto ) {
      return jdbcTmp.update(insert, dto.getName(), dto.getIdx());
   }    
   public int delete(int idx ) {
      return jdbcTmp.update(insert, idx);
   }

 

// 1-6. Dto 받는 jdbcTmp.queryForObject()메소드 만들기 For Select (1개)

 public CrudDto getOne(int idx) {
      return jdbcTmp.queryForObject(getOne, new Integer[]{idx}, new DummyMapper());
   }    

 // CrudDto : 1개만 받으므로 반환형은 ArrayList<CrudDto>가 아니라 CrudDto이다

 // return jdbcTmp.queryForObject() : 'getOne'이란 쿼리가 처리될거고, 받아온 파라미터 'idx'가 두번째 인자가 되는데 두번째 인자로는 Object[](오브젝트배열)이 들어가야 하므로 new Integer[]{}로 'idx'를 감싸 형변환시키고, 세번째로 'new DummyMapper()'를 통해서 처리가 되게한다.

 

// 1-7. Dto 받는 jdbcTmp.jdbcTmp.query()메소드 만들기 For Select (여러개)

   public List<CrudDto> getAll(){
      return jdbcTmp.query(getAll, new DummyMapper());
   }     

 // List<CrudDto> : 여러개 받으므로 반환형은 List<CrudDto>이다. jdbcTmp.query()는 ArrayList<CrudDto>형은 반환형으로 부적절하다.

 // return jdbcTmp.query() : 'getOne'이란 쿼리가 처리될거고, 받아온 파라미터 'idx'가 두번째 인자가 되는데 두번째 인자로는 Object[](오브젝트배열)이 들어가야 하므로 new Integer[]{}로 'idx'를 감싸 형변환시키고, 세번째로 'new DummyMapper()'를 통해서 처리가 되게한다.

 

// 1-5. Dto 받는 RowMapper() 구현하기 For Select  

  // 셀렉트의 결과는 resultSet에 담기나 스프링에서는 rs를 사용못하므로 내부클래스인 RowMapper를 구현해줘야한다. 

  // RowMapper :: 셀렉트의 결과인 한 행을 dto에 1:1로 매칭시켜주는 기능을 갖는다.

   class DummyMapper implements RowMapper<CrudDto>{ 

      @Override
      public CrudDto mapRow(ResultSet rs, int rowNum) throws SQLException {         
         return new CrudDto(rs.getInt("idx"), rs.getString("name"));
      }       
   }

 // DummyMapper : 클래스명은 임의로 설정

 // RowMapper<CrudDto> : org.springframework.jdbc.core의 RowMapper이며, <CrudDto>받는 RowMapper라는의미

 // @Override public CrudDto mapRow(ResultSet rs, int rowNum) throws SQLException {} : DummyMapper에 마우스올려 Add unimplemented methods를 클릭, 자동 구현시킨다.

 // return : 만들어진 값들을 rs로 알아서 꺼내주기 때문에 우리는 만들어서 넣어주면 된다.

 // new CrudDto(rs.getInt("idx"), rs.getString("name")); 2개의 값을 가진 객체를 만든다.
}