Mybatis 에서 mapper.xml 파일 update,delete 및 insert 반환 값 문 제 를 해결 합 니 다.

최근 에 매우 간단 한 인터페이스(CRUD)를 몇 개 썼 는데 유닛 테스트 에서 문제 가 생 겼 습 니 다.다음 과 같이 잘못 보 고 했 습 니 다.
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'messageListener': Unsatisfied dependency expressed through field 'reviewCheckInfoService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reviewCheckInfoServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reviewCheckInfoDao' defined in file [/Users/a1475368628/IdeaProjects/baby-customer-parent/baby-customer-service/target/classes/com/dianping/baby/customer/reviewcheck/dao/ReviewCheckInfoDao.class]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'sqlSessionFactory' threw exception; nested exception is java.lang.NullPointerException
자세 한 조 사 를 통 해 문제 의 원인 은 sql 의 xml 설정 파일 이 잘못 되 었 기 때 문 입 니 다.직접적인 원인 은 update 에서 KeyProperty,useGenerated Keys 를 잘못 사 용 했 기 때 문 입 니 다.
관련 지식 을 공부 한 후에 여기 서 자세히 정리 하 세 요.
Mybatis 의 xml 설정 파일 에서 insert 와 update 에서 속성 KeyProperty,useGenerated Keys 를 설정 하여 홈 키 의 값 을 되 돌려 줍 니 다.
DAO 층 에 방법 이 있 습 니 다.
public int addUser(@Param("user")User user);
대응 하 는 xml 파일 중:

<insert id="addUserType="map" keyProperty="user.id" useGeneratedKeys="true">
 INSERT INTO a_user
 (
  AgeType,
  CityId,
  AddTime,
  UpdateTime
  )
  VALUES
  (
  #{user.ageType},
  #{user.cityId},
  NOW(),
  NOW()
  )
</insert>
내 가 잘못 생각 한 것 은 addUser()라 는 방법 은 기록 을 삽입 한 자체 증가 id 값 을 되 돌려 줍 니 다.결과 테스트 를 할 때 addUser()방법 반환 값 은 항상 1 입 니 다.자세히 공부 한 후에 알 게 되 었 다.
insert 에 대응 하 는 방법 은 데이터 베 이 스 를 삽입 하 는 줄 수 를 되 돌려 줍 니 다.(예 를 들 어 데 이 터 를 삽입 할 때마다 adduser()는 1 을 되 돌려 줍 니 다.)
update 에 대응 하 는 방법 반환 값 은 데이터베이스 와 일치 하 는 항목 수 입 니 다.(최종 적 으로 데 이 터 를 수정 하 든 안 하 든 어떤 기록 이 일치 하 는 조건 에 부합 하면 반환 값 은 1 을 추가 합 니 다)
예:
update table_name set name="li" where cid = 3.
만약 데이터베이스 에 두 개의 데이터 가 다음 과 같다 면:
1. name:li cid=3
2. name:ly cid=3
이 두 데 이 터 는 모두 update 일치 조건 에 부합 되 지만 첫 번 째 데 이 터 는 수정 할 필요 가 없습니다.두 번 째 데이터 의 name 값 만 변경 되 었 을 뿐 최종 반환 값 은 2 입 니 다.
delete 대응 방법 반환 값 은 삭 제 된 데이터 항목 수 입 니 다.
한편,KeyProperty,useGenerated Keys 두 속성 은 user 대상 의 id 값(id 는 홈 키)을 설정 하 는 데 사 용 됩 니 다.

User user = new User();
user.setAgeType(1); 
user.setCityId(1);
addUser(user);
System.out.println(user.id);
위 와 같이,우 리 는 user 대상 의 id 값 을 설정 하지 않 았 지만,정확 한 id 를 출력 할 수 있 습 니 다.
물론 selectKey 를 사용 해도 같은 효 과 를 거 둘 수 있다.

추가 지식:Mybatis Update 작업 반환 값 이 영향 을 받 는 항목 으로 변경 되 었 습 니 다.
도대체 update 반환 값 은 무엇 을 의미 합 니까?우리 가 검증 해 보면 다음 과 같은 표 한 장과 두 개의 데이터 가 있다 고 가정 할 수 있다.
간단 한 유닛 테스트 사례 를 작성 하여 검증 합 니 다.먼저 my batis 를 사용 하여 mapper 를 간단하게 작성 하여 업데이트 작업 을 합 니 다.그 중에서 xml 의 내용 은 다음 과 같 습 니 다.
데이터베이스 연결 설정:
받 아 보 겠 습 니 다.간단 한 유닛 테스트 를 작성 하여 확인 하 겠 습 니 다.update 의 반환 값 이 영향 을 받 은 기록 의 갯 수 인지,해당 하 는 유닛 테스트 코드 는 다음 과 같 습 니 다.
유닛 테스트 코드 를 통 해 알 수 있 듯 이 데이터베이스 에 기 록 된 두 개의 phone 필드 의 값 을 12345678 에서 66666666 으로 수정 하고 정상 적 인 상황 에서 resultCode 는 2 로 돌아 갈 것 입 니 다.update 작업 이 데이터베이스 에 있 는 이 두 개의 기록 에 영향 을 미 치기 때문에 이것 은 우리 가 기대 하 는 2 와 일치 합 니 다.그러면 모든 정상 적 인 상황 에서 이번 단원 테스트 가 통과 할 것 입 니 다.그러면 우 리 는 결 과 를 실행 해 보 겠 습 니 다.
유닛 테스트 가 통과 되 었 습 니 다.데이터베이스 에 있 는 기록 을 다시 봅 니 다.
이 는 my batis 의 update 업데이트 작업 반환 값 이 영향 을 받 은 줄 수 를 되 돌려 주 는 것 임 을 설명 합 니 다.정말 그렇습니까?
데이터베이스 에 있 는 기록 이 수정 되면 중복 되 는 update 작업 을 다시 실행 하면 새로운 줄 수 에 영향 을 주지 않 을 것 이라는 것 을 알 고 있 습 니 다.제 가 한 말 을 검증 하기 위해 서 해 보 겠 습 니 다.
그러면 이 논리 에 따 르 면 우리 가 이 단원 테스트 를 다시 실행 하 는 것 은 resultCode 가 0 으로 돌아 가 야 하고 우리 가 원 하 는 숫자 2 와 일치 하지 않 으 면 테스트 가 통과 하지 못 할 것 이다.유닛 테스트 다시 실행:
역시 passed.여기 서 똑똑 한 것 을 보면 알 수 있 습 니 다.기본 적 인 상황 에서 my batis 의 update 작업 반환 값 은 기 록 된 matched 의 갯 수 입 니 다.영향 을 주 는 기록 갯 수가 아 닙 니 다.엄격 한 의미 에서 이것 은 my batis 의 반환 값 이 아 닙 니 다.my batis 는 돌아 오 는 데이터베이스 연결 구동(보통 JDBC)의 반환 값 일 뿐 입 니 다.즉,구동 이 2 개의 기록 을 업데이트 하 는 데 영향 을 받는다 고 알려 주면 my batis 의 반환 값 은 2 와 my batis 자체 와 관계 가 없습니다.우리 가 굳이 my batis 의 update 작업 을 통 해 영향 을 받 은 기록 항목 수 를 명확 하 게 되 돌려 야 한다 면 방법 이 없 을 까?있 지.JDBC URL 명시 적 지정 useAffected Rows 옵션 을 통 해 저 희 는 영향 을 받 은 기록 의 항목 수 를 얻 을 수 있 습 니 다.

저 희 는 데이터베이스 연결 설정 을 약간 수정 하고 useAffected Rows 필드 를 추가 합 니 다.
이 때 my batis 의 update 작업 은 영향 을 받 은 항목 수 를 되 돌려 줍 니 다.유닛 테스트 를 다시 실행 해 보 겠 습 니 다.
update 작업 은 영향 을 받 은 기록 항목 수 를 되 돌려 줍 니 다.우 리 는 0 이 우리 가 예상 한 2 와 일치 하지 않 고 자 연 스 럽 게 유닛 테스트 가 통과 되 지 않 는 다 는 것 을 알 고 있 습 니 다.
이 문 제 는 Mybatis 에서 mapper.xml 파일 update,delete 및 insert 반환 값 문 제 를 해결 하 는 것 이 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기