在 MyBatis 中,获取自增 ID 主要有两个方法:
- 在 SQL 中增加两个属性,useGeneratedKeys 和 keyProperty
- 增加 selectKey 语句块,执行自定义 SQL 获取自增 ID
针对这几种方法,有几个小问题需要注意:
- useGeneratedKeys 是基于 JDBC 的 Prepared Statement 实现的,具体做法是调用 JDBC 的 getGeneratedKeys 方法,在 Prepared Statement 对象中取相应的值。当 DB 为 MySQL 的时候,会在响应时返回相应的自增字段值。但是,在某些实现 DB 分库分表的 Proxy 中,由于涉及 SQL 转换、重写的问题,可能对 Prepared Statement 的支持并不完整,导致 useGeneratedKeys 选项无法正常返回对应的自增 ID
- selectKey 方式是 MyBatis 自动的在执行完 Insert 语句之前/后自动执行对应的语句块,去生成/获取对于的 ID,并填充进相关的字段。在这里要注意,在某些 Prepared Statement 支持不完整的 Proxy 中,需要增加 statementType=”STATEMENT” 来强制指定不使用 Prepared Statement 来获取 ID
- keyProperty 这个参数也有一点需要注意。如果在 Mapper.java 中使用了 @Param 来对传入的参数进行了命名的话,这里接收自增值的属性需要用 paramName.fieldName 这种方式来写。如果只写 fieldName 则无法成功回传。最好的方式是不要用 @Param 来传参,而是全部封装成 bean 来进行传递