這是mybatis系列第六篇。沒看前文的建議先去【Java冢狐】公眾號(hào)中查看前文,方便理解和掌握。 前面五篇把MyBatis的基本用法基本介紹完畢了,強(qiáng)烈推薦大家先把前面五篇看完實(shí)際操作完再來(lái)看接下來(lái)的內(nèi)容。 增刪改返回值說(shuō)明mybatis中對(duì)db執(zhí)行增刪改操作,不管是新增、刪除、還是修改,其本質(zhì)都是使用jdbc中對(duì)應(yīng)的方法,即java.sql.Statement的executeUpdate的方法,或者java.sql.PreparedStatement的executeUpdate方法。 所以問(wèn)題的關(guān)鍵在于掌握這兩個(gè)方法的內(nèi)容,而這兩個(gè)方法的參數(shù)不一致但是返回值都是int,用來(lái)表示影響的行數(shù)。 而Mybatis的返回值再支持int的基礎(chǔ)上,還支持Integer、long、Long、boolean、Boolean、void多種類型,可謂是大大加強(qiáng)了編程的靈活性和多樣性。 但是聰明的小伙伴肯定知道,MyBatis能支持這么多種的類型,其實(shí)就是mybatis在內(nèi)部將int類型轉(zhuǎn)換成其他類型而已。沒有什么高深的東西、 了解了增刪改查的返回值后,下一步我們?cè)偃タ匆豢磈dbc和mybatis是如何獲取主鍵的。 jdbc獲取主鍵的幾種方式在聊jdbc獲取主鍵的方式之前,我們先來(lái)回想一下數(shù)據(jù)庫(kù)的主鍵是怎么樣生成的。 那mysql舉例:在mysql中當(dāng)我們向表中插入數(shù)據(jù)的時(shí)候,如果不指定主鍵(id),那么mysql會(huì)自動(dòng)生成id,但是在一些業(yè)務(wù)中我們后續(xù)會(huì)需要這個(gè)id,此時(shí)我們就要想辦法去獲取這個(gè)id,尤其是這種自動(dòng)生成的自增id。 要想要清楚的了解,就需要先看看jdbc是如何實(shí)現(xiàn)的 方式1:jdbc內(nèi)置的方式用法獲取主鍵的需求,jdbc的開發(fā)人員就已經(jīng)想到了,并且也開發(fā)了相應(yīng)的api來(lái)幫助我們編程,具體看 java.sql.Statement類中的getGeneratedKeys方法 從這個(gè)方法中我們得知這個(gè)方法會(huì)返回一個(gè)結(jié)果集,從這個(gè)結(jié)果集中可以獲取自增主鍵的值。但是在使用這個(gè)方法有個(gè)前提,那就是執(zhí)行sql的時(shí)候需要做一個(gè)設(shè)置。 如果是通過(guò)java.sql.Statement執(zhí)行sql,需要調(diào)用下面這個(gè)方法:
注意上面這個(gè)方法的第二個(gè)參數(shù)需要設(shè)置為java.sql.Statement.RETURN_GENERATED_KEYS,表示需要返回自增列的值。 不過(guò)多數(shù)情況下,我們會(huì)使用java.sql.PreparedStatement對(duì)象來(lái)執(zhí)行sql,如果想獲取自增值,創(chuàng)建這個(gè)對(duì)象需要設(shè)置第2個(gè)參數(shù)的值,如下:
然后我們就可以通過(guò)getGeneratedKeys返回的ResultSet對(duì)象獲取自動(dòng)增長(zhǎng)的值了,如下:
方式2:插入之后查詢獲取用法當(dāng)然除了jdbc想到了我們這個(gè)需求,mysql數(shù)據(jù)庫(kù)也想到了這個(gè)需求也有對(duì)應(yīng)的語(yǔ)句來(lái)幫助我們?cè)诓迦霐?shù)據(jù)后獲取最新插入記錄的id值,如下所示
所以我們可以在插入之后,立即使用當(dāng)前連接發(fā)送上面這條sql去獲取自增列的值就可以。這種方法相對(duì)來(lái)說(shuō)十分的簡(jiǎn)單和方便,但是也存在著一些問(wèn)題,就是在高并發(fā)多線程的情況 ,可能會(huì)出現(xiàn)嚴(yán)重的問(wèn)題,所以一般來(lái)說(shuō)不建議使用。 方式3:插入之前獲取最后一種方法就是在插入之前獲取。 oracle不知道大家有沒有玩過(guò),oracle中沒有mysql中自動(dòng)增長(zhǎng)列,但是oracle有個(gè)功能可以實(shí)現(xiàn)自動(dòng)增長(zhǎng),這個(gè)功能就是序列,序列就相當(dāng)于一個(gè)自增器一樣,有個(gè)初始值,每次遞增的步長(zhǎng),當(dāng)然這個(gè)序列提供了一些功能給我們使用,可以獲取序列的當(dāng)前值、下一個(gè)值,使用方式如下:
mybatis獲取主鍵的3種方式既然jdbc有三種方法,那么mybatis也有相應(yīng)的幾種方法。 方式1:內(nèi)部使用jdbc內(nèi)置的方式用法mybatis這個(gè)方式內(nèi)部采用的是上面說(shuō)的jdbc內(nèi)置的方式。 我們需要在Mapper xml中進(jìn)行配置,如:
有2個(gè)關(guān)鍵參數(shù)必須要設(shè)置:
方式2:插入后查詢獲取主鍵用法這個(gè)方式和上面介紹的jdbc的第二種方式一樣,插入之后通過(guò)查詢獲取主鍵的值然后填充給指定的屬性,mapper xml配置如下:
關(guān)鍵代碼是selectKey元素包含的部分,這個(gè)元素內(nèi)部可以包含一個(gè)sql,這個(gè)sql可以在插入之前或者插入之后運(yùn)行(之前還是之后通過(guò)order屬性配置),然后會(huì)將sql運(yùn)行的結(jié)果設(shè)置給keyProperty指定的屬性,selectKey元素有3個(gè)屬性需要指定:
方式3:插入前查詢獲取主鍵用法這個(gè)方式和上面介紹的jdbc的第3種方式一樣,會(huì)在插入之前先通過(guò)一個(gè)查詢獲取主鍵的值然后填充給指定的屬性,然后在執(zhí)行插入,mapper xml配置如下:
關(guān)鍵代碼是selectKey元素包含的部分,這個(gè)元素內(nèi)部可以包含一個(gè)sql,這個(gè)sql可以在插入之前或者插入之后運(yùn)行(之前還是之后通過(guò)order屬性配置),然后會(huì)將sql運(yùn)行的結(jié)果設(shè)置給keyProperty指定的屬性,selectKey元素有3個(gè)屬性需要指定:
總結(jié)本篇文章著重介紹了mybatis中一些增刪改查的高級(jí)使用方法,尤其是獲取主鍵的方法,在此進(jìn)行了jdbc和mybatis對(duì)比介紹了三種方法。 最后
——我是冢狐,和你一樣熱愛編程。
|
|