SSM框架之MyBatis3专题5:MyBatis注解式开发
生活随笔
收集整理的這篇文章主要介紹了
SSM框架之MyBatis3专题5:MyBatis注解式开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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>
轉載于:https://blog.51cto.com/12402717/2095563
總結
以上是生活随笔為你收集整理的SSM框架之MyBatis3专题5:MyBatis注解式开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NOI2014]动物园 【kmp】
- 下一篇: 基于 WebSocket 的 MQTT