Java MyBatis 데이터베이스 삽입 반환 키 상세 정보
아래 코드와 같이 삽입된 키를 가져옵니다.
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"이 속성은 전달된 매개 변수 실체 클래스를 가리킨다
실체 클래스에 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: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();
}
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.