Mybatis的原身是ibatis,現在已經脫離了apache基金會,新官網是http://www.mybatis.org/。Mybatis3中增加了使用注解來配置Mapper的新特性,這里主要介紹@SelectProvider、@UpdateProvider、@InsertProvider和@DeleteProvider的使用方式
這幾個注解聲明在Mapper對應的interface的方法上的,注解用於生成查詢用的sql語句。如果對應的Mapper中已使用@Param來注解參數,則在對應的Prodiver的方法中無需寫參數。
注解中的參數:
type參數指定的Class類,必須要能夠通過無參的構造函數來初始化;
method參數指定的方法,必須是public的,返回值必須為String,可以為static。
一、@SelectProvider
@ResultMap注解用於從查詢結果集RecordSet中取數據然后拼裝實體bean。
public interface UserMapper { @SelectProvider(type = SqlProvider.class, method = "selectUser") @ResultMap("userMap") public User getUser(long userId); }
public class SqlProvider { public String selectUser(long userId){ SELECT("id, name, email"); FROM("USER"); WHERE("ID = #{userId}"); } }
上例中定義了一個Mapper接口,其中定義了一個getUser方法,這個方法根據用戶id來獲取用戶信息,並返回相應的User。而對應的SQL語句則寫在SqlProvider類中。
二、@InsertProvider
public interface UserMapper { @InsertProvider(type = SqlProvider.class, method = "addUser") @Options(useGeneratedKeys = true, keyProperty = "id") int addUser(Tutor tutor); }
public class SqlProvider { public String addUser(User user) { return new SQL() { { INSERT_INTO("USER"); if (user.getName() != null) { VALUES("NAME", "#{name}"); } if (user.getEmail() != null) { VALUES("EMAIL", "#{email}"); } } }.toString(); } }
三、@UpdateProvider
public interface UserMapper { @UpdateProvider(type = SqlProvider.class, method = "updateUser") int updateUser(User user); }
public class SqlProvider { public String updateUser(User user) { return new SQL() { { UPDATE("USER"); if (user.getName() != null) { SET("NAME = #{name}"); } if (user.getEmail() != null) { SET("EMAIL = #{email}"); } WHERE("ID= #{id}"); } }.toString(); } }
四、@DeleteProvider
public interface UserMapper { @DeleteProvider(type = SqlProvider.class, method = "deleteUser") int deleteUser(int id); }
public class SqlProvider { public String deleteUser(int id) { return new SQL() { { DELETE_FROM("USER"); WHERE("ID= #{id}"); } }.toString(); } }
注意:在Mapper接口和@SelectProvide方法類中,不要使用重載,也就是說,不要使用方法名相同參數不同的方法。