오늘은 자바 및 쿼리에서 등록을 할때마다 번호를 자동생성하는 방법에 대해 이야기해보려합니다.
보통은 계약서나 청구번호를 구현하려할때 많이 사용되곤 하죠!
손쉽게 구현할 수 있는 방법을 정리해보았습니다.
저의 번호생성로직은 시작날짜 년월 - 각 회사이름 - 번호 로 구현할 예정입니다.
예를들면...처음 등록했을 경우 2102-samsung-001 이렇게 되겠네요!
구현화면입니다... 머 이렇게 시작년월에 회사이름의 데이터가 없으면 001, 있으면 +1이 되는 형식입니다.
[Java] 자동 계약/청구 번호/주문번호 생성 방법!!!
Controller
1
2
3
4
5
|
BoardVO view = boardService.boardInfo(searchVO.getBoard_idx());
String year = view.getBoard_sdate().replace("-", "").substring(2, 6);
view.setBoard_year(year);
String serialNo = boardService.getBoardSerialNo(view);
|
cs |
우선은 board_idx를 통해서 정보를 빼옵니다.
그리고 String year을 선언한 다음 여기에
board_sdate에서 replace을 통해서 년의 2째자리와 월의 2째짜리를 넣어주려합니다.
(예를들어 board_sdate 값이 2021-02-23 이라면, replace을 통해서 하이픈(-)과 빈칸("")을 빼주면 20210223 이 됩니다.
여기서 substring에서 2,6은 2번째부터 6번째자리 전까지를 말하므로 2102 가 나오게 되는거죠!)
그리고 값을 view의 board_year에 넣은 다음, getBoardSerialNo에 view을 넣어서 구현을 해줍니다.
Service
1
2
|
String getBoardSerialNo(BoardVO searchVO) throws Exception;
|
cs |
ServiceImpl
1
2
3
4
|
@Override
public String getBoardSerialNo(BoardVO searchVO) throws Exception {
return dao.getBoardSerialNo(searchVO);
}
|
cs |
DAO
1
2
3
|
public String getBoardSerialNo(BoardVO searchVO) {
return selectOne("getBoardSerialNo", searchVO);
}
|
cs |
여기서는 selectOne으로 해주시면 됩니다.
XML
1
2
3
4
5
6
7
8
|
<select id="getBoardSerialNo" parameterType="BoardVO" resultType="string">
SELECT
CONCAT(#{board_year},'-',#{board_label},'-',RIGHT(CONCAT('000',IFNULL(CAST(MAX(right(board_serial_no,3)) as unsigned),0)+1),3)) AS board_serial_no
FROM
tbl_contract
WHERE
SUBSTRING_INDEX(board_serial_no, '-', 2)= CONCAT(#{board_year},'-',#{board_label})
</select>
|
cs |
가장 중요한 부분인 xml입니다...하나하나 뜯어보도록하죠!
CONCAT
CONCAT 함수는 문자열을 합쳐주는 함수입니다.
위에서 Substring으로 짜른 년월과 회사이름, 그리고 부여할 번호를 000-000-000 형토로 CONCAT함수를 이용하여 붙일 예정입니다.
RIGHT
RIGHT함수는 문자에 오른쪽을 기준으로 일정한 갯수를 가져옵니다.
결국 마지막 부여할 번호 000 의 3자리를 가져온다는 말인거죠
IFNULL
IFNULL은 해당필드의 값이 NULL일 경우, 다른 값으로 출력하는 함수입니다.
즉 board_serial_no가 null일 경우 0을 출력하란 말입니다.
CAST
CAST는 전달받은 값을 다른 타입으로 변환해줍니다.
제가 사용한 unsigned는 Integer, 즉 숫자로 변환해준다는 겁니다.
MAX
MAX는 항목의 데이터의 최대값을 가져오는 함수입니다.
SELECT절
1
|
CONCAT(#{board_year},'-',#{board_label},'-',RIGHT(CONCAT('000',IFNULL(CAST(MAX(right(board_serial_no,3)) as unsigned),0)+1),3)) AS board_serial_no
|
cs |
concat으로 문자열을 붙여줍니다.
마지막 부여할 번호에 right로 3자리만 가져옵니다.
concat으로 +1을 합쳐주는데
ifnull을 통해서 만약에 기존 board_serial_no의 최대값이 있으면 숫자형태로 변환해주고, 없으면 0을 반환시킵니다.
별칭은 as를 통해서 컬럼값과 동일한 board_serial_no로 설정합니다.
WHERE 절
1
|
SUBSTRING_INDEX(board_serial_no, '-', 2)= CONCAT(#{board_year},'-',#{board_label})
|
cs |
substring_index
substring_index는 문자열을 자르고 인덱스에 맞게 가져오는 방법입니다. 2102-samsung-001를 예시로 들면...
subString_Index를 통해서 2번째 인덱스까지 가져오면 2102-samsung 이런 모양이 나옵니다.
그리고 concat으로 데이터를 붙여보면 이또한 2102-samsung 이모양이 나옵니다.
즉, 기존 board_serial_no 컬럼의 데이터와 현재 만들어낼 board_serial_no 의 앞 인덱스 2자리가 같다는 조건하에,
concat으로 컬럼값 세개를 붙일건데 마지막 부여번호에서 기존 board_serial_no 의 부여번호가 있으면
숫자로 변환해서 +1을 하고, 없으면 0에 +1을 한다는 내용입니다.
Controller
1
2
3
|
view.setBoard_Serial_no(nextSerialNo);
boardService.insertBoardVO(view);
|
cs |
마지막으로 board_serial_no에 넣은 다음 insert 시켜주면 됩니다.
'JAVA' 카테고리의 다른 글
[JAVA] 구글 OTP 구현 방법 (영상 有) (9) | 2021.09.01 |
---|---|
[JAVA] 두 날짜 데이터값 계산하는 방법 (faet.D-DAY 계산) (0) | 2021.08.01 |
[JAVA] 자바에서 날짜 포맷 변경하는 방법 (0) | 2020.10.20 |
[JAVA] 달력의 요일과 주중/주말 구하는 방법 (0) | 2020.10.15 |
[JAVA] 이메일 문자열 나누는 방법 (아이디 / 도메인] (0) | 2020.09.18 |
댓글