뉴렉처님의 JDBC 유튜브 강의를 듣던 중 문제가 발생했다.
뉴렉처님은 JDBC에서 연동하는 DB가 Oracle이다. 그러나 나는 어떠한 이유로 MySQL을 연동해서 사용하고 있었다.
이번 강의의 내용이 페이징을 위한 쿼리를 만드는 것인데, Oracle과 MySQL의 문법이 다르기도 하고, Oracle에서는 쿼리를 통해 검색한 결과에 자동으로 숫자를 부여해주는 ROWNUM 이 있지만, MySQL에는 그것이 존재하지 않는다. 그래서 따로 변수를 통해 구현해 주어야 한다.(사실 이 강의를 듣기 전까지는 database에서 변수를 사용할 수 있는지조차 몰랐다...)
변수선언
MySQL은 @변수명을 통해 변수선언이 가능하다고 한다.
$변수명을 쓰던 PHP가 생각이 난다.
SET @ROWNUM=0;
OR
SET @ROWNUM:=0;
이렇게 변수선언해 주면 된다. SET문에서 쓰이는 = 연산자는 비교 연산자가 아닌 대입 연산자이다.
추가로 SELECT문이나 여타 다른 곳에서 대입 연산자를 쓰고 싶다면 :=를 쓰면 된다.
SELECT문
SELECT
@ROWNUM:=@ROWNUM+1 as ROWNUM,
테이블명.*
FROM 테이블명
limit X,Y;
X+1번째부터 Y개의 행 출력
line2는 SELECT문이 한 행을 가져올 때마다 ROWNUM변수에 1씩 더해준다.
초기값이 0이었으니 첫번째 행은 1일 것이고 AUTO_INCREMENT마냥 수가 올라갈 것이다.
그 뒤 as는 출력결과가 @ROWNUM:=@ROWNUM+1 따위가 아닌 ROWNUM으로 나올 수 있게 해준다.
line3의 테이블명.* 은 해당 테이블에 있는 모든 행을 대상으로,
line4는 테이블을 지정해준다.
line5의 limit은 보여줄 행의 시작점과 개수를 지정한다.
X+1번째 행부터 Y개의 행을 출력하게 된다.
최종적으로 내가 작성한 쿼리는 다음과 같다.
use testdb;
SET @rownum:=0;
SELECT
@rownum:=@rownum+1,
notice.*
FROM notice
limit 2,2;
그리고 이를 이용하여
이 테이블에 적용하게 되면,(행이 좀 적긴 하다)
이러한 결과를 보여준다.
내 생각대로 결과가 나와서 아주 만족스럽다.
이제 이 쿼리를 이용하여 페이지 기능을 구현할 것이다.
그 전에, DB에 있는 행 개수를 좀 늘려야 이것을 구현하는 의미가 있을 것 같아 행을 추가하였다.
그래서 별 쓸모도 없는 행을 17까지 추가했다...
그리고 이전에 작성한 코드에 getOnePage,setVar변수를 String으로 선언하고, 만든 쿼리를 넣어준다.
변수 두개를 선언해준다. 각각 limit의 앞,뒤에 들어갈 변수이다.
쿼리를 넘기기 위한 코드들도 추가해준다.
그리고 돌려보면..
10개씩 잘 뽑는것을 확인할 수 있다.
전체 코드는 내 깃허브에 올려두었다.
'Study > DATABASE & ORM' 카테고리의 다른 글
[TypeORM] 트랜잭션(Transaction) 사용하기 (0) | 2021.12.21 |
---|---|
[TypeORM] N+1 문제와 Eager and Lazy Relations (0) | 2021.12.19 |
[MySQL]MySQL 기본적인 명령어 모음 (0) | 2020.11.26 |
[SQL developer]SQL developer 설치와 MySQL 연동 (0) | 2020.11.25 |
댓글