在 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 |