在 MyBatis 中,<selectKey> 標簽的 order 屬性用于指定生成主鍵值的 SQL 語句執行時機。
除了 AFTER,MyBatis 還支持另一種模式:BEFORE,
它們有明確的使用場景和區別:
?order="AFTER"
適用數據庫:如 MySQL、SQL Server(使用自增主鍵)
含義:先執行 INSERT 插入語句,然后通過 SELECT @@IDENTITY 或 LAST_INSERT_ID() 等方式獲取剛剛插入記錄的主鍵。
典型用法:
<selectKey resultType="Long" keyProperty="id" order="AFTER">SELECT @@IDENTITY</selectKey>
特點:
插入后才能知道主鍵值。
主鍵通常由數據庫自動生成(如自增)。
常用于 MySQL。
order="BEFORE"
適用數據庫:如 Oracle、PostgreSQL(使用序列生成主鍵)
含義:在執行 INSERT 插入語句之前,先執行 <selectKey> 獲取主鍵值。
典型用法:
<selectKey resultType="Long" keyProperty="id" order="BEFORE">SELECT SEQ_ORG_PS_HP_REL.NEXTVAL FROM DUAL</selectKey>
?
特點:
插入前就知道主鍵值。
主鍵由應用程序提供(通常通過序列或 UUID)。
常用于 Oracle 數據庫。
?
屬性值 | 執行順序 | 數據庫類型 | 是否需要提前知道主鍵 | 是否需要提前知道主鍵 |
AFTER | 插入之后 ? | MySQL, SQL Server | ? 不需要 | SELECT @@IDENTITY |
BEFORE ? | 插入之前 | Oracle, PostgreSQL | ? 需要 | SELECT SEQ.NEXTVAL |
?