Mybatis的动态SQL,用到的场景并不多,毕竟在xml文件中定义sql语句的方式,已经可以满足绝大部分的开发需求。
@Provider系列的注解有四个:
· @SelectProvider,被定义用来提供查询方法的SQL;
· @UpdateProvider,被定义用来提供更新方法的SQL;
· @DeleteProvider,被定义用来提供删除方法的SQL;
· @InsertProvider,被定义用来提供保存方法的SQL;
例子
public interface UserMapper {
@InsertProvider(type = SqlProvider.class, method = "insert")
void insert(User user);
public static class SqlProvider {
// 对应@InsertProvider注解里的method,返回对应sql
public static String insert() {
return "INSERT INTO users (id, name) VALUES(#{id}, #{name})";
}
}
}
Provider里方法的参数,可以和Mapper参数一致,也可以比Mapper少。引用Mapper的参数,主要是为了进行逻辑分支判定。
在Mapper对应的方法上,根据具体类型,选择注解。如果是更新语句,就使用@UpdateProvider,参数提供了具体的类和方法,供后续执行反射方法。
如果既有Provider,又有xml方法映射,Mybatis在启动时就会报错。
nested exception is java.lang.IllegalArgumentException: Mapped Statements collection already contains value for SqlProvider