#通用 mapper uuid 簡單示例
##不可回寫的 uuid
通用 mapper 中對 uuid 的用法主要提到了一種專有的寫法,如下寫法:
1
|
@generatedvalue (generator = "uuid" ) |
這種方式實現很容易理解,就是在你 insert 之前,調用 uuid 的公共方法在<bind>
標簽中生成了一個值,插入到了數據庫,由于這個值是臨時的,并沒有set
到對象,因此這種方式是不支持回寫的。
由于回寫方式很常見,因此用這種方式很難滿足要求。
而且在文檔中也提到了一種可以回寫的方式,由于沒有提供例子,導致很多人不理解或者嘗試失敗,因此很早就有必要寫一篇如何使用可回寫 uuid 的方式(我曾經遠程協助一個朋友解決過這個問題,這個朋友答應我把自己的用法寫下來分享給大家,可惜食言了)。
##可回寫的 uuid
最簡單的可回寫 uuid 方式就是像 oracle 序列那樣直接寫一個返回 uuid 的 sql 就能實現,這是第一種寫法:
1
2
3
|
@id @generatedvalue (strategy = generationtype.identity,generator = "select uuid()" ) private string id; |
使用這種方式的時候必須注意,由于是執行 sql,所以底層是使用<selectkey>
實現的,并且因為需要先得到 uuid 的值才能插入數據庫,因此還需要配置order
屬性,使用 java 方式配置時,用下面的方式進行配置:
1
2
3
4
5
|
config config = new config(); // 其他配置 // 主鍵自增回寫方法執行順序,默認after,可選值為(before|after) config.setorder( "before" ); mapperhelper.setconfig(config); |
使用 spring 方式進行配置時如下:
1
2
3
4
5
6
7
8
9
|
<bean class = "tk.mybatis.spring.mapper.mapperscannerconfigurer" > <property name= "basepackage" value= "com.isea533.mybatis.mapper" /> <property name= "properties" > <value> mappers=tk.mybatis.mapper.common.mapper order=before </value> </property> </bean> |
注意是增加order=before
這一行,如果你還有其他配置,都可以按這種方式一行一個key=value
。
這么配置以后就可以正確的獲取 uuid 的值了。
##任意類型的主鍵回寫值
你可能沒注意到上面 uuid 類型的主鍵中,id
屬性的類型是string
,因為select uuid()
返回的字符串,所以 java 中的類型要和數據庫類型匹配。
因此,如果你使用一個select myid()
函數返回一個自定義類型的主鍵值,你需要讓 java 中的類型和這個匹配。
##通用主鍵 sql 配置
如果你每一個實體類中都有一個id
屬性,并且配置的注解都一樣,都執行同樣的 sql 去返回值。如果都去配置這個注解會很麻煩。想要解決這種重復性配置,最簡單的方式就是提取基類,讓使用相同方式主鍵策略的實體類繼承同一個基類就能解決。
解決方案看這里: https://github.com/guozilantk/base/tree/master/base-id
但是如果你需要適用不同的數據庫,這種方式麻煩點的解決辦法就是針對不同的數據庫創建不同的基類,放在不同的項目中,但是使用相同的包名,具體應用到生產環境時使用對應數據庫的基類 jar 包就可以。除此之外還有一種方式,這種方式就是使用 identity,這個參數用于配置取回主鍵的方式。
默認提供的identity
可選值參考文檔 generationtype.identity 。
這個參數除了這些可選值外,還可以是可以執行的 sql,也就是說最前面的配置方式可以改為:
1
2
3
|
@id @generatedvalue (strategy = generationtype.identity) private string id; |
在 java 方式中用下面的方式進行配置:
1
2
3
4
5
6
|
config config = new config(); // 其他配置 config.setidentity( "select uuid()" ); // 主鍵自增回寫方法執行順序,默認after,可選值為(before|after) config.setorder( "before" ); mapperhelper.setconfig(config); |
使用 spring 方式進行配置時如下:
1
2
3
4
5
6
7
8
9
10
|
<bean class = "tk.mybatis.spring.mapper.mapperscannerconfigurer" > <property name= "basepackage" value= "com.isea533.mybatis.mapper" /> <property name= "properties" > <value> mappers=tk.mybatis.mapper.common.mapper identity=select uuid() order=before </value> </property> </bean> |
這里仍然要注意設置order=before
,如果你用identity
提供的那些可選參數,就不要設置(默認為after
),可選參數中仍然是針對的數據庫支持自增的情況,那些情況仍然是插入數據庫后才會有主鍵值,這點一定要明白!
在這種情況下,如果換了數據庫,只需要修改一下配置就能解決,例如 sql server 的:
1
|
identity=select replace(newid(), '-' , '' ) |
##小結
關于 uuid 的內容就上面這些,還需要提醒一點的就是由于order
是一個全局的配置,所以使用時要注意保證所有主鍵方式都是一致的order
方式,主鍵自增的時候使用@generatedvalue(generator = "jdbc")
這種方式通過 jdbc 接口去獲取返回值更好。當然使用批量插入時,mysql 支持多主鍵回寫,但是 sqlserver 僅能返回最后一個插入的主鍵,所以選擇使用某種方式時,一定要有所了解,做好測試,避免數據庫差異帶來的問題。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/isea533/article/details/53011890