Mybatis常用注解介绍

annotations包内存放着mybatis相关注解,下面列举下常用注解的用处

1. @ConstructorArgs + @Arg

作用:根据实体类的构造方法参数构造对象,具体使用方法可学习该篇博客。
https://blog.csdn.net/weixin_43866295/article/details/86594161

2. @AutomapConstructor

作用:为框架指定实体类的默认构造方法

 public class AnnotatedSubject {
   private final int id;
   private final String name;
   private final int age;
   private final int height;
   private final int weight;

   public AnnotatedSubject(final int id, final String name, final int age, final   int height, final int weight) {
     this.id = id;
     this.name = name;
     this.age = age;
     this.height = height;
     this.weight = weight;
 }
    @AutomapConstructor
   public AnnotatedSubject(final int id, final String name, final int age, final
 Integer height, final Integer weight) {          
     this.id = id;
     this.name = name;
     this.age = age;
 this.height = height == null ? 0 : height;
     this.weight = weight == null ? 0 : weight;
   }
   }

3. @CacheNamespace+@Property

作用:配置一个缓存空间
对应xml配置为<cache />
Property属性用以给缓存中添加固定的数据

@CacheNamespace
public interface PersonMapper {
}

4.@CacheNamespaceRef

作用:使用一个现有的缓存空间
对应的xml配置为<cache-ref />

 @CacheNamespaceRef(value = PersonMapper.class, name = "org.apache.ibatis.submitted.cache.PersonMapper")
  private interface InvalidCacheNamespaceRefBothMapper {
  }

5. @TypeDiscriminator + @Case

TypeDiscriminator 鉴别器
Case 鉴别条件
作用:根据case的鉴别条件返回指定的结果集映射

    @TypeDiscriminator(
            // target for test (ordinal number -> Enum constant)
            column = "personType", javaType = PersonType.class, typeHandler = EnumOrdinalTypeHandler.class,
            // Switch using enum constant name(PERSON or EMPLOYEE) at cases attribute
            cases = {
                    @Case(value = "PERSON", type = Person.class, results = {@Result(property = "personType", column = "personType", typeHandler = EnumOrdinalTypeHandler.class)})
                    , @Case(value = "EMPLOYEE", type = Employee.class, results = {@Result(property = "personType", column = "personType", typeHandler = EnumOrdinalTypeHandler.class)})
            })
    @Select("SELECT id, firstName, lastName, personType FROM person WHERE id = #{id}")
    Person findOneUsingTypeDiscriminator(int id);

6. @Delete+@Insert+@Update+@Select

作用: 注解模式的增删改查注解组
没什么好讲的

7.@DeleteProvider /@InsertProvider/@SelectProvider/@UpdateProvider

增删改查处理器
作用:提供增删改查的代码实现
参考类: SQLTest

  @SelectProvider(type = BlogSqlProvider.class, method = "getSqlByTitle") 
    @ResultMap(value = "sqlBlogsMap") 
    // 这里调用resultMap,这个是SQL配置文件中的,必须该SQL配置文件与本接口有相同的全限定名
    // 注意文件中的namespace路径必须是使用@resultMap的类路径
    public List<Blog> getBlogByTitle(@Param("title")String title);
                                                                                                                                                                                      
    @InsertProvider(type = BlogSqlProvider.class, method = "insertSql") 
    public void insertBlog(Blog blog);
                                                                                                                                                                                      
    @UpdateProvider(type = BlogSqlProvider.class, method = "updateSql")
    public void updateBlog(Blog blog);
                                                                                                                                                                                      
    @DeleteProvider(type = BlogSqlProvider.class, method = "deleteSql")
    @Options(useCache = true, flushCache = false, timeout = 10000) 
    public void deleteBlog(int ids);

7. @flush

作用:定义在 Mapper 接口中的方法能够调用SqlSession#flushStatements() 方法。

8. @lang

语言驱动的注解
使用方式参照引用文章
https://www.jianshu.com/p/03642b807688

9. @Results+@Result+@Many+@One

返回结果集处理注解组
@Results:统一结果处理返回
@Result: 字段映射
@Many: 字段为一对多映射
@One:字段为一对一映射

  @Results({
    @Result(id = true, column = "id", property = "id"),
    @Result(column = "username", property = "username"),
    @Result(property = "role", one = @One(resultMap = "org.apache.ibatis.submitted.annotion_many_one_add_resultmapid.RoleDao.roleMap2"))
  })
  public List<User> findAll();

10.@Mapper

标记这是个 Mapper 的注解,
在mybatis源码中并未进行使用,估计为配合mybatis-spring的mapperscan生成bean而存在【待验证】。

11. @Option

操作可选项

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
// 多Option注解配置
@Repeatable(Options.List.class)
public @interface Options {
  /**
   * The options for the {@link Options#flushCache()}.
   * The default is {@link FlushCachePolicy#DEFAULT}
   */
  enum FlushCachePolicy {
    /** <code>false</code> for select statement; <code>true</code> for insert/update/delete statement. */
    DEFAULT,
    /** Flushes cache regardless of the statement type. */
    TRUE,
    /** Does not flush cache regardless of the statement type. */
    FALSE
  }

  /**
   * 是否使用二级缓存
   */
  boolean useCache() default true;

  /**
   *  刷新缓存的策略
   */
  FlushCachePolicy flushCache() default FlushCachePolicy.DEFAULT;

  /**
   * 返回类型
   */
  ResultSetType resultSetType() default ResultSetType.DEFAULT;

  /**
   * 申明器类别
   * STATEMENT:普通
   * PREPARED:预编译
   * CALLABLE:存储过程申明器
   */
  StatementType statementType() default StatementType.PREPARED;

  /**
   * 加载数量
   */
  int fetchSize() default -1;

  /**
   * 超时时间
   */
  int timeout() default -1;

  /**
   * 设置主键自动生成
   */
  boolean useGeneratedKeys() default false;

  /**
   * @return 主键在 Java 类中的属性
   */
  String keyProperty() default "";

  /**
   * @return 主键在数据库中的字段
   */
  String keyColumn() default "";

  /**
   * 设置返回结果集,参数名为结果集名称,多个结果集名称用“,”
隔开
   */
  String resultSets() default "";

  /**
   * 配置对应的数据库id
   */
  String databaseId() default "";

  @Documented
  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.METHOD)
  @interface List {
    Options[] value();
  }
}

12. @Param

给参数定义名称

13. @SelectKey

返回非自增主键
如果我们数据库中的主键不是自增方式产生的,但是当我们插入新数据后,需要返回该条数据的主键,那么我们可以使用如下方法:

    /**
     * 保存新用户信息,并返回主键
     * 
     * @param sysUser
     * @return
     */
    @Insert({"INSERT INTO sys_user (id,user_name, user_password,user_email,user_info, head_img, create_time)VALUES(#{id},#{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg, jdbcType=BLOB},#{createTime,jdbcType=TIMESTAMP})"})
    @SelectKey(statement="SELECT LAST_INSERT_ID()",
                keyProperty="id",
                resultType=Long.class,
                before=false)
    public int insert3(SysUser sysUser);

order属性的设置和使用的数据库有关。在MySQL数据库中,order属性设置的值是AFTER,因为当前记录的主键是在insert语句执行成功后才获取到的。而在Oracel数据库中,order属性的值要设置为BEFORE,这是因为Oracle数据库中需要先从序列获取值,然后将值作为主键插入到数据库中。

作者:开心跳蚤
链接:https://www.jianshu.com/p/b5f823ac5355

14. @MapKey

作用:该注解用于返回Map格式的数据集合
使用说明:当我们试图使用Map来获取一个数据集合时,往往一个Map<String,Object>无法实现我们的需求,因为mybatis在解析返回值时,会把Map的Key值作为字段名,value作为字段值来返回,解决这个问题的方法就是在对应的方法上使用该标签,并再包裹一层Map,将指定的id字段作为key。

@MapKey("id")
public Map<Integer,Map<String,Object>> getNamesByIds(List<Map<String, Object>> list);
    <select id="getNamesByIds" resultType="java.util.Map">
        SELECT id, name FROM tb_abc WHERE id IN
        <foreach item="item" collection="list" open="(" separator="," close=")">
                #{item.id}
        </foreach>
    </select>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355