1 注解的基本知识
以下注解知识的讲解,均使用@Override、@Deprecated(过时)、@SuppressWarnings举例。1.1 注解的基本语法
注解后是没有分号的;注解首字母是大写的,因为注解与类、接口是同一级别的。一个注解,后台对应着一个@interface类;在同一语法单元上,同一注解只能够使用一次;在注解与语法单元之间可以隔若干空行、注释等非代码内容。1.2 注解的注解
打开@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的值。对于注解的属性,需要注意以下几个问题:
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中的<selectKey/>标签,用于返回新插入数据的id值。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<Student> 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<Student> selectStudentsByName(String name);}
3.2 删除映射文件
由于MyBatis注解替换的是映射文件,所以这里就不需要映射文件了,将其直接删除。3.3 修改主配置文件
由于没有映射文件,所以主配置文件中不能够使用<mapper/>注册mapper的位置,需要使用<package/>标签。<!-- 注册映射文件 --><mappers><package name="com.eason.mybatis.dao"/></mappers>
如果觉得《SSM框架之MyBatis3专题5:MyBatis注解式开发》对你有帮助,请点赞、收藏,并留下你的观点哦!