zoukankan      html  css  js  c++  java
  • 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秒。

    也可参考下面

    MyBatis的@Options注解能够设置缓存时间,能够为对象生成自增的主键值,一般应用于两种场景,今天小博老师就跟大家介绍下@Options注解如何在查询数据和插入数据时使用。

    场景一:首先先学习下在查询数据的情况下的应用场景。



    配合查询语句使用,主要是开关一些查询的选项。比如useCache = true表示将会缓存本次查询结果,以提高下次查询速度;flushCache = Options.FlushCachePolicy.FALSE表示查询时不刷新缓存;timeout = 10000表示查询结果缓存10000秒。

    场景二:再来看一下在插入数据时的应用场景。

    Gendar表有一个gendarId自增长主键,如何在插入数据后自动获取到该主键值呢?可以使用@Options注解:




    设置@Options属性userGeneratedKeys的值为true,并指定实例对象中主键的属性名keyProperty以及在数据库中的字段名keyColumn。这样在gendar插入数据后,gendarId属性会被自动赋值。

    当然flushCache 仍然可以设置,表示插入数据后是否更新缓存,默认是true。

  • 相关阅读:
    http的8种请求方式
    死锁
    进程与线程
    vuex
    路由懒加载
    SPA单页面富应用
    组件中的data为什么必须是函数
    v-for中key的作用
    关于排序的常识总结
    关于树的常见操作-C++面试
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/10956915.html
Copyright © 2011-2022 走看看