mybatis的@Options注解能夠設置緩存時間,能夠為對象生成自增的key
第一個使用場景:
有一個表
CREATE TABLE instance (
instance_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
infos VARCHAR(2048) NOT NULL DEFAULT '' COMMENT '',
create_time TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '創建時間',
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (instance_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '實例表';
其中的instance_id是自增的主鍵。我希望通過dao層的接口插入的數據能夠返回主鍵的id:
接口代碼如下:
@Insert("insert into instance (infos)" + " (" + " @{infos}," + " NOW()" + ")") @Options(useGeneratedKeys = true, keyProperty = "instanceId", keyColumn = "instance_id") int addInstance(Instance instance);
@Options注解中默認設置的主鍵對應的字段名為id、在我們的表中,主鍵名為instance_id,因此需要將keyProperty和keyColumn設置成我們想要的字段:
這個注解的意思就是,從instance_id這個字段里面把數據放到傳入對象的instanceId成員變量里面。
具體單測示例如下:
@Test public void addInstanceTest() { Instance instance = new Instance(); instance.setInfos("infos");int res = instanceMapper.addInstance(instance); instance.setInfos("infos2"); int res2 = instanceMapper.addInstance(instance); Instance ins = instanceMapper.getInstanceById(instance.getInstanceId()); log.info("{}", ins.getInstanceId()); // 此處打印的日志信息就是2,即第二條記錄的主鍵id }
從上面的示例中我們可以看出,在調用了插入方法之后,@Options注解會自動為表對應的對象的主鍵字段設置上自增的值,直接從這個對象中獲取即可。
我們來看下@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還可以設置緩存相關的選項:
useCache = true表示本次查詢結果被緩存以提高下次查詢速度,flushCache = false表示下次查詢時不刷新緩存,timeout = 10000表示查詢結果緩存10000秒。