개발(~국비)/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을 얻어와 파일 테이블에 저장한다.
이떄 파일 테이블과 글 테이블에 트랜잭션처리한다.