mybatis-book / book

MyBatis 从入门到精通
1.33k stars 579 forks source link

【Mapper】关于自定义的Mapper无法注入的问题 #11

Open nanzhang237420759 opened 7 years ago

nanzhang237420759 commented 7 years ago

1.DataScopeMapper

public interface DataScopeMapper<T> { 

    @SelectProvider(type = DataScopeProvider.class, method = "dynamicSQL")
    List<T> selectDataScope(@Param("entity") T object, @Param("offset") int offset, @Param("limit") int limit);
}
  1. DataScopeProvider

public class DataScopeProvider extends MapperTemplate {

public DataScopeProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
    super(mapperClass, mapperHelper); 
}

public String  selectDataScope(MappedStatement ms) {
     StringBuilder sql = new StringBuilder();
    Class<?> entityClass = getEntityClass(ms); 
    //修改返回值类型为实体类型
    setResultType(ms, entityClass);
    Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);  
    sql.append(SqlHelper.selectAllColumns(entityClass));
    sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));  
    return sql.toString();
}

}


3.扫描

bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">

    <!-- 通用Mapper通过属性注入进行配置,默认不配置时会注册Mapper<T>接口  -->
    <property name="properties">
        <value>
            mappers=tk.mybatis.mapper.common.Mapper,com.nxu.core.persistence.mybatis.DataScopeMapper
            IDENTITY=MYSQL 
        </value>
    </property>

</bean>

4.注入

@Autowired private DataScopeMapper dataScopeMapper;

5.报错

No qualifying bean of type [com.nxu.core.persistence.mybatis.DataScopeMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}



求解答,在线等,谢谢~
abel533 commented 7 years ago

DataScopeMapper<Org> 对应的Mapper 发出来看看。

nanzhang237420759 commented 7 years ago

DataScopeMapper 不应该就是那个接口么?

abel533 commented 7 years ago

必须有类似 OrgMapper extends Mapper<Org>, DataScopeMapper<Org>

为了方便一般都创建一个基础的 Mapper,如MyMapper<T> extends Mapper<T>, DataScopeMapper<T>,然后上面的可以改成: OrgMapper extends MyMapper<Org>

mappers 参数也可以只配置 MyMapper

nanzhang237420759 commented 7 years ago

反应过来,是这样的。我的错。 解决方法是

public interface OrgMapper extends DataScopeMapper<Org>,Mapper<Org> {

    public List<Org>  findEntityListByDataScope(Org entity);

}

@abel533 谢谢大神。

abel533 commented 7 years ago

你不觉得这样比QQ交流快吗?