Mybatis的@Options注解

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秒。

 

posted @ 2017-01-04 20:56  SonoFelice  阅读(24037)  评论(0编辑  收藏  举报