본문 바로가기
Back-End/Spring

MyBatis) MySQL로 Insert한 데이터의 자동생성된 pk 값 가져오기.

by 어렵다어려웡 2021. 3. 22.

데이터베이스 중에서 MySQL 처럼 PK값을 자동생성해서 사용하는 DB가 있습니다.

 

주로 Insert를 했을 떄 자동생성되어 1,2,3,4,5,6 이런식으로 값이 생성되는데

 

insert를 했을 경우 해당 데이터를 즉시 조회하면 정확한 pk값을 추출해 낼 수 없습니다.

 

pk값을 추려내려는 방법은 구글링을 해보면 다양합니다.

 

max() 를 사용하는 방법이나 last_insert_id() 를 사용하는 방법 등등이 있는데

 

오늘은 MyBatis를 사용해서 공부하는 도중에 발견한 새로운 방법을 써보려고 합니다.

 

방법은 2가지로 Boot에서 MyBatis를 사용할 때 Annotation으로 쓰는방식

Spring에서 XML 방식으로 나눠서 보여드리겠습니다.

 

	
    // Boot ( Annotation )
    
    @Insert("insert into company ( company_name, company_address) 
    	values ( #{company.name}, #{company.address} ) ")
	@Options(useGeneratedKeys = true, keyProperty = "id") 
	int insert(@Param("company") Company company);
    
    // Spring (XML)
    <insert id="insert" parameterType="com.awse.domain.CompanyVO" useGeneratedKeys="true" keyProperty="id">
    	insert into company ( company_name, company_address ) values ( #{name} , #{address} )
	</insert>

Boot 의 경우 XML방식을 사용할 수 없기떄문에(?) Annotation으로 선언해서 사용하는데

@Options에 useGeneratedKeys 와 keyProperty의 value를 넣어서 사용하는 방식입니다.

 

XML방식의 경우 Mybatis 공식문서에서도 살펴볼수 있는 코드입니다.

위처럼 @Options이 아닌 <insert> 태그안에서 속성으로 사용할 수 있습니다.

 

	// Controller
    @PostMapping("")
	public CompanyVO register(@RequestBody CompanyVO company) {
		log.info(company);
		companyMapper.insert(company);
		log.info(company);
		
		return company;
	}

 

컨트롤러에서 해당 테스트를 할 경우 첫번쨰 로그에는 company의 데이터의 pk값이 0으로 나타나지만

insert 메서드를 호출한 이후 company의 데이터를 로그로 찍어볼 경우 해당 데이터에

pk값이 정상적으로 들어가는 것을 확인 할 수 있습니다.