괴발개발/Spring Framework

(MyBatis)mapper에서 insert 후 생성된 auto_increment 값을 리턴하기(가져오기)

moonday 2021. 9. 11. 14:08
auto_increment - primary key에만 걸 수 있음
mapper에서 insert구문으로 해당 테이블에 값을 입력하면 해당 row에서 primary key 메인키(주요키)로서 auto_increment 설정이 걸려서 따로입력을하지않더라도 값이 일정으로 증가하면서 값을 자동으로 넣어주는데.

 

해당 값은 입력 후, unique값을 조회하지 않으면 auto_increment가 걸려서 자동으로 입력됐던 값을 알 수가 없음.

mapper에서 insert 후, 해당 값을 가져오는 방법

 

1. DB에 값을 입력하는 코드들을 짜서 수행한다.

2. mapper.xml에서 DB에 입력할 떄 아래와 같은 사항을 insert구문에 입력해준다

	<insert id="insertStudentInfo"
		useGeneratedKeys="true" keyProperty="studentInfo.student_id"
	  parameterType="kr.~~~.~~~.vo.StudentVO">
		insert into student 
		(teacher_student_id, parent_student_phone, student_name, student_zipcode, student_number_address,student_road_address,
		student_reference_address, student_detail_address, student_birthdate,
		student_school, student_note, student_registration_date, student_gender,
		student_phone, student_image_path)
			values
			(#{teacher_id}, #{studentInfo.parent_student_phone}, #{studentInfo.student_name}, #{studentInfo.student_zipcode}, #{studentInfo.student_number_address},
			#{studentInfo.student_road_address}, #{studentInfo.student_reference_address}, #{studentInfo.student_detail_address},
			#{studentInfo.stringBirth}, #{studentInfo.student_school}, #{studentInfo.student_note}, 
			#{studentInfo.stringRegister}, #{studentInfo.student_gender},
			#{studentInfo.student_phone}, #{studentInfo.student_image_path});
	</insert>

insert구문에서 문법을 지키고, 본인이 넣어야할 값들을 알아서 쿼리를 짠 뒤, 아래의 내용을 함께 적어줌

useGeneratedKeys="true"
=> insert구문 수행 뒤, 생성된 키를 다시 받아올 것인지? true


keyProperty="studentInfo.student_id"
=>입력하는 객체의 어떤 값을 받아오려고 하는지 / param을 썼다면 앞에 param.알고자하는 AI걸린 변수명


parameterType="kr.portfolio.forfree.vo.StudentVO"
=> AI걸린변수값을 getter() 메소드를 이용해서 부를 수 있게해주는 객체의 타입

 

3. insert를 실행시키라는 주문을 하는 클래스(serviceImp)로가서 insert를 실행시킨 이후의 라인에서,

해당 값을 담고있는 객체명.getAI걸렸던변수명(); 을 진행하면 값이 불러와짐. (예: studentInfo.getStudent_id();)

다른건 아무것도 안해도 됨.

	@Override
	public Integer insertStudentInfo(StudentVO studentInfo, TeacherVO loginUser) {
		System.out.println("서비스임프1");
		if(loginUser == null) {
			return null;
		}
		if(studentInfo.getStudent_name() == null || 
				studentInfo.getStudent_name().trim().length()==0) {
			return null;
		}
		if(studentInfo.getStringBirth().trim().length()==0) {
			studentInfo.setStringBirth(null);			
		}
		if(studentInfo.getStringRegister().trim().length()==0) {
			studentInfo.setStringRegister(null);
		}
		studentDao.insertStudentInfo(studentInfo, loginUser.getTeacher_id());
		int studentId= studentInfo.getStudent_id();
		System.out.println(studentId);
		return studentId; 
	}

 

4. 만약, 해당 값을 controller로 이동시켜야 한다면?

service, serviceImp, dao 의 해당 코드 선언부의 리턴타입을 AI걸린게 넘어올수있는 타입으로 넣어주면됨.

 

service

public Integer insertStudentInfo(StudentVO studentInfo, TeacherVO loginUser);

 serviceImp

public Integer insertStudentInfo(StudentVO studentInfo, TeacherVO loginUser) {
		~~~~~실행코드
		studentDao.insertStudentInfo(studentInfo, loginUser.getTeacher_id());
		int studentId= studentInfo.getStudent_id();
return studentId;

dao (*돌려받을 값의 타입을 맞춰줘야함. AI걸린 int형식의 고유번호id값을 받을때 int나 Integer로)

Integer insertStudentInfo(
	@Param("studentInfo")StudentVO studentInfo, @Param("teacher_id")Integer teacher_id);

controller

Integer newStudentId = studentService.insertStudentInfo(studentInfo, loginUser);
System.out.println("컨트롤러 3 id : "+ newStudentId); //해당값이 콘솔에 출력됨