최근 전자 상거래 시스템의 비즈니스 요구로 인해 제품 정보를 삽입 한 후 제품 ID로 돌아 가야합니다. 처음에 나는 약간의 함정을 만났기 때문에 앞으로 잊혀지지 않도록 여기에서 메모를했습니다.
다음 코드와 같이 삽입 된 기본 키를 가져옵니다
사용자 user = 새 사용자 (); user.setusername ( "Chenzhou"); user.setpassword ( "xxxx"); user.setcomment ( "기본 키를 반환하기 위해 데이터를 삽입하는 기능을 테스트"); System.out.println ( "삽입 전 기본 키는"+user.getUserid ()); userdao.insertandgetid (user); // insert operation system.out.println ( "삽입 후 기본 키는 :"+user.getuserid ());
온라인 정보를 쿼리 한 후 대략 두 가지 방법이 있음을 알았습니다.
방법 1 : 방법 1
엔티티 클래스의 매핑 파일 "*mapper.xml"에서 다음과 같이 작성됩니다.
<insert id = "insertAndgetId"useGenerateKeys = "true"keyProperty = "userId"ParameterType = "com.chenzhou.mybatis.user"> user (username, password, comment) value (#{username},#{password},#{comment}) </insert>팁 :
usegeneratedkeys = "true"는 기본 키에 대한 자체 성장을 설정하는 것을 의미합니다
keyProperty = "userId"는 엔티티 클래스의 userId 필드에 성장 ID를 할당하는 것을 의미합니다.
parametertype = "com.chenzhou.mybatis.user"이 속성은 전달 된 매개 변수 엔티티 클래스를 가리 킵니다.
다음은 <insert> </insert>에 resultType 속성이 없다는 것을 상기시켜줍니다. 무작위로 추가하지 마십시오.
엔티티 클래스의 uerid에는 getter () 및 setter ()가 있어야합니다. 방법
MySQL 데이터베이스에서 테이블을 구축 할 때 이미 필드 자체 성장을 설정 했으므로 마침내 두 번째 방법을 선택했습니다.
두 번째 방법 :
또한 엔티티 클래스의 매핑 파일 "*mapper.xml"에서는 다음과 같이 작성해야합니다.
<!-제품 삽입-> <insert id = "insertProduct"ParameterType = "domain.model.productbean"> <selectkey resulttype = "java.lang.long"order = "after"keyproperty = "uppertid"> select last_insert_id () </selectkey> insert t_product (ProductName, ProductDesrcible, MerchantId) 값 (#{productName},#{productDesrcible},#{merchantid}); </삽입>팁 :
<insert> </insert>에는 결과 유형 속성이 없지만 <selectkey> </selectkey> 태그가 있습니다.
Order = "After"는 삽입 문이 먼저 실행되고 쿼리 문이 실행되었음을 의미합니다.
전후에 설정할 수 있습니다.
이전으로 설정되면 먼저 기본 키를 선택하고 KeyProperty를 설정 한 다음 삽입 문을 실행합니다.
After로 설정되면 먼저 삽입 문을 실행 한 다음 Oracle Database와 유사한 SelectKey 요소를 실행하면 Oracle 데이터베이스와 같이 삽입 문에 시퀀스 호출을 포함시킬 수 있습니다.
keyProperty = "userId"는 엔티티 클래스의 userId 필드에 성장 ID를 할당하는 것을 의미합니다.
select last_insert_id ()는 방금 삽입 된 레코드의 자체 성장 ID가 MySQL 구문에서 쿼리되었음을 의미합니다.
엔티티 클래스의 uerid에는 getter () 및 setter ()가 있어야합니다. 방법
요구 사항을 달성하기 위해 위의 사항만으로도 충분합니다.
여기에 관심이 있으시면 Mybatis에서 실수 가능한 실수에 대해 계속 들어주십시오.
삽입 데이터베이스가 성공하고 삽입 된 데이터를 읽을 수 있지만 데이터베이스를 열면 삽입 된 데이터를 볼 수 없지만 MyBatis에서 추가 방법을 수정하는 이유는 무엇입니까?
위의 요구 사항을 구현할 때 기본 키를 삽입하고 반환하려면이 방법을 작성하지 마십시오.
@override public long insertproduct (productbean productbean) {// todo 자동 생성 메소드 스터브 sqlsession 세션 = mybatisjdbcutil.currentsession (); ProductIDAO ProductIDAO = Session.GetMapper (ProductIDAO.Class); // 여기 *.class // dao return productidao.insertproduct (productbean)의 인터페이스 계층에 해당해야합니다. }왜?
위와 같이 글을 쓰면 실행 후 원하는 기본 키 ID의 반환은 데이터베이스 문을 실행 한 후 영향을받는 행의 수가 아닙니다.
또한, 실행 후 프롬프트가 삽입에 성공적이라는 것을 알게되며 코드로 삽입 된 데이터를 읽을 수도 있지만 항상 하나의 레코드 만 있습니다.
또한 데이터베이스를 열면 데이터베이스에 데이터가 성공적으로 삽입되지 않았다는 것을 알게됩니다.
나는 오랫동안 여기서 우울했고 마침내 핵심 요점을 발견했습니다.
반환 값을 갖는 것과 반환 값이없는 것의 차이점은 다음과 같습니다.
반환 값은 데이터베이스 읽기 전용 모드에만 액세스하는 것입니다. 다양한 쿼리 방법과 같은 데이터베이스 데이터에 대한 수정이 없습니다.
리턴 값이 없으면 데이터베이스에 읽기 및 쓰기 모드로 액세스하고 데이터베이스의 데이터가 삭제 또는 추가와 같은 수정됩니다.
또한 개인적 이해에 따르면 MyBatis는 먼저 삽입 문을 실행할 때 구성된 세션과 같은 컬렉션으로 캐시한 다음 기본 드라이버를 호출하여 데이터베이스를 작동하고 수정해야합니다.
세션 .commit (); mybatisjdbcutil.closesession ();
위의 두 문장은 반환되지 않습니다. 즉,이 두 문장이 실행 된 후에 만 데이터베이스에 실행 및 삽입되어 데이터베이스의 데이터를 수정합니다.
반대로, 반환 값이있는 경우,이 두 문장은 실행되지 않으므로 추가 문은 자체적으로 구성된 세션에서만 실행되지만 데이터베이스에 제출되지 않으므로 데이터베이스에는 레코드가 없습니다.
이는 MyBatis에서 추가 방법을 수정 한 후 데이터베이스가 성공적으로 삽입되었다는 것을 알리지 만 데이터베이스를 열 때 삽입 된 데이터를 볼 수는 없습니다.
Mybatis의 삽입 명세서 방법에는 이와 같이 쓰는 것이 정확하므로 반환 값이 없어야합니다.
@override public void insertProduct (ProductBean ProductBean) {// todo 자동 생성 메소드 스터브 sqlsession 세션 = mybatisjdbcutil.currentsession (); ProductIDAO ProductIDAO = session.getMapper (productIdao.class); // 여기 *.class // dao productidao.insertproduct (productbean)의 인터페이스 계층에 해당해야합니다. 세션 .commit (); mybatisjdbcutil.closesession (); }위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.