Day20

두윤기·2023년 1월 26일
0
post-thumbnail

복습

> JDBC

Library download

  • orcle
  • spring

dynamic sql 방식


JDBC_UPDATE

  • Spring에서 update(INSERT, UPDATE, DELETE) 시 자동 commit
  • UPDATEDELETE는 구문에 오류가 없으면 data가 없어도 실행은 된다.
  • 따라서 실제 실행의 count 활용. (jdbcTemplate.update()의 return: 실제 실행 갯수)
	int count = jdbcTemplate.update(sql, param); // 구문의 오류는 없지만 실행이 안된 경우 count == 0
    System.out.println(count > 0 ? "진짜 리얼 수정 완료" : "실행은 됐는데 대상이 없음");

module

public class JdbcUtils {
    // 계정 및 연결 주소를 상수 형태로 보관
    public static final String DRIVER = "oracle.jdbc.OracleDriver";
    public static final String URL = "jdbc:oracle:thin:@localhost:1521:xe";
    public static final String USERNAME = "";
    public static final String PASSWORD = "";

    // 연결 객체 생성 method
    public static DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(DRIVER);
        dataSource.setUrl(URL);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);

        return dataSource;
    }

    // 명령 실행 객체 생성 method
    public static JdbcTemplate getJdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(getDataSource());
        return jdbcTemplate;
    }
}

> factory pattern

factory method pattern

  • reference: https://kotlinworld.com/365
  • 객체를 생성하기 위해 필요한 interface를 만든 후, interface를 구현하는 class에서 어떤 객체를 만들지 결정하는 pattern
  • 객체가 Concrete class가 아닌 interface를 구현해서 만들어지는 class

+ 궁금점

  • Spring JDBC를 이용하면 commit을 알아서 해주는 건지: Spring에서는 commit을 자동적으로 해준다.
  • dataSource가 stream이고 원래는 닫아야 한다. 순수 java로 DB와 소통할 때는 stream을 닫지만, spring에서는 닫지 않아도 된다. 나중에 connection으로 관리한다.

JDBC_DELETE

  • data를 지우는 일은 흔하지 않고, 지워도 특정 항목만 PK로 지정하여 지운다.
  • part
    • Spring JDBC(DriverManagerDataSource)
    • 명령 실행(JdbcTemplate)
    • SQL(String sql, Object[] param)
    • int count = jdbcTemplate.update(sql, param);

JDBC_SELECT

  • TABLE 형태의 정보를 Object 형태로 가져옴
  • data의 변환 TABLE -RowMapper-> DTO
  • List<ObjectDto> objects = jdbcTemplate.query(sql, mapper, param);

RowMapper

  • 조회 결과를 어떻게 DTO에 복사할 것인지 알려주는 Class
  • Interface, mapRow(ResultSet과 Dto 관계 설정하는 method)를 override해서 사용
RowMapper<StudentDto> mapper = new RowMapper<StudentDto>(){
    @Override
    public StudentDto mapRow(ResultSet rs, int idx) throws SQLException {
        StudentDto studentDto = new StudentDto();
        studentDto.setNo(rs.getInt("no"));
        studentDto.setName(rs.getString("name"));
        studentDto.setKorean(rs.getInt("korean"));
        studentDto.setEnglish(rs.getInt("english"));
        studentDto.setMath(rs.getInt("math"));
        return studentDto;
    }
};

DTO(Data Transfer Object)

> preparedStatement

  • data가 들어갈 위치에 placeholder(?)를 넣어 sql 문장을 정의
  • dynamic binding - 안정성, 표현하기 더 편함
  • 그냥 statement는 sql문을 실행할 때마다 새로 작성하고 해석하므로 overhead, PreparedStatement는 반복되는 비슷한 SQL문을 쉽게 처리
  String sql = "SELECT * FROM POCKETMON WHERE NAME INSTR(" + type + ", ?) > 0";
  Object[] param = { keyword };

  List<PocketmonDto> pocketmons = jdbcTemplate.query(sql, mapper, param);

> Attribute dynamic binding

  • sql의 domain에 포함되지 않는 keyword(ex #1) 사용
  • sql.replace("keyword(#1)", attribute)
  String sql = "SELECT * FROM POCKETMON WHERE NAME INSTR(#1, ?) > 0";
  sql = sql.replace("#1", type);

> 단일/상세 조회

  • PRIMARY KEY 이용하여 조회

+ 인터넷 주소+

  • 주소에서 ?가 있다면 ?앞이 주소고 뒤에가 data
  • &를 기준으로 data가 구별됨

PROGRESS

DAO(Data Access Object)

profile
programmerD

0개의 댓글