1 注解的基本知识

  • 以下注解知识的讲解,均使用@Override、@Deprecated(过时)、@SuppressWarnings举例。

    1.1 注解的基本语法

  • 注解后是没有分号的;
  • 注解首字母是大写的,因为注解与类、接口是同一级别的。一个注解,后台对应着一个@interface类;
  • 在同一语法单元上,同一注解只能够使用一次;
  • 在注解与语法单元之间可以隔若干空行、注释等非代码内容。

    1.2 注解的注解

    SSM框架之MyBatis3专题5:MyBatis注解式开发
    SSM框架之MyBatis3专题5:MyBatis注解式开发

  • 打开@Deprecated源码,看到其定义上还有三个注解:@Documented、@Retention、@Target。这三个注解的意义是:

1、@Target:用于指定该注解可以标注的语法类型。CONSTRUCTOR(构造器)、LOCAL_VARIABLE(局部变量)、METHOD(方法)、FIELD(属性)、PACKAGE(包)、PARAMETER(参数)、TYPE(类型)。

  • 注意,对于TYPE常量,其意义有两个:一是指该注解可以用在类、接口、枚举等类上;二是指该注解可以作为其他注解的属性值。例如,后面要学到的@Result、@InterceptorRef就是属性的第二个用意。

2、@Documented:用于指定该注解定义时的注释信息能否显示在javaAPI说明文档中。没有添加的话,使用javaDoc生成API文档时就不会将该注解的信息添加到文档中。


3、@RetentionPolicy:这是一个enum类型,共有三个值:SOURCE,CLASS和RUNTIME。

  • SOURCE:代表这个Annotation类型的信息只会保留在程序源码中,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件中。
  • CLASS:代表这个Annotation类型的信息除了保留在程序源码中,同时也会保留在编译好的.class文件中。但是在执行时,并不会把这一些信息加载到虚拟机(JVM)中去。这是Retention的默认值。
  • RUNTIME:表示在源码、编译好的.class文件中保留信息,同时在执行时还会把这些信息加载到JVM中去。
  • 举例:@Override中的Retention值为SOURCE,编译成功了就不要这一些检查的信息。相反@Deprecated中的Retention的值为RUNTIME,表示除了在编译时会警告我们使用哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被Deprecated。

    1.3 注解的属性

  • 当某个变量被声明了,但是却未被使用;或者某集合在声明或者定义时未加泛型说明等情况发生时,会在代码下给出警告黄线。Ctrl + 1,可在代码上添加一个注解@SuppressWarnings()。并且发现,不同的情况下,其参数是不同的。
  • 打开其源码,看到其定义与@Deprecated是不同的,其接口中声明了一个方法String[] value()。那么该注解在使用时必须包含一个属性value,类型为String[]。且该参数没有默认值,即必须给出value的值。
    SSM框架之MyBatis3专题5:MyBatis注解式开发_第1张图片
  • 对于注解的属性,需要注意以下几个问题:

    1.3.1 数组问题

  • 该属性在源码定义时被声明为数组,但是在具体使用时却只能够赋予一个值,此时无需将该值再定义为一个数组后赋给该属性。直接将该值赋给该属性即可。例如,对于声明为字符串数组String[]的value属性,可以将字符串String直接赋给该value。

    1.3.2 默认值问题

  • 若某属性在注解定义时声明了其默认值,则在注解使用时,可以不为其指定属性值。注解会自动使用其默认值。

    1.3.3 value属性问题

  • 若注解在使用时只需使用其value属性,其他属性要么有默认值,要么该注解只声明了一个value属性,此时,在注解使用时value属性名称可省略,而直接在注解的括号中写出该value属性的值。

    1.3.4 无属性问题

  • 有些注解在定义时,是没有属性的,如@Deprecated、@Override都是没有属性声明的,那么在使用时只需要给出注解名称即可。

    2 MyBatis注解

    2.1 @Insert

  • 其value属性用于指定哟啊执行的insert语句;

    2.2 @SelectKey

  • 用于替换XML中的标签,用于返回新插入数据的id值。
    SSM框架之MyBatis3专题5:MyBatis注解式开发_第2张图片
  • statement:获取新插入记录主键值的SQL语句;
  • keyProperty:获取的该主键值返回后初始化对象的哪个属性;
  • resultType:返回值类型;
  • before:指定主键的生成相对于insert语句的执行先后顺序,该属性不能够省略;

    2.3 @Delete

  • 其value属性用于指定要执行的delete语句。

    2.4 @Update

  • 其value属性用于指定要执行的update语句。

    2.5 @Select

  • 其value属性用于指定要执行的select语句。

    3 程序举例说明

    3.1 修改Dao接口

  • 在Dao接口的每个抽象方法上添加注解。

    public interface IStudentDao {
    @Insert(value={"insert into t_student(name,age,score) values(#{name}, #{age}, #{score})"})
    void insertStudent(Student student);
    
    @Insert("insert into t_student(name,age,score) values(#{name}, #{age}, #{score})")
    @SelectKey(statement="select @@identity", resultType=int.class, keyProperty="id", before=false)
    void insertStudentCacheId(Student student);
    
    @Delete(value="delete from t_student where id=#{xxx}")
    void deleteStudentById(int id);
    
    @Update("update t_student set name=#{name}, age=#{age}, score=#{score} where id=#{id}")
    void updateStudent(Student student);
    
    @Select("select id,name,age,score from t_student")
    List selectAllStudents();
    
    @Select("select id,name,age,score from t_student where id=#{jjj}")
    Student selectStudentById(int id);
    
    @Select("select id,name,age,score from t_student where name like '%' #{xxx} '%'")
    List selectStudentsByName(String name);
    }

    3.2 删除映射文件

  • 由于MyBatis注解替换的是映射文件,所以这里就不需要映射文件了,将其直接删除。

    3.3 修改主配置文件

  • 由于没有映射文件,所以主配置文件中不能够使用注册mapper的位置,需要使用标签。