什么是MyBatis的注解方式
MyBatis的注解方式就是將SQL語(yǔ)句直接寫(xiě)在接口上滩援。在MyBatis注解SQL中栅隐,最基本的就是@Select、@Insert、@Update和@Delete四種租悄。
MyBatis注解方式的優(yōu)缺點(diǎn)
-
優(yōu)點(diǎn)
對(duì)于需求比較簡(jiǎn)單的系統(tǒng)谨究,效率高。
-
缺點(diǎn)
當(dāng)SQL有變化時(shí)都需要重新編譯代碼泣棋,一般情況下不建議使用注解方式
基本注解
@Select 注解
@Results(id = "BaseResultMap", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "nickname", column = "nickname"),
@Result(property = "phone", column = "phone"),
@Result(property = "email", column = "email")
})
@Select({"select id, username, password, nickname, phone, email from `db_user` where id = #{key}"})
User selectUserByPrimaryKey(Long key);
-
@Select 注解
查詢(xún)相關(guān)的SQL寫(xiě)在@Select注解中胶哲,花括號(hào)里面的內(nèi)容可以是字符串也可以是字符串?dāng)?shù)組。
-
@Results潭辈、@Result 注解
@Results和@Result注解是結(jié)合起來(lái)用的鸯屿,@Result注解包含在@Results注解的
value
屬性中。-
@Results 注解
@Results 注解有兩個(gè)屬性萎胰,分別是
id
和value
碾盟。其中id
屬性對(duì)應(yīng)的是XML配置中resultMap標(biāo)簽的id
屬性,這樣只要在接口中寫(xiě)一次就可以公用一個(gè)resultMap了技竟。而value
屬性對(duì)應(yīng)的是XML配置中resultMap標(biāo)簽下的<id>
和<result>
標(biāo)簽冰肴,<id>
標(biāo)簽用id=true
屬性來(lái)確定。 -
@Result 注解
@Result 注解常用屬性
id
榔组、column
和property
熙尉。id
屬性是用來(lái)確定是否是id的,布爾類(lèi)型搓扯。column
屬性是對(duì)應(yīng)數(shù)據(jù)庫(kù)字段的检痰,字符串類(lèi)型。property
屬性是對(duì)應(yīng)JavaBean對(duì)象屬性的锨推,字符串類(lèi)型铅歼。
-
@ResultMap("BaseResultMap")
@Select({"select id, username, password, nickname, phone, email from `db_user`"})
List<User> selectAllUser();
-
@ResultMap 注解
@ResultMap 注解就一個(gè)作用,使用已經(jīng)定義好的@Results或XML配置里已經(jīng)寫(xiě)好的resultMap换可。里面的
value
屬性即是@Results的id
屬性值或XML里resultMap的id
屬性值椎椰。
@Insert 注解
@Insert({"insert into `db_user`(username, password, nickname, phone, email) values (#{username}, #{password}, #{nickname}, #{phone}, #{email})"})
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
-
@Insert 注解
添加相關(guān)的SQL寫(xiě)在@Insert注解中,花括號(hào)里面的內(nèi)容可以是字符串也可以是字符串?dāng)?shù)組沾鳄。
-
@Options 注解
當(dāng)添加操作需要返回自增主鍵時(shí)可以使用@Options注釋慨飘。添加屬性
useGeneratedKeys = true
和keyProperty = "id"
即可在數(shù)據(jù)添加后獲取添加數(shù)據(jù)的ID值。
@Delete 注解
@Delete({"delete from `db_user` where id = #{key}"})
int deleteUserByPrimaryKey(Long key);
刪除相關(guān)的SQL寫(xiě)在@Delete注解中译荞,花括號(hào)里面的內(nèi)容可以是字符串也可以是字符串?dāng)?shù)組瓤的。
@Update 注解
@Update({"update `db_user` set nickname = #{nickname} where id = #{id}"})
int updateUserByPrimaryKey(User user);
修改相關(guān)的SQL寫(xiě)在@Update注解中,花括號(hào)里面的內(nèi)容可以是字符串也可以是字符串?dāng)?shù)組吞歼。
Provider 注解
首先創(chuàng)建UserMapper接口圈膏,定義接口方法。然后創(chuàng)建UserProvider類(lèi)篙骡,在UserProvider類(lèi)中定義與接口中方法對(duì)應(yīng)的返回SQL語(yǔ)句的方法本辐。
Provider的注解中提供了兩個(gè)必填的屬性type
和method
桥帆。type
配置的是一個(gè)包含method
屬性指定方法的類(lèi)医增,這個(gè)類(lèi)必須有空的構(gòu)造方法慎皱,這個(gè)方法的值就是要執(zhí)行的SQL語(yǔ)句,并且method
屬性指定的方法的返回值必須是String類(lèi)型叶骨。
@InsertProvider
- UserProvider類(lèi)中的方法
public String insertUser(User user) {
return new SQL(){
{
INSERT_INTO("`db_user`");
INTO_COLUMNS("username, password, nickname, phone, email");
INTO_VALUES("#{username}, #{password}, #{nickname}, #{phone}, #{email}");
}
}.toString();
}
- UserMapper接口中的方法
@InsertProvider(type = UserProvider.class, method = "insertUser")
@Options(useGeneratedKeys = true)
int insertUser(User user);
@DeleteProvider
- UserProvider類(lèi)中的方法
public String deleteUserByPrimaryKey(Long key) {
return new SQL(){
{
DELETE_FROM("`db_user`");
WHERE("id = #{key}");
}
}.toString();
}
- UserMapper接口中的方法
@DeleteProvider(type = UserProvider.class, method = "deleteUserByPrimaryKey")
int deleteUserByPrimaryKey(Long key);
@UpdateProvider
- UserProvider類(lèi)中的方法
public String updateUserByPrimaryKey(User user) {
return new SQL(){
{
UPDATE("`db_user`");
SET("nickname = #{nickname}","username = #{username}","password = #{password}");
WHERE("id = #{id}");
}
}.toString();
}
- UserMapper接口中的方法
@UpdateProvider(type = UserProvider.class, method = "updateUserByPrimaryKey")
int updateUserByPrimaryKey(User user);
@SelectProvider
- UserProvider類(lèi)中的方法(這里順帶展示了2中返回SQL的方法)
public String selectUserByPrimaryKey(Long key) {
return new SQL(){
{
SELECT("id, username, password, nickname, phone, email");
FROM("`db_user`");
WHERE("id = #{key}");
}
}.toString();
}
public String selectAllUser() {
return "select id, username, password, nickname, phone, email from `db_user`";
}
- UserMapper接口中的方法
@Results(id = "BaseResultMap", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "nickname", column = "nickname"),
@Result(property = "phone", column = "phone"),
@Result(property = "email", column = "email")
})
@SelectProvider(type = UserProvider.class, method = "selectUserByPrimaryKey")
User selectUserByPrimaryKey(Long key);
@SelectProvider(type = UserProvider.class, method = "selectAllUser")
@ResultMap("BaseResultMap")
List<User> selectAllUser();
參考資料:MyBatis 從入門(mén)到精通 作者:劉增輝