我們在實際邏輯編寫時,往往會有,想要使用我們剛剛插入數據的自增ID,來做另外一件事情;這時候我們是可以通過查詢剛才插入數據的某個字段作為條件,來查出這條數據的ID,但是總感覺太麻煩效率不高;
當然,我們通過SQL層面也是有類似的辦法; 例如:
SELECT max(mid) FROM table_0001;
select @@IDENTITY
SELECT LAST_INSERT_ID()
如果我們在定義數據庫表的實體類的時候,id字段加上了支持自增長的注解,這個問題就相對簡單咯~,例如:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
... ...
Student student = new Student();
student.setName("張三");
Mapper.insert(student);
//在這里可以直接getId來獲取到我們新添加進去這條數據的自增ID
int selfId = student.getId();
##觀察代碼后台運行日志可以發現其實是jpa自動幫我們運行了SELECT LAST_INSERT_ID()這條SQL語句來獲取的自增ID的值
==> Executing: SELECT LAST_INSERT_ID()
<== Columns: LAST_INSERT_ID()
在JPA中提供了四種用法,分別是:
TABLE:使用一個特定的數據庫表格來保存主鍵。
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。
IDENTITY:主鍵由數據庫自動生成(主要是自動增長型)
AUTO:主鍵由程序控制。
GenerationType.TABLE
使用一個特定的數據庫表格來保存主鍵,持久化引擎通過關系數據庫的一張特定的表格來生成主鍵,這種策略的好處就是不依賴於外部環境和數據庫的具體實現,在不同數據庫間可以很容易的進行移植,但由於其不能充分利用數據庫的特性,所以不會優先使用。該策略一般與另外一個注解一起使用@TableGenerator,@TableGenerator注解指定了生成主鍵的表(可以在實體類上指定也可以在主鍵字段或屬性上指定),然后JPA將會根據注解內容自動生成一張表作為序列表(或使用現有的序列表)。如果不指定序列表,則會生成一張默認的序列表,表中的列名也是自動生成,數據庫上會生成一張名為sequence的表(SEQ_NAME,SEQ_COUNT)。序列表一般只包含兩個字段:第一個字段是該生成策略的名稱,第二個字段是該關系表的最大序號,它會隨着數據的插入逐漸累加。
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.TABLE,generator="table_gen")
@TableGenerator(
name = "table_gen",
table="fendo_generator",
pkColumnName="seq_name", //指定主鍵的名字
pkColumnValue="fendos", //指定下次插入主鍵時使用默認的值
valueColumnName="seq_id", //該主鍵當前所生成的值,它的值將會隨着每次創建累加
initialValue = 1, //初始化值
allocationSize=1 //累加值
)
public Integer getUid() {
return uid;
}
GenerationType.SEQUENCE
在某些數據庫中,不支持主鍵自增長,比如Oracle,其提供了一種叫做"序列(sequence)"的機制生成主鍵。此時,GenerationType.SEQUENCE就可以作為主鍵生成策略。該策略的不足之處正好與TABLE相反,由於只有部分數據庫(Oracle,PostgreSQL,DB2)支持序列對象,MYsql不支持序列,所以該策略一般不應用於其他數據庫。類似的,該策略一般與另外一個注解一起使用@SequenceGenerator,@SequenceGenerator注解指定了生成主鍵的序列.然后JPA會根據注解內容創建一個序列(或使用一個現有的序列)。如果不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="fendo_seq")
@SequenceGenerator(name="fendo_seq", sequenceName="seq_name")
GenerationType.IDENTITY
此種主鍵生成策略就是通常所說的主鍵自增長,數據庫在插入數據時,會自動給主鍵賦值,比如MySQL可以在創建表時聲明"auto_increment" 來指定主鍵自增長。該策略在大部分數據庫中都提供了支持(指定方法或關鍵字可能不同),但還是有少數數據庫不支持,所以可移植性略差。使用自增長主鍵生成策略是只需要聲明strategy = GenerationType.IDENTITY即可。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.AUTO
把主鍵生成策略交給持久化引擎(persistence engine),持久化引擎會根據數據庫在以上三種主鍵生成策略中選擇其中一種。此種主鍵生成策略比較常用,由於JPA默認的生成策略就是GenerationType.AUTO,所以使用此種策略時.可以顯式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)