MyBatis 新增記錄并返回記錄主鍵
應(yīng)用場(chǎng)景 在向數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí),需要保留插入數(shù)據(jù)的id,以便進(jìn)行后續(xù)的update操作或者將id存入其他表作為外鍵。但是,在默認(rèn)情況下,insert操作返回的是一個(gè)int值,它并非表示主鍵id,而是表示當(dāng)前SQL語句影響的行數(shù)。
接下來,我們依次從options注解和SQL兩個(gè)方面,了解MyBatis如何在使用MySQL和Oracle做insert插入操作時(shí)將返回的id綁定到對(duì)象中。
Mybatis的@Options注解
mybatis的@Options注解能夠拿到對(duì)象自增的id的值,能夠設(shè)置緩存時(shí)間,首先,創(chuàng)建一張用于測(cè)試的表instance。
CREATE TABLE instance ( instance_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主鍵id', infos VARCHAR(2048) NOT NULL DEFAULT '' COMMENT '消息', create_time datetime COMMENT '創(chuàng)建時(shí)間', update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間', PRIMARY KEY (instance_id) )ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '實(shí)例表';
其中的instance_id是自增的主鍵。我希望通過dao層的接口插入的數(shù)據(jù)能夠返回主鍵的id。接口代碼如下:
@Insert("insert into instance (infos)"
+ " ("
+ " @{infos},"
+ " NOW()"
+ ")")
@Options(useGeneratedKeys = true, keyProperty = "instanceId", keyColumn = "instance_id")
int addInstance(Instance instanceDto);
@Options注解中默認(rèn)設(shè)置的主鍵對(duì)應(yīng)的字段名為id,而在instance表中,主鍵為instance_id,因此需要將keyProperty和keyColumn設(shè)置成我們想要的字段。這個(gè)示例的意思就是,從instance_id這個(gè)字段把數(shù)據(jù)放到傳入對(duì)象instanceDto的instanceId成員變量里面。
在調(diào)用了插入方法之后,@Options注解會(huì)自動(dòng)為表的主鍵字段設(shè)置自增的值,并把它賦值給作為入?yún)⒌腄TO,進(jìn)而可以直接從這個(gè)對(duì)象中獲取新生成記錄的主鍵。接下來看下@Option注解的源碼:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface Options { boolean useCache() default true; boolean flushCache() default false; ResultSetType resultSetType() default ResultSetType.FORWARD_ONLY; StatementType statementType() default StatementType.PREPARED; int fetchSize() default -1; int timeout() default -1; boolean useGeneratedKeys() default false; String keyProperty() default "id"; String keyColumn() default ""; }
注解中的useCache還可以設(shè)置緩存相關(guān)的選項(xiàng),useCache = true表示本次查詢結(jié)果被緩存以提高下次查詢速度,flushCache = false表示下次查詢時(shí)不刷新緩存,timeout = 10000表示查詢結(jié)果緩存10000秒。
在文獻(xiàn)[2]中,Java API àMapper Annotations中可以找到英文原版介紹。
從執(zhí)行insert SQL時(shí)返回主鍵ID
MySQL用法:
<insert id="insert" parameterType="com.test.Instance" keyProperty=" instanceId" useGeneratedKeys="true" >
上面配置中,“keyProperty”表示返回的instance_id要保存到對(duì)象的那個(gè)屬性中,“useGeneratedKeys”表示主鍵為自增長(zhǎng)模式。
MySQL中做以上配置就OK了,較為簡(jiǎn)單,不再贅述。下面分享Oracle中的用法。
<insert id="insert" parameterType="com.test.Instance "> <selectKey resultType="Long" order="BEFORE" keyProperty="instanceId"> SELECT SEQ_USER.NEXTVAL as instanceId from DUAL </selectKey> insert into instance (instance_id, infos, create_time) values (#{instanceId}, #{infos}, now()) </insert>
Oracle用法中,需要注意的是:由于Oracle沒有自增長(zhǎng)一說法,只有序列這種模仿自增的形式,所以不能再使用“useGeneratedKeys”屬性,而是使用<selectKey>將ID獲取并賦值到對(duì)象的屬性中,insert插入操作時(shí)正常插入id。
參考文獻(xiàn)
[1] http://www.rzrgm.cn/sonofelice/p/6250203.html.
[2] http://www.mybatis.org/mybatis-3/index.html.
Buy me a coffee. ?Get red packets.
浙公網(wǎng)安備 33010602011771號(hào)