当前使用版本(必填,否则不予处理)

mybatis-plus-boot-starter: 3.4.3.4

演示用的版本

该问题是如何引起的?(确定最新版也有问题再提!!!)

项目中Service层存在大量且散落在各处的Wrapper条件查询,影响代码可读性的同时使Service层和Mapper层的界限变得模糊不清,所以打算对代码进行整理或重构。

整理过程中发现使用JDK 8的接口默认方法可以将Wrapper条件代码下沉到Mapper层,保证Service层只需面向接口即可。

目前程序可正常运行,查询返回结果正确。但考虑到在MyBatis-Plus文档和他人的博客中基本没有介绍过这种写法。因此,想咨询一下使用默认方法来自定义Mapper方法是否合理?是否某些功能可能会出现类似于Spring注解事务中类内部调用事务方法不生效的情况?

重现步骤(如果有就写完整)

此处采用了官网文档快速开始的演示数据

UserMapper.java

public interface UserMapper extends BaseMapper<User> {

    /**
     * 查询年龄大于20的用户
     */
    default List<User> selectUserByAgeGreaterThanTwenty() {
        final int ageThreshold = 20;
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.gt(User::getAge, ageThreshold);

        return selectList(wrapper);
    }
}

UserService.java

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> findUserByAgeGreaterThanTwenty() {
        return userMapper.selectUserByAgeGreaterThanTwenty();
    }
}

测试用例

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testSelectHasMailUser() {
        List<User> users = userService.findUserByAgeGreaterThanTwenty();
        Assertions.assertTrue(CollectionUtils.isNotEmpty(users));

        for (User user : users) {
            System.out.println(user);
        }
    }
}

用例执行通过,打印结果为:

User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)

报错信息