MyBatis 没有实现父接口/基映射器的默认方法

MyBatis doesn't implement default methods of parent interface / base mapper

我尝试实现一个基础映射器接口:

public interface IDAOBase<T, ID> {

    default List<T> findAll() {
        throw new RuntimeException("Method not implemented !");
    }

    default T findById(ID id) {
        throw new RuntimeException("Method not implemented !");
    }

    default ID insert(T t) {
        throw new RuntimeException("Method not implemented !");
    }

    default T update(T t) {
        throw new RuntimeException("Method not implemented !");
    }

    default void delete(ID id) {
        throw new RuntimeException("Method not implemented !");
    }

    default T getRowById(ID id) {
        throw new RuntimeException("Method not implemented !");
    }

}

这将是一个扩展基本接口的映射器:

@Mapper
interface UserMapper extends IDAOBase<UserVO, Long> {

    UserVO findByUsername(String username);
    // UserVO findById(Long id);
}

我这样调用映射器:

@Autowired
private UserMapper mapper;

public UserDetails loadUserById(Long id) {
    return loadUser(mapper.findById(id));
}

但是我从默认方法中抛出一个 RuntimeException:

java.lang.RuntimeException: Method not implemented !
    at com.project.services.IDAOBase.findById(IDAOBase.java:8)

在 xml 我有 "findById" 方法:

<select id="findById"
        resultType="UserVO">
    <include refid="baseSelect"/>
    where
        k.id = #{id}
</select>

还有;当我在映射器界面中取消注释这一行时,它起作用了:

这个有效:

@Mapper
interface UserMapper extends IDAOBase<UserVO, Long> {

    UserVO findByUsername(String username);
    UserVO findById(Long id);
}

这行不通:

@Mapper
interface UserMapper extends IDAOBase<UserVO, Long> {

    UserVO findByUsername(String username);
    // UserVO findById(Long id);
}

这里有什么错误?

在mybatis默认的映射器方法中are invoked直接,这是一个特性。它们不应映射到 xml 映射中,其想法是在 return 相同数据但格式不同等更具体的方法中重用一些通用映射器方法:

public interface MyMapper {

  List<MyObject> getByIds(List<Long> ids);

  default MyObject getById(Long id) {
    List<MyObject> list = getByIds(Arrays.asList(id));
    // checks
    return list.get(0);
  }


  List<MyObject> getAll();

  default Map<Long, MyObject> getAllAsMap() {
   return getAll().stream().collect(
       Collectors.toMap(MyObject::getId, Functions.identity()));
  }
}

在您的示例中,只需从父映射器中删除默认实现即可。