Java MyBatis 데이터베이스 삽입 반환 키 상세 정보

최근에 전자상거래 시스템을 만드는 과정에서 업무 수요로 인해 제품 정보를 삽입한 후에 제품 Id로 돌아가야 한다. 처음에 약간의 구덩이를 만났는데 여기서 메모를 해서 앞으로 잊어버리지 않도록 해야 한다.
아래 코드와 같이 삽입된 키를 가져옵니다.

User user = new User(); 
user.setUserName("chenzhou"); 
user.setPassword("xxxx"); 
user.setComment(" "); 
 
System.out.println(" :"+user.getUserId()); 
userDao.insertAndGetId(user);//  
System.out.println(" :"+user.getUserId()); 
인터넷 자료를 조회한 결과 대체로 두 가지 방식이 있음을 발견하였다.
방식 1:
엔티티 클래스의 맵 파일 "*Mapper.xml"에 다음과 같이 쓰십시오.

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
  insert into user(userName,password,comment)
  values(#{userName},#{password},#{comment})
</insert>
Tips:
useGeneratedKeys = "true"는 키 설정이 자동으로 증가함을 나타냅니다.
keyProperty = "userId"는 성장한 Id를 실체 클래스의 userId 필드에 부여합니다.
parameterType = "com.chenzhou.mybatis.User"이 속성은 전달된 매개 변수 실체 클래스를 가리킨다
에resultType 속성이 없습니다. 함부로 추가하지 마십시오.
실체 클래스에 uerId는 getter () and setter () 가 있어야 합니다.방법
나는 MySQL 데이터베이스에서 표를 작성할 때 필드가 자동으로 증가하는 것을 설정했기 때문에 결국 두 번째 방식을 선택했다.
두 번째 방법:
솔리드 클래스의 맵 파일 "*Mapper.xml"과 동일하지만 다음과 같이 쓰십시오.

  <!--   -->
  <insert id="insertProduct" parameterType="domain.model.ProductBean" >
    <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
     SELECT LAST_INSERT_ID()
   </selectKey>
    INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
  </insert>
Tips:
에resultType 속성은 없지만 라벨은 있습니다.
order = "AFTER"는 삽입문을 실행한 다음 조회문을 실행합니다.
BEFORE 또는 After로 설정할 수 있습니다.
BEFORE로 설정하면 먼저 주 키를 선택하고 keyProperty를 설정한 다음 삽입 문장을 실행합니다.
AFTER로 설정하면 삽입 문장을 실행하고 selectKey 요소를 실행합니다. - 이것은 Oracle 데이터베이스와 유사합니다. 삽입 문장에 시퀀스를 삽입하여 호출할 수 있습니다.
keyProperty = "userId"는 성장한 Id를 실체 클래스의 userId 필드에 부여합니다.
SELECT LAST_INSERT_ID()는 MySQL 구문에서 방금 삽입한 레코드가 증가 Id에서 조회됨을 나타냅니다.
실체 클래스에 uerId는 getter () and setter () 가 있어야 합니다.방법
수요를 실현하려면 위의 그것만으로도 충분하다.
여기에 흥미가 있다면, Mybatis에서 잘못 들어갈 수 있는 구덩이에 대해 계속 들어보세요.
왜 Mybatis에서 추가 방법을 되돌려 주는 값이 있는 것으로 수정한 후에 데이터베이스 삽입에 성공했고 삽입된 데이터를 읽을 수 있음을 알렸지만 데이터베이스를 열면 삽입된 데이터를 볼 수 없습니까?
상술한 수요를 실현할 때 삽입한 후 메인 키로 돌아가려면 이렇게 쓰지 마십시오.

  @Override
  public Long insertProduct(ProductBean productBean) {
    // TODO Auto-generated method stub
    SqlSession session = MybatisJDBCUtil.currentSession();

    ProductIDao productIDao = session.getMapper(ProductIDao.class);//  *.class
                                    //  DAO 
    return productIDao.insertProduct(productBean);
    
  }
Why?
만약 당신이 위에서 이렇게 썼다면, 실행 후에 돌아오는 것도 당신이 원하는 메인 키 Id가 아니라 데이터베이스 문장을 실행한 후에 영향을 받는 줄 수이기 때문이다.
그리고 실행하면 삽입에 성공했다는 알림을 발견하고 코드로도 삽입된 데이터를 읽을 수 있지만 영원히 기록만 있을 뿐이다.
그리고 데이터베이스를 열면 데이터베이스에 성공한 데이터가 없습니다.
나는 이곳에서 오랫동안 우울해하다가 마침내 관건을 발견했다.
반환 값과 반환 값이 없는 차이점은 다음과 같습니다.
반환 값이 있는 것은 데이터베이스 읽기 전용 모드에서만 데이터베이스에 접근하고 데이터베이스 데이터에 대해 어떠한 수정도 하지 않는다. 예를 들어 각종 방식의 조회 등이다.
반환 값이 없으면 읽기와 쓰기 모드로 데이터베이스에 접근하고 데이터베이스에 있는 데이터를 수정합니다. 예를 들어 삭제, 증가입니다.
그 밖에 개인적인 이해에 따라 mybatis는 삽입 문장을 실행할 때 구조된 유사session 집합에 캐시를 한 다음에 베이스 드라이브를 호출하여 데이터베이스 수정을 조작해야 한다.

session.commit();    
MybatisJDBCUtil.closeSession();
되돌릴 가치가 없어야 위의 두 문장이 있다. 즉, 이 두 문장을 실행해야만 데이터베이스에 삽입된 데이터를 수정할 수 있다.
반대로 되돌아오는 값이 있는 것은 이 두 문장을 실행하지 않았기 때문에 자신이 구축한session에서 추가 문장을 실행했지만 데이터베이스에 제출하지 않았기 때문에 데이터베이스에 아무런 기록이 없다.
이것 또한 왜 Mybatis에서 추가 방법을 반환값이 있는 것으로 수정한 후에 데이터베이스 삽입에 성공했지만 데이터베이스를 열면 삽입된 데이터가 보이지 않는지 설명한다.
Mybatis에 문장을 삽입하는 방법은 반환 값이 없으면 이렇게 쓰는 것이 정확합니다.

  @Override
  public void insertProduct(ProductBean productBean) {
    // TODO Auto-generated method stub
    SqlSession session = MybatisJDBCUtil.currentSession();

    ProductIDao productIDao = session.getMapper(ProductIDao.class);//  *.class
                                   //  DAO 
    productIDao.insertProduct(productBean);
    
    session.commit(); 
    
    MybatisJDBCUtil.closeSession();  
  }
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기