mybatis-KeyGenerator
作者:互联网
1. 概述
本文,我们来分享 SQL 执行的第三部分,keygen
包。整体类图如下:
- 我们可以看到,整体是以 KeyGenerator 为核心。所以,本文主要会看到的就是 KeyGenerator 对自增主键的获取。
2. KeyGenerator
org.apache.ibatis.executor.keygen.KeyGenerator
,主键生成器接口。代码如下:
// KeyGenerator.java |
- 可在 SQL 执行之前或之后,进行处理主键的生成。
- 实际上,KeyGenerator 类的命名虽然包含 Generator ,但是目前 MyBatis 默认的 KeyGenerator 实现类,都是基于数据库来实现主键自增的功能。
-
parameter
参数,指的是什么呢?以下面的方法为示例:@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert({"insert into country (countryname,countrycode) values (#{countryname},#{countrycode})"})
int insertBean(Country country);- 上面的,
country
方法参数,就是一个parameter
参数。 - KeyGenerator 在获取到主键后,会设置回
parameter
参数的对应属性。
- 上面的,
KeyGenerator 有三个子类,如下图所示:
- 具体的,我们下面逐小节来分享。
3. Jdbc3KeyGenerator
org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator
,实现 KeyGenerator 接口,基于 Statement#getGeneratedKeys()
方法的 KeyGenerator 实现类,适用于 MySQL、H2 主键生成。
3.1 构造方法
// Jdbc3KeyGenerator.java |
- 单例。
3.2 processBefore
@Override |
- 空实现。因为对于 Jdbc3KeyGenerator 类的主键,是在 SQL 执行后,才生成。
3.3 processAfter
// Jdbc3KeyGenerator.java |
- 调用
#processBatch(Executor executor, MappedStatement ms, Statement stmt, Object parameter)
方法,处理返回的自增主键。单个parameter
参数,可以认为是批量的一个特例。
3.4 processBatch
// Jdbc3KeyGenerator.java |
<1>
处,获得主键属性的配置。如果为空,则直接返回,说明不需要主键。- 【重要】
<2>
处,调用Statement#getGeneratedKeys()
方法,获得返回的自增主键。 <3>
处,调用#getSoleParameter(Object parameter)
方法,获得唯一的参数对象。详细解析,先跳到 「3.4.1 getSoleParameter」 。<3.1>
处,调用#assignKeysToParam(...)
方法,设置主键们,到参数soleParam
中。详细解析,见 「3.4.2 assignKeysToParam」 。<3.2>
处,调用#assignKeysToOneOfParams(...)
方法,设置主键们,到参数parameter
中。详细解析,见 「3.4.3 assignKeysToOneOfParams」 。
<4>
处,关闭 ResultSet 对象。
3.4.1 getSoleParameter
// Jdbc3KeyGenerator.java |
-
<1>
处,如下可以符合这个条件。代码如下:@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert({"insert into country (countryname,countrycode) values (#{country.countryname},#{country.countrycode})"})
int insertNamedBean(@Param("country") Country country); -
<2>
处,如下可以符合这个条件。代码如下:@Options(useGeneratedKeys = true, keyProperty = "country.id")
@Insert({"insert into country (countryname, countrycode) values (#{country.countryname}, #{country.countrycode})"})
int insertMultiParams_keyPropertyWithWrongParamName2(@Param("country") Country country,
@Param("someId") Integer someId);- 虽然有
country
和someId
参数,但是最终会被封装成一个parameter
参数,类型为 ParamMap 类型。为什么呢?答案在ParamNameResolver#getNamedParams(Object[] args)
方法中。 - 如果是这个情况,获得的主键,会设置回
country
的id
属性,因为注解上的keyProperty = "country.id"
配置。 标签:KeyGenerator,country,Object,metaParam,mybatis,parameter,主键,keyProperties 来源: https://www.cnblogs.com/siye1989/p/11624144.html
- 虽然有