GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the DataBase 15

예약 가능한 날짜 SQL => if 와 all 사용

예약기능은 숙박, 항공, 식사, 렌탈 등 다양한 범주에서 사용된다. 진행 중인 프로젝트 ( 렌탈 서비스 ) 에서도 예약기능이 필요하다 생각되었고, 검색 기능에서 (a). 키워드 (b). 동네 (c). 렌탈 희망 날짜 세 가지 조건을 만족하는 조회결과를 가져오는 SQL문을 구성하고자 했다. 1. 하나의 SQL 문으로 시도 ( 실패 ) select * from product left outer join reservation on product.id = reservation.boardid where (title like concat('%', #{smartTitle}, '%') and boardRegion like concat('%', #{smartRegion}, '%') and (reservation.star..

<JDBC> PreparedStatement / ResultSet

select * from member where id = ? => 쿼리문 특정 부분 (?) 을 변수로 주고, 바꾸면서 사용할 상황 => PreparedStatment + 파싱 컴파일 생략으로 속도도 빠르다 connection con = null; PreparedStatement ps = con.prepareStatemente( "select * from member where id = ?" ); ( 아직 미정인 부분을 "?" 로 줘놓고 사용 ) - 여러개도 물론 가능하다. ( INDEX 사용 ) String sql = "insert into member values(?,?,?,?,?,now())"; PreparedStatement pt = con.prepareSt..

DAO 잡다한 실수들

1. 쿼리문 안에 컬럼변수에 ' ' 따옴표가 붙어버린다! 쿼리문에서 "컬럼이름" 을 변수로 둘 때, 즉 "select * from member where ? = 2020"; ? 에 컬럼명이 오는 자리인데, 이대로 preparedStatement.set(1, id ); 이렇게 주면 쿼리문에서는 where ' id ' = 2020; 즉, String이라 따옴표가 붙어서 나오면서 오류가 난다. 그러므로, 쿼리문에서 컬럼명을 변수로 사용할려면 쿼리문을 끊어서 변수로 해서 줘야한다. "select * from member where " + id + "= 2020"; //////// 2. DAO 에서 insert 할 때, if ( != null ) 로 해서 받는데 수정하기 전에, 비밀번호는 미리 확인을 위해 받아둔..

DAO DTO Main 3단 분업

- 자바에서는 테이블 구조가 없으니 테이블 => 객체모음 ( 배열, list, set, map ) column => 엔티티의 멤버변수 레코드 => 객체 구조로 만드는 것이다. => 자바에서 SQL 쿼리문을 사용하는 객체 (모아둔 클래스) 리턴타입 A(매개변수){ ( 1.jdbc 드라이버 호출 - 특정 버전 이후 자동 ) 2. 연결 3. SQL 문 사용 4. 연결해제 ( 기본 JDBC 연결해서 사용하는 그것이다. 코드 => JDBC연동 글. ) ( 즉, JDBC 연결해서 쿼리문 사용하는 애들만 모아둔 걸 DAO 라 하는 것. ) ( =ValueObject VO / =Data Object D..

JAVA => JDBC => MySQL DB 연동

JDBC => DB 연동 > - JDBC : JAVA의 DB 연결 기술 + API 들 기본적으로 DB 와 연결할 때 자바는 JDBC 를 사용한다. - java.sql.* 인터페이스 사용 => 각 DB에 맞도록 구현(implements)해둠 : 각 DB 드라이버 - 각 DB 별 JDBC 전용 driver 프로그램 필요 - 모든 DB에 대해 JDBC 는 동일하게 동작 ( db 종류, ip port 번호 정도만 바뀜 ) - JDBC 연결 순서 ( 동일 ) 1. JDBC driver 호출 ( MySQL => connector J ) 2. DB 연결 ( 종류, ip, port, 계정, 암호 ) 3. SQL문 정의- 전송 4. DB 연결해제 (MySQL은 기본적으로 컴퓨터 시작하면 자동 실행되게 ..

Union합집합 / SubQuery 서브쿼리 /

Join => 컬럼을 합치는 것 A 테이블의 a,b,c 컬럼과 B 테이블의 d,e 컬럼을 합쳐서 a , b, c ,d ,e 컬럼으로 보여주는 것 Union => 레코드를 합치는 것 ( 합집합 ) => 중복되는거 하나로 봄 create table A( select * from employees where department_id = 50); create table B( select * from employees where salary 합집합 => 중복 X => 중복지급 X select first_name from A Union select first_name from B; 중복되던 말던 그냥 다 보여줘 > select - select 서브쿼리 se..

Foreign Key / CASCADE / 그리고 Constraint 제약조건들.

- DB 에서 테이블을 생성할 때, 여러 특성, 제약조건을 걸 수 있다. ( 걸어야 한다. ) 몇개 없다. 간단하게 보고, 그 중 헤깔리기 쉬운 FOREIGN KEY 사용법에 익숙해 지자. 1. not null => null 금지 ( 아이디나 비밀번호, 주민번호 같은 data 들 ) 2. unique => 중복값 금지 ( unique key UK 라고 표현 ) ( 아이디, 주민번호 둘 다 중복되면 안되는 data 들) 3. primary key => not null + unique 특성 ( PK ) + Auto_increment 자동증가 특성과 함께 사용한다. 예시 : id varchar(10) primary key auto_increment, ( => aut..

MySQL Join 쿼리 / 효율적인 DB의 시작

=> 테이블1에 특정 컬럼의 동일값이 반복된다. ( 변경할때도 그 동일값이 다 변경되어야 해서 낭비 ) => 중복되고, 연관된 요소들을 따로 빼서 테이블2를 만들자 ( 테이블을 어떻게 구성할지 잘 생각해야한다. ) 중복되는 요소 컬럼들을 따로 빼서 테이블2를 만들면, 원래 테이블1은 간단해진다. 테이블 1과 테이블2가 칼럼 하나만 공유하고있으면 그 연결고리로 테이블1은 테이블2 데이터를 가져다 쓸 수 있다. (vice versa) select 테이블1 칼럼, 테이블2 칼럼 from 테이블1, 테이블2 WHERE 테이블1.공유칼럼 = 테이블2.공유칼럼 ; select first_name, department_name from employees, departments where empl..

MySQL 데이터타입 => int / decimal / varchar / datetime

- 매우 다양하다. 하지만 주로 사용하는 타입은 정해져 있다. 대강만 보고 주로 사용하는 타입을 알아두자. 정수 - int(4byte) / bigint(8byte) 실수 - float / double / *decimal (15, 3) => 총 15자리 / 정수12자리/ 소수3자리 => 자리수를 정할 수 있다. - 총 자리수는 넘기면 못넣음 - 소수점 자리수 넘어가는건 알아서 짤라줌 문자열 - char(100), varchar(100) => 100글자 (한글도 그냥 글자수로만 셈) - char : 100글자 잡은거 그대로 잡고감 ( 메모리 부담 ) - varchar : 남은 부분 줄이고 감 ( 메모리 효율적 ) 날짜 - datetime -- text,longtext - 파일내..