SSM框架之MyBatis3专题5:MyBatis注解式开发
生活随笔
收集整理的這篇文章主要介紹了
SSM框架之MyBatis3专题5:MyBatis注解式开发
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 注解的基本知識(shí)
- 以下注解知識(shí)的講解,均使用@Override、@Deprecated(過時(shí))、@SuppressWarnings舉例。
1.1 注解的基本語法
- 注解后是沒有分號(hào)的;
- 注解首字母是大寫的,因?yàn)樽⒔馀c類、接口是同一級(jí)別的。一個(gè)注解,后臺(tái)對(duì)應(yīng)著一個(gè)@interface類;
- 在同一語法單元上,同一注解只能夠使用一次;
- 在注解與語法單元之間可以隔若干空行、注釋等非代碼內(nèi)容。
1.2 注解的注解
- 打開@Deprecated源碼,看到其定義上還有三個(gè)注解:@Documented、@Retention、@Target。這三個(gè)注解的意義是:
1、@Target:用于指定該注解可以標(biāo)注的語法類型。CONSTRUCTOR(構(gòu)造器)、LOCAL_VARIABLE(局部變量)、METHOD(方法)、FIELD(屬性)、PACKAGE(包)、PARAMETER(參數(shù))、TYPE(類型)。
- 注意,對(duì)于TYPE常量,其意義有兩個(gè):一是指該注解可以用在類、接口、枚舉等類上;二是指該注解可以作為其他注解的屬性值。例如,后面要學(xué)到的@Result、@InterceptorRef就是屬性的第二個(gè)用意。
2、@Documented:用于指定該注解定義時(shí)的注釋信息能否顯示在javaAPI說明文檔中。沒有添加的話,使用javaDoc生成API文檔時(shí)就不會(huì)將該注解的信息添加到文檔中。
3、@RetentionPolicy:這是一個(gè)enum類型,共有三個(gè)值:SOURCE,CLASS和RUNTIME。
- SOURCE:代表這個(gè)Annotation類型的信息只會(huì)保留在程序源碼中,源碼如果經(jīng)過了編譯之后,Annotation的數(shù)據(jù)就會(huì)消失,并不會(huì)保留在編譯好的.class文件中。
- CLASS:代表這個(gè)Annotation類型的信息除了保留在程序源碼中,同時(shí)也會(huì)保留在編譯好的.class文件中。但是在執(zhí)行時(shí),并不會(huì)把這一些信息加載到虛擬機(jī)(JVM)中去。這是Retention的默認(rèn)值。
- RUNTIME:表示在源碼、編譯好的.class文件中保留信息,同時(shí)在執(zhí)行時(shí)還會(huì)把這些信息加載到JVM中去。
- 舉例:@Override中的Retention值為SOURCE,編譯成功了就不要這一些檢查的信息。相反@Deprecated中的Retention的值為RUNTIME,表示除了在編譯時(shí)會(huì)警告我們使用哪個(gè)被Deprecated的方法,在執(zhí)行的時(shí)候也可以查出該方法是否被Deprecated。
1.3 注解的屬性
- 當(dāng)某個(gè)變量被聲明了,但是卻未被使用;或者某集合在聲明或者定義時(shí)未加泛型說明等情況發(fā)生時(shí),會(huì)在代碼下給出警告黃線。Ctrl + 1,可在代碼上添加一個(gè)注解@SuppressWarnings()。并且發(fā)現(xiàn),不同的情況下,其參數(shù)是不同的。
- 打開其源碼,看到其定義與@Deprecated是不同的,其接口中聲明了一個(gè)方法String[] value()。那么該注解在使用時(shí)必須包含一個(gè)屬性value,類型為String[]。且該參數(shù)沒有默認(rèn)值,即必須給出value的值。
- 對(duì)于注解的屬性,需要注意以下幾個(gè)問題:
1.3.1 數(shù)組問題
- 該屬性在源碼定義時(shí)被聲明為數(shù)組,但是在具體使用時(shí)卻只能夠賦予一個(gè)值,此時(shí)無需將該值再定義為一個(gè)數(shù)組后賦給該屬性。直接將該值賦給該屬性即可。例如,對(duì)于聲明為字符串?dāng)?shù)組String[]的value屬性,可以將字符串String直接賦給該value。
1.3.2 默認(rèn)值問題
- 若某屬性在注解定義時(shí)聲明了其默認(rèn)值,則在注解使用時(shí),可以不為其指定屬性值。注解會(huì)自動(dòng)使用其默認(rèn)值。
1.3.3 value屬性問題
- 若注解在使用時(shí)只需使用其value屬性,其他屬性要么有默認(rèn)值,要么該注解只聲明了一個(gè)value屬性,此時(shí),在注解使用時(shí)value屬性名稱可省略,而直接在注解的括號(hào)中寫出該value屬性的值。
1.3.4 無屬性問題
- 有些注解在定義時(shí),是沒有屬性的,如@Deprecated、@Override都是沒有屬性聲明的,那么在使用時(shí)只需要給出注解名稱即可。
2 MyBatis注解
2.1 @Insert
- 其value屬性用于指定喲啊執(zhí)行的insert語句;
2.2 @SelectKey
- 用于替換XML中的<selectKey/>標(biāo)簽,用于返回新插入數(shù)據(jù)的id值。
- statement:獲取新插入記錄主鍵值的SQL語句;
- keyProperty:獲取的該主鍵值返回后初始化對(duì)象的哪個(gè)屬性;
- resultType:返回值類型;
- before:指定主鍵的生成相對(duì)于insert語句的執(zhí)行先后順序,該屬性不能夠省略;
2.3 @Delete
- 其value屬性用于指定要執(zhí)行的delete語句。
2.4 @Update
- 其value屬性用于指定要執(zhí)行的update語句。
2.5 @Select
- 其value屬性用于指定要執(zhí)行的select語句。
3 程序舉例說明
3.1 修改Dao接口
-
在Dao接口的每個(gè)抽象方法上添加注解。
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/>注冊(cè)mapper的位置,需要使用<package/>標(biāo)簽。 <!-- 注冊(cè)映射文件 --> <mappers><package name="com.eason.mybatis.dao"/> </mappers>
轉(zhuǎn)載于:https://blog.51cto.com/12402717/2095563
總結(jié)
以上是生活随笔為你收集整理的SSM框架之MyBatis3专题5:MyBatis注解式开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NOI2014]动物园 【kmp】
- 下一篇: 基于 WebSocket 的 MQTT