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

时间:2018-11-19 16:07:55

标签: mybatis ibatis spring-mybatis

我尝试实现基本的映射器接口:

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界面中取消注释此行时,它会起作用:

这有效:

@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);
}

这是什么错误?

1 个答案:

答案 0 :(得分:1)

在mybatis中,映射器are invoked的默认方法直接使用,这是一项功能。它们不应在xml映射中进行映射,其想法是在更特定的方法中重用某些通用的映射器方法,这些方法返回相同的数据,但格式不同,等等:

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()));
  }
}

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