@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider
分别是 mybatis 定义的 另类增删改查注解
总结一
最近来了新东家,不想写xml,所以写动态sql,用Mybatis的提供的动态语句发现了一个坑
我一开始是这样写的
@SelectProvider(type = MesCrudeProvider.class,method = "listByCondition")
List<MesCrude> selectListByCondition(@Param("title") String title,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize,@Param("type") Integer type);
public String listByCondition(@Param("title") String title, @Param("pageIndex") Integer pageIndex, @Param("pageSize") Integer pageSize,@Param("type") Integer type){
return new SQL(){
{
SELECT("*");
FROM("mes_crude");
if(StringUtils.isNotEmpty(title)){
WHERE("title like \"%\"#{title}\"%\"");
}
AND().WHERE("type=#{type} limit #{pageIndex},#{pageSize}");
}
}.toString();
}
然后一直报错
Caused by: org.apache.ibatis.builder.BuilderException: Error creating SqlSource for SqlProvider. Method 'listByCondition' not found in SqlProvider 'com.info315.files.dao.mysql.provider.MesCrudeProvider'.
at org.apache.ibatis.builder.annotation.ProviderSqlSource.<init>(ProviderSqlSource.java:57)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.getSqlSourceFromAnnotations(MapperAnnotationBuilder.java:408)
... 50 more
找了好久终于知道什么问题了
原因是新东家的mybatis包是3.2的
请看源码
参数只能为一个!!!坑死我了!!
然后改成这个以后就好了。。。。
@SelectProvider(type = MesCrudeProvider.class,method = "selectListByCondition")
List<MesCrude> selectListByCondition(HashMap<String,Object> params);
mybatis 3.4以上版本就支持多参数了!!!切记切记!!!
总结二
如何根据注解定义 sql 语句呢, 首先定义 mapper 接口
有三点需要注意:
- 方法入参必须为 Map
- 方法的权限修饰符 必须是 public
- 方法返回的必须是拼接好的 sql 字符串
@Param() 为必须, 在解析时会将参数定义为 map, 进行调用指定 method (多个从参数时使用这个注解比较号)划重点,小本本拿出来!
public interface AutoConstructorMapper {
@SelectProvider(type = SubjectSqlProvider.class, method = "getSubjectTestProvider")
PrimitiveSubject getSubjectTestProvider(@Param("id") int id);
}
创建 type 对应的存放 sql 语句的类, 以及定义返回 sql 语句的方法(方法必须是一个参数,参考总结一)
public class SubjectSqlProvider {
public String getSubjectTestProvider(Map<String, Object> params) {
return new SQL()
.SELECT("*")
.FROM("subject")
.WHERE("id = " + params.get("id"))
.toString();
}
}
SQL 类是 mybatis 提供开发者在代码中灵活编写 sql 语句的工具类