개발(~국비)/Project

SelectKey 예

까만밀가루 2022. 9. 14. 00:00

글 등록시 파일 테이블이 따로 있으며 파일 저장시 공지사항번호(글번호)는 같아야 한다.

이때 사용한 selectkey 

: 값을 가지고 다시 쿼리를 DB에 전송하기 보단 , selectkey를 이용하여 DB에 명령을 한번만 보내어

우선 입력한 값의 결과값을 다름 쿼리로 바로 return해줄수있다.

 

keyProperty selectKey구문의 결과가 셋팅될 대상 프로퍼티.
keyColumn 리턴되는 결과셋의 칼럼명은 프로퍼티에 일치한다. 여러개의 칼럼을 사용한다면 칼럼명의 목록은 콤마를 사용해서 구분한다.
resultType 결과의 타입. 마이바티스는 이 기능을 제거할 수 있지만 추가하는게 문제가 되지는 않을것이다.
마이바티스는 String을 포함하여 키로 사용될 수 있는 간단한 타입을 허용한다.
order BEFORE 또는 AFTER를 셋팅할 수 있다. BEFORE로 설정하면 키를 먼저 조회하고
그 값을 keyProperty 에 셋팅한 뒤 insert 구문을 실행한다. AFTER로 설정하면
insert 구문을 실행한 뒤 selectKey 구문을 실행한다. 오라클과 같은 데이터베이스에서는
insert구문 내부에서 일관된 호출형태로 처리한다.
statementType 위 내용과 같다. 마이바티스는 Statement, PreparedStatement 그리고 CallableStatement을
매핑하기 위해 STATEMENT, PREPARED 그리고 CALLABLE 구문타입을 지원한다.

 


 

<insert parameterType="com.moaplace.vo.AdminNoticeVO"
		id="insert">
		<selectKey keyProperty="notice_num" order="BEFORE"
			resultType="int">
			select notice_seq.nextval from dual
		</selectKey>
		insert into notice values(#{notice_num}, 1, #{sort_num},
		#{notice_title}, #{notice_content}, sysdate, 0)
	</insert>

 

before을 이용하여 키를 먼저 조회하여 notice의 시퀀스 번호를 받는다.

 

@Transactional(rollbackFor = Exception.class)
	public int insert(List<MultipartFile> multipartFile, AdminNoticeVO vo) {
		log.info("인자로 받은 AdminNoticeVO : " + vo);
		log.info("============================서비스 확인값==========================");
		mapper.insert(vo);
		log.info("selectKey 사용 후 VO : " + vo);
		try {
			if (multipartFile.size() > 0 && !multipartFile.get(0).getOriginalFilename().equals("")) {
				//파일이 저장될 경로 설정 및 기스가 없다면 설정하기, 컨트롤러에선 realpath 사용 못함 		
				 String path = realPath; 
				 System.out.println("경로확인" + path);
				 File dir = new File(path + File.separator + "notice" + File.separator);
				 log.info("파일경로:"+dir);
				 if(!dir.isDirectory()){
					 dir.mkdirs();
				 }
				
				for (MultipartFile file : multipartFile) {
					
					String originalFilename = file.getOriginalFilename(); // 원본 파일명
					String savefilename = UUID.randomUUID() + "_" + originalFilename; // 실제 저장 될 파일명
					InputStream is = file.getInputStream(); // 파일 읽어오기
					File f = new File(path + File.separator + "notice" + File.separator + savefilename);
					FileOutputStream fos = new FileOutputStream(f); // 파일 저장하기
					FileCopyUtils.copy(is, fos);
					is.close();
					fos.close();
					long filesize = file.getSize();
					detailmapper.detailinsert(
							new AdminNoticeDetailVO(0, vo.getNotice_num(), originalFilename, savefilename, filesize));
				}
				return 0;
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			return -1;
		}
//		log.info("mapper.insert값 확인 try 후: "+vo);
//		log.info("================================================================");
		return 1;
	}

 

log를 이용해 selectkey가 제대로 들어갔는지 확인 후, 동일한 num을 얻어와 파일 테이블에 저장한다.

이떄 파일 테이블과 글 테이블에 트랜잭션처리한다.