카테고리 없음

<selectkey> 이용해서 insert 된 pk 값 가져오기, LAST_INSERT_ID does not exist 오류

원코드 2023. 3. 14. 14:54

<insert> 태그 안에 <selectkey>태그를 작성하고, selectkey 태그 안에 SELECT last_insert_id() 를 작성해주면 된다.

결과값은 insert 태그의 parameterType으로 들어온 VO로 전달되기 때문에 keyProperty는 pk값이 들어갈 변수 이름으로, resultType은 그 변수의 데이터 타입으로 작성하면 됨.

 

<mapper.xml>

<insert id="apiInsert" parameterType="com.devhouse.pm.api.item.DocsInfo">
    INSERT INTO pm.apiMain
    (
       //생략
    )
    VALUES
    (
        //생략
    )
    <selectKey keyProperty="idx" resultType="int" order="AFTER">
        SELECT last_insert_id()
    </selectKey>
</insert>

 

<mapper.java>

fun apiInsert(info: DocsInfo): Int

 

 

<service>

@Transactional(rollbackFor = [Exception::class, RuntimeException::class])
fun apiInsert(info: DocsInfo): ResultInfo {
    var codeManager: CodeManager

        mapper.apiInsert(info) //insert 쿼리

        var recordInfo = RecordInfo()
        recordInfo.apiIdx = info.idx //selectkey에서 얻어온 값
        recordInfo.content = "최초 등록"
        recordInfo.memIdx = info.memIdx

        mapper.apiRecord(recordInfo)
        codeManager = CodeManager.SUCCESS


    return ResultInfo(codeManager.code, codeManager.msg)
}

주의할 점은 selectkey로 받아온 pk이 값이 insert문의 리턴값인 mapper.apiInsert(info)로 오는게 아니라 파라미터로 넘겨줬던 info에 들어있기 때문에 info.idx로 값을 가져와야한다.

 

문제는 계속 pm.LAST_INSERT_ID dose not exist 에러가 났다는 건데, 자꾸 함수 앞에 스키마가 붙어서 문제였다. 혹시나 해서 소문자로 썼더니 해결...대소문자 별로 안중요한것 같아도 중요하다.