아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
자유로운살모사30
자유로운살모사3021.04.02

Mybatis이용해서 인서트 할때 객체 두개 넘길 수 있나요?

안녕하세요

프로젝트 구현 중에 mapper.xml파일에 쿼리문을 작성하여 DB에 insert하는데 문제에 부딪혀서 질문 드려요!

회원 가입 시 멤버 vo객체와

마이타운이라는 주소를 별도로 저장하는 vo객체까지

2개의 객체를 컨트롤러에서 파라미터로 넘겨주는데

이 vo객체를 별도의 DB에 넣어야 해서

Insert all 을 이용해 넣으려고 했습니다

근데 parameterType을 뭐라고 적어야 할지ㅠㅠ

맵이나 리스트로 묶어서 보내면 가능한건가요?

객체 두개를 insert all로 DB에 저장하는 방법을 알고싶어요!

55글자 더 채워주세요.
답변의 개수
3개의 답변이 있어요!
  • 보통 Mapper를 서비스 단위로 만들고 Mapper 안에 insert 문을 테이블별(VO별) 로 만드는게 보통입니다.

    질문자 님께서는 특정맵퍼.insertAll(); 처럼 메소드 하나로 두개의 테이블에 데이터를 동시에 넣으실려고 하시는거 같은데..

    이렇게 할수도 없겠지만...해서도 안될거 같네요.

    만약 두개의 테이블에 데이터를 넣을때 첫번째 테이블에 데이터를 집어넣다가 익셉션 발생시 두번째 테이블에 데이터를 넣으면 안되는 경우 넣을 데이터를 리스트에 담아서 for문을 돌리면서 예외처리를 하면 될거 같구요.

    결론은 맵퍼에 insert문을 테이블이 다르면 두번 호출 하셔야 할거 같습니다.

    이게 두개의 테이블 각각에 데이터를 넣다가 익셉션 발생하면 그에 맞는 처리하는것도 쉽고..

    데이터 인서트 실패시 전체를 롤백할 것인지..아니면 문제가 되는 로우만 제처리 하든지..여러가지 상황에 대처하기 쉽습니다.

    테이블당 insert문이 각각 있으면 다른 서비스에서도 사용하기 쉽고 유지보수도 쉽습니다.

    컨트롤러나 서비스 클레스 에서 맵퍼의 인서트문을 개별로 호출하세요. ^^


  • 탈퇴한 사용자
    탈퇴한 사용자21.04.03

    아래의 두 Value Object로 받고 있다는 말씀이시네요.

    1. member VO

    2. myTown VO

    별도의 DB라는 것이 질문에서는 명확하게 드러나지 않는데요.
    이것이 별도의 DBMS라는 것일까요? 아니면 별도의 Table이라는 것일까요?

    일단 간단히 해결할 수 있는 방법을 설명하면 Controller에서 한번에 저장을 하려고 하는 대신,
    insert를 두 번 호출을 하는 것으로 쉽고 간단하면서도 단순하게 처리가 가능할 것 같습니다.

    Controller -> Service -> Repository 관점에서 보면

    1. Controller : member VO + myTown VO

    2. Service: save member and myTown

    3. Repository action 1: insert member

    4. Repository action 2: insert myTown

    위와 같이 역할을 나눠 볼 수 있겠네요.


  • 안녕하세요.

    생각하시는 map 또는 list로 넘기셔도 되고, 여러 vo을 담을 수 있는 새로운 vo을 만들어 사용하셔도 됩니다.

    아래는 3가지 방법에 대한 사용 예제입니다.

    개발 환경에 따라 사용방법은 조금 다를 수 있습니다.

    1. Map 사용

    // Java Map<String, Object> map = new HashMap<>(); map.put("memberVO", memberVO); // 멤버 VO map.put("myTownVO", myTownVO); // 마이타운 VO sqlSession.insert("쿼리ID", map); // Mybatis <insert id="쿼리ID"> INSERT ALL INTO 테이블 (USER_ID, USER_NM) VALUES (#{memberVO.userId}, #{memberVO.userNm}) INTO 테이블2 (USER_ID, ADDR) VALUES (#{memberVO.userId}, #{myTownVO.addr}) SELECT * FROM DUAL </insert>

    2. List 사용

    // Java List<Object> list = new ArrayList<>(); list.add(memberVO); list.add(myTownVO); sqlSession.insert("쿼리ID", list); // Mybatis <insert id="쿼리ID" parameterType="list"> INSERT ALL <!-- 여기에서 list는 임의의 변수명이고 다른 이름으로 해도 무관합니다. --> INTO 테이블 (USER_ID, USER_NM) VALUES (#{list[0].userId}, #{list[0].userNm}) INTO 테이블2 (USER_ID, ADDR) VALUES (#{list[0].userId}, #{list[1].addr}) SELECT * FROM DUAL </insert>

    3. Wrapper VO 사용

    // Wrapper VO public class WrapperVO { private MemberVO memberVO; private MyTownVO myTownVO; // getter / setter 생성 } // Java WrapperVO wrapperVO = new WrapperVO(); wrapperVO.setMemberVO(memberVO); wrapperVO.setMyTownVO(myTownVO); sqlSession.insert("쿼리ID", wrapperVO); // Mybatis <insert id="쿼리ID"> INSERT ALL INTO 테이블 (USER_ID, USER_NM) VALUES (#{memberVO.userId}, #{memberVO.userNm}) INTO 테이블2 (USER_ID, ADDR) VALUES (#{memberVO.userId}, #{myTownVO.addr}) SELECT * FROM DUAL </insert>