mysql insert注解返回对象_MyBatis 返回insert操作主键

应用场景 在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键。但是,在默认情况下,insert操作返回的是一个int值,它并非表示主键id,而是表示当前SQL语句影响的行数。

接下来,我们依次从options注解和SQL两个方面,了解MyBatis如何在使用MySQL和Oracle做insert插入操作时将返回的id绑定到对象中。

Mybatis的@Options注解

mybatis的@Options注解能够拿到对象自增的id的值,能够设置缓存时间,首先,创建一张用于测试的表instance。

48304ba5e6f9fe08f3fa1abda7d326ab.png

CREATE TABLEinstance (

instance_idBIGINT NOT NULL AUTO_INCREMENT COMMENT '主键id',

infosVARCHAR(2048) NOT NULL DEFAULT '' COMMENT '消息',

create_timedatetime COMMENT '创建时间',

update_timeTIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY(instance_id)

)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '实例表';

48304ba5e6f9fe08f3fa1abda7d326ab.png

其中的instance_id是自增的主键。我希望通过dao层的接口插入的数据能够返回主键的id。接口代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

@Insert("insert into instance (infos)"

+ " ("

+ " @{infos},"

+ " NOW()"

+ ")")

@Options(useGeneratedKeys= true, keyProperty = "instanceId", keyColumn = "instance_id")int addInstance(Instance instanceDto);

48304ba5e6f9fe08f3fa1abda7d326ab.png

@Options注解中默认设置的主键对应的字段名为id,而在instance表中,主键为instance_id,因此需要将keyProperty和keyColumn设置成我们想要的字段。这个示例的意思就是,从instance_id这个字段把数据放到传入对象instanceDto的instanceId成员变量里面。

在调用了插入方法之后,@Options注解会自动为表的主键字段设置自增的值,并把它赋值给作为入参的DTO,进而可以直接从这个对象中获取新生成记录的主键。接下来看下@Option注解的源码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD})public @interfaceOptions {boolean useCache() default true;boolean flushCache() default false;

ResultSetType resultSetType()defaultResultSetType.FORWARD_ONLY;

StatementType statementType()defaultStatementType.PREPARED;int fetchSize() default -1;int timeout() default -1;boolean useGeneratedKeys() default false;

String keyProperty()default "id";

String keyColumn()default "";

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

注解中的useCache还可以设置缓存相关的选项,useCache = true表示本次查询结果被缓存以提高下次查询速度,flushCache = false表示下次查询时不刷新缓存,timeout = 10000表示查询结果缓存10000秒。

在文献[2]中,Java API àMapper Annotations中可以找到英文原版介绍。

从执行insert SQL时返回主键ID

MySQL用法:

上面配置中,“keyProperty”表示返回的instance_id要保存到对象的那个属性中,“useGeneratedKeys”表示主键为自增长模式。

MySQL中做以上配置就OK了,较为简单,不再赘述。下面分享Oracle中的用法。

48304ba5e6f9fe08f3fa1abda7d326ab.png

SELECT SEQ_USER.NEXTVAL as instanceId fromDUAL

insert intoinstance (instance_id, infos, create_time)values(#{instanceId}, #{infos}, now())

48304ba5e6f9fe08f3fa1abda7d326ab.png

Oracle用法中,需要注意的是:由于Oracle没有自增长一说法,只有序列这种模仿自增的形式,所以不能再使用“useGeneratedKeys”属性,而是使用将ID获取并赋值到对象的属性中,insert插入操作时正常插入id。

参考文献

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值