mybatis的@Options注解能够设置缓存时间,能够为对象生成自增的key
源代码如下:
@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 "";}
第一个使用场景:
有一个表
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成员变量里面。
useGenerateKey=true : 设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中
具体单测示例如下:
@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,主键会自动返回到实例对象中 }
二 注解中的useCache还可以设置缓存相关的选项:
useCache = true表示本次查询结果被缓存以提高下次查询速度,
flushCache = false表示下次查询时不刷新缓存,
timeout = 10000表示查询结果缓存10000秒。