select no, title, writer, writeDate, hit
from board
order by no desc;
select no, title, content, writer, writerDate, hit
from board
where no = 2;
update board set hit = hit + 1
where no = 2;
-- 이걸 어떤 조건에서 실행 할건지 말건지 if문으로 씀)
insert into board (no, title, content, writer, pw)
values (board_seq.nextval, '제목', '내용', '작성자', '1111');
update board set title='제목수정' , content='내용수정' write='작성사수정'
where no = 2 and pw ='1111';
delete from board
where no = 2 and pw = '1111';
Main - BoardController - BoardListServiceImpl - BoardDAO
인터페이스 쓰는 이유 : 소스가 간단해진다. 관리가 편하다. 확장성이 좋다.
public void static void main(String[] args) {}
public void execute()
public static Object run(ServiceInterface, Object)
public Object service(Object obj) throws Exception
public List<BoardVO> service(Object obj) throws Exception
List<BoardVO>
는 Object
로 대체 가능public List<BoardVO> list() throws Exception;
public List<BoardVO> list() throws Exception
public static void print(List<BoardVO>)
public void static void main(String[] args) {}
public void execute()
public static Object run(ServiceInterface, Object)
public Object service(Object obj) throws Exception
public Integer service(Object obj) throws Exception
Long no
), 리턴타입 Integer
는 Object
로 대체 가능public Integer write(BoardVO vo) throws Exception;
public Integer write(BoardVO vo) throws Exception
- Oracle 11g XE 다운로드
- 설치영상 : SQL Developer와 접속 만들기(웹짱과 함께하는 자바 & 응용SW기초)
비밀번호는 쉬운걸로 설정 해 놓기
OracleServiceXE
, OracleXETNSListener
실행시키기TNSListener
를 통해서 들어가게 됨.8080
: tomcat 포트와 충돌이 일어난다. 둘 중에 하나 변경 필요.SYS
, HR 계정은 샘플 데이터가 들어있음. 관리자 계정 롤 : SYSDBA
SYS
계정으로 실습하지 않는 것이 좋음. 새로 계정 만들어서 사용하기. 테이블 건들면 실행 안됨.JAVA
계정은 일반계정이고 롤은 기본값, 포트번호 1521
, SID는 xe
TCP
선택 - 특정로컬포트1521
- 연결허용 - 다음 - 도메인, 게인, 공용 전부 선택 - 이름:oracel 설명:프로젝트이름 - 마침DBA의 계정과 내 계정의 이름이 같은 것은 상관 없다. 근데 만약에 같아서 헷갈린다면 내 계정명을 변경 해줘야 하는데 사용자 이름 (user)은 변경을 할 수 없고
drop
후에 다시create
를 해줘야 한다.drop
하려면sys
계정으로 접속해서 하면 되는데, DBA의 계정과 내 계정의 이름이 같아서(rentcar) 괜히drop
했다가 DBA의 계정까지 삭제가 될까봐 선생님께 여쭈어봤다.localhost
의sys
계정으로 접속 후 워크시트에서 계정을drop
하면 내 계정만 삭제가 된다. 현재 DBA 계정으로 접속한건sys
계정이 아니므로 DBA의 계정을drop
한다던지, 비밀번호를 변경(alter
)한다던지 계정에 대한 권한(grant
)을 바꾼다던지 하는 일은 할 수 없다. 만약에 내가 DBAsys
계정의 정보를 전부 알고 있으면 롤값을SYSDBA
로 변경하고 워크시트를 열어서 처리 할 수는 있다. (하지만 나는 DBA가 아니므로 변경하지 않도록 조심하자...!)
NUMBER
VARCHAR2
DATE
를 많이 사용함.Not Null
, Primary Key
, Foreign Key
, Unique Key
, Check
-- 일반 게시판 스키마 (데이터 저장 구조) 생성
-- 1. 제거 - DROP TABEL, DROP SEQUENCE : 순서는 상관 없음
-- CASCADE CONSTRAINES : 자신의 기본키나 고유키를 참조하는 테이블의 제약조건을 삭제하고 진행
-- TABLE : 데이터를 저장하기 위한 구조
-- 구조를 수정 하기 위해서는 DROP후 CREATE 하면 된다. 우클릭 후 수정하게 되면 쿼리가 남지 않는다.
DROP TABLE BOARD CASCADE CONSTRAINTS;
-- SEQUENCE : 순서번호
DROP SEQUENCE board_seq;
-- 2. 생성 - CREATE TABLE, CREATE SEQUENCE : 순서 상관 없음
-- 한글 한 자당 3byte, VARCHAR2(300)이면 한글로 100자를 쓰겠다는 뜻.
-- VARCHAR2 : 4000byte까지 저장 가능. 길이 필수 지정.
-- NOT NULL : 필수 입력. 데이터가 비어있으면(Null) 안된다.
-- PRIMARY KEY : 주 키. 중복되면 안되고 NULL값이면 안된다. UK+NN
-- SYSDATE : 오라클 시스템의 날짜와 시간
-- HIT : 기본값을 사용한 이유 - HIT에 데이터가 없으면 NULL이 된다.
-- : NULL은 연산 불가. HIT = HIT + 1;
CREATE TABLE BOARD (
no NUMBER PRIMARY KEY,
title VARCHAR2(300) NOT NULL,
content VARCHAR2(2000) NOT NULL,
writer VARCHAR2(30) NOT NULL,
writeDate DATE DEFAULT SYSDATE,
hit NUMBER DEFAULT 0,
pw VARCHAR2(20)NOT NULL
);
CREATE SEQUENCE board_seq;
-- 3. 샘플데이터
-- seq.nextval -> 다음 숫자(값)를 받아온다. 숫자가 계속 증가. 보통 20개씩 만들어 둔다.
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목1', '내용1', '작성자1', '1111');
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목2', '내용2', '작성자2', '1111');
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목3', '내용3', '작성자3', '1111');
COMMIT;
-- 4. 데이터 검사 (SELECT)
-- * : 모든 데이터 표시 -> 속도가 느려지는 원인이 되기 때문에 현장에서는 사용하지 않는다.
SELECT * FROM BOARD;
-- 게시판 운영 쿼리
-- 단계별로 테스트하고 데이터가 수정(INSERT, UPDATE, DELETE)이 되면 COMMIT한다.
-- 1. 리스트 - 번호, 제목, 작성자, 작성일, 조회수
-- 조건 : 최신글이 맨 위에 오도록 한다.
SELECT no, title, writer, writeDate, hit
FROM BOARD
ORDER BY no DESC;
-- 2. 보기 - 조회수를 먼저 증가 시키고 데이터를 불러온다.
-- 조회수 증가
UPDATE BOARD SET HIT = HIT + 1
WHERE NO=2;
COMMIT;
-- 가져온 데이터 : 번호, 제목, 내용, 작성자, 작성일, 조회수
SELECT no, title, content, writer, writeDate, hit
FROM BOARD
WHERE NO=2;
-- 3. 등록 - 제목, 내용, 작성자, 비밀번호
-- 글번호는 seq에서 받아온다.
INSERT INTO BOARD (NO, TITLE, CONTENT, WRITER, PW)
VALUES (board_seq.nextval, '제목4', '내용4', '작성자4', '1111');
COMMIT;
-- 4. 수정 - 제목, 내용, 작성자, 글번호와 비밀번호가 맞아야 수정한다.
UPDATE BOARD SET TITLE='제목수정', CONTENT='내용수정', WRITER='작성자수정'
WHERE NO=2 AND PW='1111';
COMMIT;
-- 5. 삭제
DELETE FROM BOARD
WHERE NO=2 AND PW='1111';
ROLLBACK;
COMMIT;
현재 위의 쿼리에서는 게시판의 순서를
no
컬럼이 오름차순으로 정렬되게 정의되어 있다. 그런데 게시판 기능에 흔하게 있는 공지글은 글을 아무리 계속 추가해도 계속 상단에 고정되어 있다. 이렇게 설정하는 방법은 컬럼을 하나 더 만들어서 공지글에는 '1' 값을 넣고 나머지글에는 '0'값을 넣어 그 컬럼을 오름차순으로 정렬하면 '1'값인 공지는 항상 상단에 고정 되어 있고, 나머지 추가되는 글은 '0' 값이므로 항상 공지글 밑에no
컬럼의 순서대로만 정렬이 된다. 리스트에서 대표이미지 하나만 보이게 하는 것(WHERE 이미지 = 1 아니면 0) 비밀글 설정(WHERE 비밀글 = 1 아니면 0)도 마찬가지로 컬럼을 추가해서 쿼리문을 쓰면 된다.
-- 공지사항 스키마
-- 1. 제거 - drop table, drop sequence
DROP TABLE notice CASCADE CONSTRAINTS;
DROP SEQUENCE notice_seq;
-- 2. 생성 - create table, create sequence
CREATE TABLE notice (
no NUMBER PRIMARY KEY,
title VARCHAR2(300) NOT NULL,
content VARCHAR2(2000) NOT NULL,
startDate DATE DEFAULT SYSDATE,
endDate DATE DEFAULT '9999-12-30',
writeDate DATE DEFAULT SYSDATE,
updateDate DATE DEFAULT SYSDATE
);
CREATE SEQUENCE notice_seq;
-- 3. 샘플데이터
-- 현재 진행중인 공지
INSERT INTO notice (no, title, content, startDate, endDate)
values (notice_seq.nextval, '현재공지제목1', '현재공지내용1', '2022-12-19', '2023-01-18');
-- 예약 공지(관리자에게만 보여야함)
INSERT INTO notice (no, title, content, startDate, endDate)
values (notice_seq.nextval, '예약공지제목2', '예약공지내용2', '2023-01-01', '2023-04-14');
-- 지난 공지
INSERT INTO notice (no, title, content, startDate, endDate)
values (notice_seq.nextval, '지난공지제목3', '지난공지내용3', '2022-11-18', '2022-11-25');
COMMIT;
-- 4. 확인
SELECT * FROM notice;
-- 공지사항 운영 쿼리
-- 1. 리스트(모든공지) / 지난공지 / 현재공지 / 예약공지
SELECT no, title, startDate, endDate, updateDate
from notice
order by no desc;
-- 2. 보기
SELECT no, title, content, startDate, endDate, updateDate
from notice
where no = 3;
-- 3. 등록
INSERT INTO notice (no, title, content, startDate, endDate)
VALUES (notice_seq.nextval, '새로운공지', '새로운내용', '2022-12-19', '2022-12-30');
COMMIT;
-- 4. 수정
UPDATE notice SET title='수정공지', content='수정내용', startDate='2022-12-20', endDate='2023-01-01'
where no = 2;
commit;
-- 5. 삭제
delete from notice
where no = 2;
rollback;
commit;