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方法类中,不要使用重载,也就是说,不要使用方法名相同参数不同的方法。