Mybatis【7】-- Mybatis如何知道增刪改是否成功執行?
程式碼直接放在Github倉庫【https://github.com/Damaer/Mybatis-Learning/tree/master/mybatis-05-CURD 】
需要宣告的是:此Mybatis
學習筆記,是從原始的Mybatis
開始的,而不是整合了其他框架(比如Spring
)之後,個人認為,這樣能對它的功能,它能幫我們做什麼,有更好的理解,後面再慢慢疊加其他的功能。
我們知道很多時候我們有一個需求,我們需要把插入資料後的id返回來,以便我們下一次操作。
其實一開始的思路是我插入之後,再執行一次select,根據一個唯一的欄位來執行select
操作,但是Student
這個類如果插入後再根據名字或者年齡查出來,這根本就是不可行的!!!重名與同年齡的人一定不少。
我們的測試方法如下,我們可以看到插入前是沒有值的,插入後就有了值:
/**
* 測試插入後獲取id
*/
@Test
public void testinsertStudentCacheId(){
Student student=new Student("helloworld",17,85);
System.out.println("插入前:student="+student);
dao.insertStudentCacheId(student);
System.out.println("插入後:student="+student);
}
useGeneratedKeys 設定主鍵自增
<insert id="insertStudentCacheId" useGeneratedKeys="true" keyProperty="id" parameterType="Student"> insert into student(name,age,score) values(#{name},#{age},#{score}) </insert>
需要注意的點:
- 1.
useGeneratedKeys="true"
表示設定屬性自增 - 2.
keyProperty="id"
設定主鍵的欄位 - 3.
parameterType="Student"
設定傳入的型別 - 4.注意:雖然有返回型別,但是我們不需要手動設定返回的型別,這個是由框架幫我們實現的,所以對應的介面方法也是沒有返回值的,會修改我們插入的物件,設定id值。
- 5.實體類中id屬性欄位一定需要set以及get方法
使用selectKey 查詢主鍵
<insert id="insertStudentCacheId" parameterType="Student"> insert into student(name,age,score) values(#{name},#{age},#{score}) <!-- 指定結果型別resultType,keyProperty是屬性,自動返回到屬性id中,order是次序,after是指獲取id是在於插入後 --> <selectKey resultType="int" keyProperty="id" order="AFTER"> select @@identity </selectKey> </insert>
或者寫成:
<insert id="insertStudentCacheId" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
<!-- 指定結果型別resultType,keyProperty是屬性,自動返回到屬性id中,order是次序,after是指獲取id是在於插入後 -->
<selectKey resultType="int" keyProperty="id" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
</insert>
注意要點:
- 1.最外層的
<insert></insert>
沒有返回屬性(resultType)
,但是裡面的<selectKey></selectKey>
是有返回值型別的。 - 2.
order="AFTER"
表示先執行插入,之後才執行selectkey
語句的。 - 3.
select @@identity
和select LAST_INSERT_ID()
都表示選出剛剛插入的最後一條資料的id。 - 4.實體類中id屬性欄位一定需要set以及get方法
- 5.此時,介面中仍不需要有返回值,框架會自動將值注入到我們
insert
的那個物件中,我們可以直接使用就可以了。
其實,我們的介面中可以有返回值,但是這個返回值不是id,而是表示插入後影響的行數,此時sql中仍和上面一樣,不需要寫返回值。
<insert id="insertStudentCacheIdNoReturn" parameterType="Student">
insert into student(name,age,score) values(#{name},#{age},#{score})
<!-- 指定結果型別resultType,keyProperty是屬性,自動返回到屬性id中,order是次序,after是指獲取id是在於插入後 -->
<selectKey resultType="int" keyProperty="id" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
</insert>
介面中:
// 增加新學生並返回id返回result
public int insertStudentCacheId(Student student);
介面的實現類:
public int insertStudentCacheId(Student student) {
int result;
try {
sqlSession = MyBatisUtils.getSqlSession();
result =sqlSession.insert("insertStudentCacheId", student);
sqlSession.commit();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
return result;
}
Test中:
public void testinsertStudentCacheId(){
Student student=new Student("helloworld",17,101);
System.out.println("插入前:student="+student);
int result = dao.insertStudentCacheId(student);
System.out.println(result);
System.out.println("插入後:student="+student);
}
結果證明:result的值為1,表示插入了一行,檢視資料庫,確實插入了資料。
PS:如果無法建立連線,需要把Mysql
的jar包升級:
<!-- mysql驅動包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
如果報以下的錯誤,那麼需要將&改成轉義後的符號&
:
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 107; 對實體 "serverTimezone" 的引用必須以 ';' 分隔符結尾。
在xml裡面配置需要轉義,不在xml檔案裡面配置則不需要
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&serverTimezone=UTC"/>
【作者簡介】:
秦懷,公眾號【秦懷雜貨店】作者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界希望一切都很快,更快,但是我希望自己能走好每一步,寫好每一篇文章,期待和你們一起交流。
此文章僅代表自己(本菜鳥)學習積累記錄,或者學習筆記,如有侵權,請聯絡作者核實刪除。人無完人,文章也一樣,文筆稚嫩,在下不才,勿噴,如果有錯誤之處,還望指出,感激不盡~