我尝试实现基本的映射器接口:
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);
}
这是什么错误?
答案 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()));
}
}
在您的示例中,只需从父映射器中删除默认实现即可。