여러행함수 : Group by절, Having절
SQL함수에는 두가지 유형이 있다.
- 단일행함수 : 행당 하나의 결과 반환
- 여러행함수 : 행 집합당 하나의 결과 반환
SQL함수에는 두가지 유형이 있다.
DB저장되어있는 모든 회원정보를 출력하는 코드를 작성해보자.
rs.next() = 커서객체를 다음(next)로 넘기는 메서드. row에 데이터가 있으며 true이고 없으면 다음 row로 내려간다. 데이터에 행이 없으면 False가 되고 while문이 종료된다.
getString(columnIndex)는 columnIndex안에 테이블의 열번호를 넣으면 된다.
1 | <table border="1"> |
가져온 데이터를 테이블형태로 출력해보는데 2가지 방법이 있다.
select * from itwill_member
이라서 while반복문을 사용했다.select * from itwill_member where id=?
로 where조건절을 추가하면 반복문이 아닌 if문으로 사용가능하다.1 | //3.쿼리작성 |
1 | //3.쿼리작성 |
MySQL Workbench에서 row추가시 Timestamp 데이터타입을 쓰고싶다면 TIMESTAMP
라고 직접 작성하거나 드롭다운리스트에서 TIMESTAMP()
을 찾은 뒤 꼭 괄호를 삭제하고 TIMESTAMP
로 apply해야 에러가 발생하지 않는다.
타임스탬프는 사용자가 입력하는 데이터가 아니라 컴퓨터시간에서 가져오는 데이터이다.
따라서 JDBC의 3단계인 sql구문 & DB저장에서 객체생성을 통해 진행할 수 있다.
아래 코드는 JDBC에서 itwill_member테이블에 사용자가 입력한 id, pw와 컴퓨터현재시간을 차례대로 sql구문에 넣는 코드이다.
1 | //3. sql구문 & DB저장 진행시 |
JDBC 3단계인 SQL작성 & pstmt 객체생성 & 데이터처리를 중점으로 로그인페이지를 작성해보자.
1 | //3-3. 데이터처리 |
다른 페이지로 이동시 왜 js코드보다 java코드가 더 좋을까?
해당파일의 확장자는 jsp이다. jsp파일이라서 자바코드의 처리가 우선순위에 있다.
js코드인 경우, java로 된 코드가 다 실행되고 난 뒤에 실행이 된다.
이때 이후에 나오는 java코드에 문제가 생기면 js코드가 실행안될 수 있기때문에 아예 java코드를 쓰는것이
실행순서상 좋다.
1 | <script type="text/javascript"> |
1 | response.sendRedirect("main.jsp"); |
history.back();
: 작성한 아이디나 데이터가 살아있다location.href="loginForm.jsp";
: 작성한 아이디나 데이터가 없다location.reload();
: 새로고침으로 alert창이 반복된다어떤 건 import를 쓰고 어떤 건 import하지않고도 사용가능하다.
왜그럴까?
import가 필요없는 경우 : 기본적으로 사용 가능한 클래스인 경우이다.
import를 써야하는 경우 : 기본제공되는 클래스가 아닌 경우 클래스가 있는 패키지를 추가(import)해야함
form페이지를 만들어서 이름과 성별, 나이, 주민번호를 사용자로부터 받은 뒤 그 데이터들을 insertPro.jsp
파일에서 불어와서 MySQL DB에 넣어보는 코드이다.
아래 코드는 form페이지는 생략하고 insertPro.jsp
만 나타낸 코드이다.
총 3단계로 이루어진다.
1 | //import 아래 3가지 추가됨 |
MySQL가서 select * from 테이블명
명령어를 입력하면 row가 추가된 것을 확인할 수 있다.
위의 sql구문작성을 보면 변수, 작은따옴표, 큰따옴표혼재되어있어서 적기에 매우 불편하다
이를 해소하기위한 객체PreparedStatement를 이용하면된다.
기존 Statement보다 처리속도도 빠르고 보안도 좋은 PreparedStatement를 사용해야한다.
아래 두 코드를 비교해보자.
1 | <%@page import="java.sql.Statement"%> |
3단계 stmt 실행시 기능에 따라 쿼리구문을 두가지로 구분할수있다.
pstmt.executeUpdate() : insert, update, delete에 사용
pstmt.executeQuery() : select에 사용
1 | <%@page import="java.sql.PreparedStatement"%> |
이름과 주민번호의 입력값이 DB데이터와 일치하면 회원탈퇴를 진행하는 코드를 만들어보자.
먼저 이름과 주민번호를 사용자로부터 입력받을 수 있는 deleteForm.jsp
파일을 만든다
1 | <fieldset> |
deletePro.jsp
에서 사용자데이터를 불러와서 DB데이터와 확인 후 탈퇴를 처리하는 코드를 작성하면 아래와 같다.
순서는 아래와 같다
1 | <%//1. 변수가져오기 |
이때 두가지 방법이 있다.
pstmt.executeUpdate();
는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.
사용자입력값이 DB데이터와 일치하면
실행완료(수정완료) : 1
출력정상적으로 탈퇴되었습니다
라는 문구 출력된다.사용자입력값이 DB데이터와 불일치하면
실행완료(수정실패) : 0
출력탈퇴실패
문구 출력된다.1 | <% |
pstmt.executeUpdate();
는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.
사용자입력값이 DB데이터와 일치하는지 select로 확인후 일치하면
사용자입력값이 DB데이터와 일치하는지 select로 확인후 불일치하면
DB에서 delete은 매우 신중한 작업이다.
따라서 정확한 데이터를 찾아 정확하게 처리해야하기때문에 전자보단 후자를 사용해야한다.
1 | <% //3. sql작성 & pstmt객체생성 |
클래스 Book은 책제목과, 저자, 가격을 출력해준다.
1 | public class Book { |
클래스 TestBook 이라는 새로운 클래스파일을 만들고 메인메서드를 실행해보자.
1 | public class TestBook { |
보이는 것처럼 생성자파라미터를 통해서 입력한 값들은 제대로 출력되지만 파라미터메서드를 통해서 입력한 값들은 null로 출력된다.
WHY?
메서드는 파라미터의 값을 받았는데 넣어줄 곳이 없기때문에!
그렇다면 메서드를 어떻게 바꾸면 될까?
멤버변수를 파라미터값을 대입할수있게 코드를 추가해주면된다
1 | void showInfo(String title, String author, int price ){ |
생성자에 파라미터를 받는 방법과 메서드에 파라미터를 받아서 하는 방법 중 어느것이 더 좋은 것일까?
1 | //1-1.생성자파라미터 생성 |
1 | //2-1.파라미터메서드 생성 |
둘 다 기능은 동일하지만 생성자파라미터를 쓰는 것이 더 좋다
WHY?
생성자의 기능과 메서드의 기능에 맞게 충실하게 하는 것이 좋기때문이다
생성자의 기능은 변수를 초기화하는 것이다.
메서드는 이름에서도 알수있듯이 showInfo()이다. 하지만 파라미터메서드를 생성하면 변수도 초기화하고 출력까지하는 두가지 짬뽕기능을 가지게 된다.
따라서 기능에 맞게 나눠서 코딩하는 것이 좋은 개발습관이다.
DAO : 주로 jsp model1에서 사용
DTO(Data Transfer Object) : 데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 작업을 처리하는 클래스이다.
멤버변수는 private을 설정하는 것이 데이터보안상 좋다.
하지만 private을 쓰게되면 다른 클래스에서 가져가 쓸 수가 없다.
이럴때 아래 두가지 메서드를 이용한다(개발자들의 약속이다).
이를 getter와 setter라고 부른다.
1 | //메인메서드안에서 get메서드쓰는 방법 |
Book 클래스파일은 아래와 같다.
제목과 저자 가격을 멤버변수로 가지고 있다.
1 | public class Book { |
매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.
실행하는 메인메서드파일은 아래와 같다.
1 | Book book1 = new Book("운동하는여자", "양민영", 25000); |