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()));
}
}
在您的示例中,只需从父映射器中删除默认实现即可。
我尝试实现一个基础映射器接口:
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()));
}
}
在您的示例中,只需从父映射器中删除默认实现即可。