Mybatis : selectKey사용법

Psj·2021년 6월 17일
1

sql

목록 보기
2/10
<insert id="acctitleWrite">
	<selectKey resultType="string" keyProperty="detail_account_cd" order="BEFORE">
            SELECT lpad(cast((IFNULL(MAX(cast(detail_account_cd as unsigned)),0) + 1) as char),3,'0') 
              FROM tb_account
             where account_cd = #{bigSelect2}
        </selectKey> 
		insert into tb_account (
					 account_cd
					,detail_account_cd
					,detail_account_nm
					,note
					,account_type
					,use_yn
		) values  ( 
					 #{bigSelect2}
					,#{detail_account_cd}  <!-- seelctKdy의 keyProperty -->
					,#{accSmall2}
					,#{accContents2}
					,#{payment2}
					,'Y'
		)
	</insert>
	    
        <selectKey resultType="string" keyProperty="detail_account_cd" order="BEFORE">
            SELECT lpad(cast((IFNULL(MAX(cast(detail_account_cd as unsigned)),0) + 1) as char),3,'0') 
              FROM tb_account
             where account_cd = #{bigSelect2}
        </selectKey> 

resultType으로 최종반환형은 string
keyProperty에 임의로 지정해주는 값은 values에 들어갈 변수명을 지정해주는것
order="BEFORE"는 insert가 되기전 selectKey를 지정해준다는 뜻이다

먼저 SELECT구문을 순서대로 살펴보겠다

  1. cast(detail_account_cd as unsigned)
    -> 현재 데이터타입이 varchar인 detail_account_cd 칼럼을 부호가 없는 숫자로 캐스팅 한다는것
  2. IFNULL(MAX(cast(detail_account_cd as unsigned)),0) + 1
    -> IFNULL은 괄호안의 왼쪽값이 null값일 경우 오른쪽 값으로 바꾼다는것인데 여기서 0으로 지정했으니 null값일 경우 0으로 바꾸는것을 예외처리한것이고
    컬럼에 값이 있을경우 MAX를 이용했으니 최대값을 불러오게되고 +1을 주었으니 최대값 +1한 값이 생성된다.
    현재 숫자로 캐스팅되었으니 현재 컬럼의 최대값 +1 숫자가 생성되게 한것이다.
  3. cast((IFNULL(MAX(cast(detail_account_cd as unsigned)),0) + 1) as char
    ->현재 숫자로 최대값을 만든것을 cast () as char를 이용하여 문자타입으로 캐스팅한것이다. 문자로 다시 캐스팅을 한 이유는 뒤에있을 lpad함수를 이용하기 위함이다.
  4. lpad(cast((IFNULL(MAX(cast(detail_account_cd as unsigned)),0) + 1) as char),3,'0')
    -> lpad함수의 첫번째 인자는 문자형태여야한다. 그렇기때문에 위에서 문자로 다시 캐스팅한것이다.
    두번째 인자는 표시할 숫자를 입력하는것인데 여기선 3만큼 그러니까 '000' 이런식으로 문자 3개만 표시되게 지정하는것이다.
    세번째 인자는 예를 들어 현재 3만큼 표시되게 지정하였는데 입력된값이 '22'이면 왼쪽부터 0으로 채운다는것이다. 그러니 '022'가 된다. 세번째 인자는 남는문자공간을 채워주는 값을 넣는것이다.
profile
Software Developer

0개의 댓글